当我使用python打开URL(维基百科)时,为什么会得到“ERR_ACCESS_DENIED”?

时间:2012-02-06 12:18:58

标签: python python-2.7 web-scraping urllib2

这是我在这里发布的第一个问题,所以我可能会为新手寻找一点遗憾。

我正在为高中的计算机科学课学习Python,所以我几乎没有使用它来解决问题的经验。现在,我正在处理从维基百科中的随机页面到目标页面(也在Wiki中)的内容,方法是按照每个页面上的链接进行操作。这是我第一次使用urllib这样的东西,所以到目前为止我只用了老师告诉我使用的东西。

我有一些应该能够在Wiki中打开页面的代码,但是我一直在想出一个关于技术错误的页面。不过,从浏览器打开维基百科是可以的。

我不知道我需要什么才能让它发挥作用,我不知道在哪里可以想出这个。

我的代码(使用Python 2.7在Ubuntu 11.04中使用IDLE):

import urllib
import HTMLParser

class Parser(HTMLParser.HTMLParser):
    def handle_starttag(self, tag, attrs):
        print("Start:", tag, attrs)

    def handle_endtag(self, tag):
        print("End:", tag)
    def handle_data(self, data):
        print ("Data:", data)

#proxy = {"http": "http://10.102.0.3:3128"}
browser = urllib.FancyURLopener()#(proxies = proxy)
    #The commented-out stuff is for the proxy at school.
    #Both at home and at school, I come up with errors.
f = browser.open("http://en.wikipedia.org/wiki/Special:Random")
p = Parser()
print p.feed(f.read())

我的输出如下:

