为什么用Python打开URL(维基百科)时会出现"ERR_ACCESS_DENIED"?
这是我第一次在这里发问,所以可能需要一点对新手的同情。
我在高中上计算机科学课,正在学习Python,所以对用它解决问题的经验不多。目前我在做一个项目,目的是通过每个页面上的链接,从维基百科的随机页面跳转到一个目标页面。这是我第一次使用像urllib这样的东西,所以我只在用老师告诉我的方法。
我写了一些代码,应该能打开维基百科的页面,但我总是遇到一个说有技术错误的页面。不过,从浏览器打开维基百科是没问题的。
我不知道该怎么做才能让它正常工作,也不知道该去哪里找答案。
我的代码(在Ubuntu 11.04上使用Python 2.7的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') ('开始:', 'head', []) ('数据:', '\n') ('开始:', 'title', []) ('数据:', 'Wikimedia错误') ('结束:', 'title') ('数据:', '\n') ('开始:', 'meta', [('http-equiv', 'Content-Type'), ('content', '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自由文档许可证授权。http://www.gnu.org/licenses/fdl.txt')]) ('结束:', 'meta') ('数据:', '\n\n') ('开始:', 'style', [('type', 'text/css')]) ('数据:', '\n') ('结束:', 'style') ('数据:', '\n') ('开始:', 'script', []) ('数据:', '//\n\tfunction lines(s) {\n\t\tvar c = s.split(\' \');\n\t\tfor (var i = 0; i < c.length; i++) {\n\t\t\tdocument.write(\'') ('结束:', 'div') ('数据:', "');\n\t\t}\n\t}\n//]]>") ('结束:', 'script') ('数据:', '\n') ('结束:', 'head') ('数据:', '\n\n') ('开始:', 'body', [('link', '#24442E'), ('text', '#000000'), ('vlink', '#24442E'), ('alink', '#FF0000')]) ('数据:', '\n') ('开始:', 'h1', []) ('数据:', '维基媒体基金会') ('结束:', 'h1') ('数据:', '\n') ('开始:', 'script', []) ('数据:', "lines('ccd4cf bdc3bf adb1af 9ea09f dbe5df');") ('结束:', 'script') ('数据:', '\n\n') ('开始:', 'h2', []) ('数据:', '错误') ('结束:', 'h2') ('数据:', '\n\n') ('开始:', 'script', []) ('数据:', "lines('8f8f8f acacac c6c6c6 dbdbdb eaeaea f4f4f4');") ('结束:', 'script') ('数据:', '\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') ('数据:', '频道找到更多信息。') ('结束:', '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请求: GET http://en.wikipedia.org/wiki/Special:Random, 来自112.205.80.8通过sq72.wikimedia.org (squid/2.7.STABLE9)到()') ('开始:', 'br', []) ('结束:', 'br') ('数据:', '\n错误: ERR_ACCESS_DENIED, errno [无错误] 于2012年2月6日星期一11:58:50 GMT\n') ('结束:', 'bdo') ('数据:', '\n') ('结束:', 'div') ('数据:', '\n') ('结束:', 'div') ('数据:', '\n\n') ('结束:', 'div') ('数据:', '\n') ('开始:', 'script', []) ('数据:', "lines('9ea09f adb1af bdc3bf ccd4cf');") ('结束:', 'script') ('数据:', '\n\n') ('结束:', 'body') ('数据:', '\n') ('结束:', 'html') ('数据:', '\n\n') None
3 个回答
确保你伪造你的用户代理。维基百科不喜欢Python或Perl,所以任何以“lwp”或“python-urllib”开头的用户代理都会遇到“临时”的“技术问题”。
eviltnan提供的代码就是这么做的。他没有具体说明为什么要伪造用户代理,不过我想指出,通常在访问大多数网站时并不需要这样做,但在访问维基百科时是必须的。
考虑使用实际的API(应用程序接口)。
可以试试这个:
import urllib2
urllib2.urlopen("http://en.wikipedia.org//w/api.php?action=parse&format=txt&page=**Your_Page_Here**&prop=text"
这样做应该会返回一份包含文章内容的HTML文档。
试着使用 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")
别忘了导入这个库哦。祝你好运!