我尝试使用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
维基百科似乎阻止了非标准浏览器的请求。
有人知道如何解决这个问题吗?
答案 0 :(得分:51)
您需要使用urllib2中取代urllib的python std library来更改用户代理。
直接从examples
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()
答案 1 :(得分:36)
这不是特定问题的解决方案。但是,您可能需要使用mwclient库(http://botwiki.sno.cc/wiki/Python:Mwclient)来代替。那会容易得多。特别是因为您将直接获取文章内容,这使您无需解析html。
我自己用它来做两个项目,效果很好。
答案 2 :(得分:15)
您应该考虑使用他们的High-Level API。
,而不是试图欺骗维基百科答案 3 :(得分:3)
如果您正在尝试访问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's FAQ。
答案 4 :(得分:2)
我用于任何网站的一般解决方案是使用Firefox访问该页面,并使用Firebug等扩展程序记录HTTP请求的所有详细信息,包括任何cookie。
在你的程序中(在这种情况下是在Python中)你应该尝试发送一个类似于必要的HTTP请求到一个可以使用Firefox的HTTP请求。这通常包括设置User-Agent,Referer和Cookie字段,但可能还有其他字段。
答案 5 :(得分:2)
requests
太棒了!
以下是使用requests
获取html内容的方法:
import requests
html = requests.get('http://en.wikipedia.org/w/index.php?title=Albert_Einstein&printable=yes').text
完成!
答案 6 :(得分:1)
尝试将您在请求中发送的用户代理标头更改为: 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)
答案 7 :(得分:1)
您无需模拟浏览器用户代理;任何用户代理都可以工作,而不是空白。
答案 8 :(得分:0)
import urllib
s = urllib.urlopen('http://en.wikipedia.org/w/index.php?action=raw&title=Albert_Einstein').read()
这似乎对我有用而无需更改用户代理。没有“action = raw”,它对我不起作用。
答案 9 :(得分:0)
使用?printable=yes
请求页面可以为您提供完整相对干净的HTML文档。 ?action=render
只为您提供正文HTML。请求使用action=parse
通过MediaWiki操作API解析页面同样会为您提供正文HTML,但如果您想要更精细的控制see parse API help则会很好。
如果你只是想要页面HTML以便你可以渲染它,那么使用新的RESTBase API会更快更好,它会返回页面的缓存HTML表示。在这种情况下,https://en.wikipedia.org/api/rest_v1/page/html/Albert_Einstein。
截至2015年11月,您不必设置用户代理,而是it's strongly encouraged。此外,几乎所有维基媒体wiki require HTTPS,所以避免301重定向并发出http s 请求。