('数据:','\ n') ('开始:','html',[('xmlns','http://www.w3.org/1999/xhtml'),('xml:lang','en'),('lang',成 'en')]) ('数据:','\ n') ('开始:','头',[]) ('数据:','\ n') ('开始:','标题',[]) ('数据:','维基媒体错误') ('结束:','标题') ('数据:','\ n') ('开始:','元',[('http-equiv','内容类型'),('内容','text / html; charset = UTF-8')]) ('结束:','meta') ('数据:','\ n') ('开始:','meta',[('name','author'),('content','Mark Ryan')]) ('结束:','meta') ('数据:','\ n') ('开始:','meta',[('name','copyright'),('content','(c)2005-2007 Mark Ryan等。根据GNU自由文档许可证授权的文本。{{3 }}')]) ('结束:','meta') ('数据:','\ n \ n') ('开始:','风格',[('type','text / css')]) ('数据:','\ n') ('结束:','风格') ('数据:','\ n') ('开始:','脚本',[]) ('数据:','// \ n \ t功能行{\ n \ t \ t变换c = s.split(\'\'); \ n \ t \ t for(var i = 0; i< ; c.length; i ++){\ n \ t \ t \ t \ tdocument.write(\'') ('结束:','div') ('数据:',''); \ n \ t \ t} \ n \ t} \ n //]]>“) ('结束:','脚本') ('数据:','\ n') ('结束:','头') ('数据:','\ n \ n') ('开始:','正文',[('链接','#24442E'),('文字','#000000'),('vlink','#24442E'),('alink',' #FF0000' )]) ('数据:','\ n') ('开始:','h1',[]) ('数据:','维基媒体基金会') ('结束:','h1') ('数据:','\ n') ('开始:','脚本',[]) ('数据:','行('ccd4cf bdc3bf adb1af 9ea09f dbe5df');“) ('结束:','脚本') ('数据:','\ n \ n') ('开始:','h2',[]) ('数据:','错误') ('结束:','h2') ('数据:','\ n \ n') ('开始:','脚本',[]) ('数据:',“行('8f8f8f acacac c6c6c6 dbdbdb eaeaea f4f4f4');”) ('结束:','脚本') ('数据:','\ n \ n') ('数据:','\ n') ('开始:','div',[('class','ContentArea')]) ('数据:','\ n \ n') ('开始:','div',[('id','en'),('lang','en')]) ('数据:','\ n') ('开始:','p',[]) ('数据:','我们的服务器目前遇到技术问题。这可能是暂时的,应尽快解决。请') ('开始:','a',[('href','http://en.wikipedia.org/wiki/Special:Random'),('onclick','window.location.reload(false); return false')]) ('数据:','再试一次') ('结束:','a') ('数据:','在几分钟内。') ('结束:','p') ('数据:','\ n') ('开始:','p',[]) ('数据:','你或许可以获得更多信息') ('开始:','a',[('href','irc://chat.freenode.net/wikipedia')]) ('数据:','#wikipedia') ('结束:','a') ('数据:','通道') ('开始:','a',[('href','http://www.freenode.net')]) ('数据:','Freenode IRC网络') ('结束:','a') ('数据:','。') ('结束:','p') ('数据:','\ n') ('开始:','p',[]) ('数据:','维基媒体基金会是一个非营利性组织,主持互联网上一些最受欢迎的网站,包括维基百科。它一直需要购买新硬件。如果你想提供帮助,请' ) ('开始:','a',[('href','http://wikimediafoundation.org/wiki/Fundraising')]) ('数据:','捐赠') ('结束:','a') ('数据:','。') ('结束:','p') ('数据:','\ n') ('开始:','hr',[('noshade','noshade'),('size','1px'),('width','80%')]) ('结束:','hr') ('数据:','\ n') ('开始:','div',[('class','TechnicalStuff')]) ('数据:','\ n如果您向维基媒体系统管理员报告此错误,请在下面提供详细信息。') ('开始:','br',[]) ('结束:','br') ('数据:','\ n') ('结束:','div') ('数据:','\ n') ('开始:','div',[('class','TechnicalStuff')]) ('数据:','\ n') ('开始:','bdo',[('dir','ltr')]) ('数据:','\ n请求:获取http://www.gnu.org/licenses/fdl.txt,从112.205.80.8经sq72.wikimedia.org(squid / 2.7.STABLE9)到()') ('开始:','br',[]) ('结束:','br') ('数据:','\ n错误:ERR_ACCESS_DENIED,错误[无错误]周一,2012年2月6日11:58:50 GMT \ n') ('结束:','bdo') ('数据:','\ n') ('结束:','div') ('数据:','\ n') ('结束:','div') ('数据:','\ n \ n') ('结束:','div') ('数据:','\ n') ('开始:','脚本',[]) ('数据:',“行('9ea09f adb1af bdc3bf ccd4cf');”) ('结束:','脚本') ('数据:','\ n \ n') ('结束:','身体') ('数据:','\ n') ('结束:','html') ('数据:','\ n \ n') 无

3 个答案:

答案 0 :(得分:1)

尝试使用urllib2并添加此类标题。至少你不会得到403))和你的情况

 opener = urllib2.build_opener()
 opener.addheaders = [('User-agent', 'Mozilla/5.0')]
 f = opener.open("http://en.wikipedia.org/wiki/Special:Random")

而不是

f = browser.open("http://en.wikipedia.org/wiki/Special:Random")

并且不要忘记导入库。祝你好运!

答案 1 :(得分:1)

考虑使用实际的API。 试试这个:

import urllib2
urllib2.urlopen("http://en.wikipedia.org//w/api.php?action=parse&format=txt&page=**Your_Page_Here**&prop=text"

它应该返回文章文本的HTML文档。

答案 2 :(得分:0)

确保伪造用户代理。维基百科不喜欢Python或Perl,因此任何以“lwp”或“python-urllib”开头的用户代理都会遇到“临时”的“技术问题”。

eviltnan提供的代码就是这样做的。但他并没有真正说明他伪造用户代理的原因,所以我想指出在访问大多数网站时通常没有必要,但在访问维基百科时是必要的。