我尝试使用Python的urllib获取维基百科文章:

f = urllib.urlopen("http://en.wikipedia.org/w/index.php?title=Albert_Einstein&printable=yes")           
s = f.read()
f.close()

然而,我得到以下回应而不是html页面:错误 - 维基媒体基金会:

Request: GET http://en.wikipedia.org/w/index.php?title=Albert_Einstein&printable=yes, from 192.35.17.11 via knsq1.knams.wikimedia.org (squid/2.6.STABLE21) to ()
Error: ERR_ACCESS_DENIED, errno [No Error] at Tue, 23 Sep 2008 09:09:08 GMT 

维基百科似乎阻止了非标准浏览器的请求。

有人知道如何解决这个问题吗?

有帮助吗?

解决方案

您需要使用超出 urllib2 urllib “noreferrer”> python std库以更改用户代理。

直接来自示例

import urllib2
opener = urllib2.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
infile = opener.open('http://en.wikipedia.org/w/index.php?title=Albert_Einstein&printable=yes')
page = infile.read()

其他提示

这不是特定问题的解决方案。但是您可能需要使用mwclient库( http://botwiki.sno.cc/ wiki / Python:Mwclient )。那会容易得多。特别是因为您将直接获取文章内容,这使您无需解析html。

我自己用它来做两个项目,效果很好。

您应该考虑使用他们的高级API ,而不是尝试欺骗维基百科。

如果您正在尝试访问Wikipedia内容(并且不需要有关页面本身的任何特定信息),而不是使用api,您应该使用'action = raw'调用index.php以获取wikitext,如:

'http://en.wikipedia.org/w/index.php的行动=原始&安培;标题= Main_Page'

或者,如果您需要HTML代码,请使用'action = render',如:

'http://en.wikipedia.org/w/index.php的行动=呈现&安培;标题= Main_Page'

您还可以定义一个部分,只使用“section = 3”等内容获取部分内容。

然后,您可以使用urllib2模块访问它(在所选答案中为sugested)。 但是,如果您需要有关页面本身的信息(例如修订版),那么您最好使用上面提到的mwclient。

如果您需要更多信息,请参阅 MediaWiki的常见问题解答

我用于任何网站的一般解决方案是使用Firefox访问该页面,并使用Firebug等扩展程序记录HTTP请求的所有详细信息,包括任何cookie。

在你的程序中(在这种情况下是在Python中)你应该尝试发送一个类似于必要的HTTP请求到一个可以使用Firefox的HTTP请求。这通常包括设置User-Agent,Referer和Cookie字段,但可能还有其他字段。

requests 真棒!

以下是使用 requests 获取html内容的方法:

import requests
html = requests.get('http://en.wikipedia.org/w/index.php?title=Albert_Einstein&printable=yes').text

完成!

尝试将您在请求中发送的用户代理标头更改为: User-Agent:Mozilla / 5.0(X11; U; Linux i686; en-US; rv:1.9.0.1)Gecko / 2008072820 Ubuntu / 8.04(hardy)Firefox / 3.0.1(Linux Mint)

您无需模拟浏览器用户代理;任何用户代理都可以工作,而不是空白。

import urllib
s = urllib.urlopen('http://en.wikipedia.org/w/index.php?action=raw&title=Albert_Einstein').read()

这似乎对我有用而无需更改用户代理。没有“action = raw”它对我不起作用。

请求 ?printable = yes 为您提供完整相对干净的HTML文档。 ?action = render 为您提供正文HTML 。请求使用 action = parse 同样为你提供了身体HTML,但如果你想要更好的控制,那将会很好,请参阅解析API帮助

如果你只是想要页面HTML以便你可以渲染它,那么使用新的 RESTBase API,它返回页面的缓存HTML表示形式。在这种情况下, https://en.wikipedia.org/api/rest_v1/page / HTML / Albert_Einstein

截至2015年11月,您不必设置用户代理,但强烈鼓励它。此外,几乎所有维基媒体维基百科需要HTTPS ,请避免301重定向并发出http s 请求。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top