使用Python获取Wikipedia文章

时间:2008-09-23 09:37:22

标签: python urllib2 user-agent wikipedia http-status-code-403

我尝试使用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 

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

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

10 个答案:

答案 0 :(得分:51)

您需要使用urllib2中取代urllibpython 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 请求。