1

我正在尝试使用 urllib2 和 BeautifulSoup 抓取网页。它工作正常,然后当我在input()代码的不同部分中尝试调试某些东西时,我得到了一个 HTTPError。当我再次尝试运行我的程序时,尝试调用 read() 时出现 HTTPError。错误堆栈如下:

[2013-07-17 16:47:07,415: ERROR/MainProcess] Task program.tasks.testTask[460db7cf-ff58-4a51-9c0f-749affc66abb] raised exception: IOError()
16:47:07 celeryd.1 | Traceback (most recent call last):
16:47:07 celeryd.1 |   File "/Users/username/folder/server2/venv/lib/python2.7/site-packages/celery/execute/trace.py", line 181, in trace_task
16:47:07 celeryd.1 |     R = retval = fun(*args, **kwargs)
16:47:07 celeryd.1 |   File "/Users/username/folder/server2/program/tasks.py", line 193, in run
16:47:07 celeryd.1 |     self.get_top_itunes_game_by_genre(genre)
16:47:07 celeryd.1 |   File "/Users/username/folder/server2/program/tasks.py", line 244, in get_top_itunes_game_by_genre
16:47:07 celeryd.1 |     game_page = BeautifulSoup(urllib2.urlopen(game_url).read())
16:47:07 celeryd.1 |   File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 126, in urlopen
16:47:07 celeryd.1 |     return _opener.open(url, data, timeout)
16:47:07 celeryd.1 |   File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 400, in open
16:47:07 celeryd.1 |     response = meth(req, response)
16:47:07 celeryd.1 |   File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 513, in http_response
16:47:07 celeryd.1 |     'http', request, response, code, msg, hdrs)
16:47:07 celeryd.1 |   File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 438, in error
16:47:07 celeryd.1 |     return self._call_chain(*args)
16:47:07 celeryd.1 |   File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 372, in _call_chain
16:47:07 celeryd.1 |     result = func(*args)
16:47:07 celeryd.1 |   File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 521, in http_error_default
16:47:07 celeryd.1 |     raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
16:47:07 celeryd.1 | HTTPError

这是代码:

for game_url in urls:    
    game_page = BeautifulSoup(urllib2.urlopen(game_url).read())
    # code to process page

有谁知道我为什么开始收到这个错误?谢谢!

4

1 回答 1

1

将我的评论更改为答案:

您正在抓取的页面(很可能)响应为 4xx 响应,并且 urllib2 引发 HTTPError,正如它在docs中所说的那样。捕获该异常并(希望)对其进行处理,记录它或您拥有什么是您的工作。无论出于何种原因,您的回溯都不会显示 HTTPError 的代码/原因,但它就在那里。查看错误的“代码”和“原因”属性。

社论:您正在抓取的网站可能会发现您是机器人。您可能想花点时间重写您的爬虫,以使用对服务器更友好(以及更好的 API)的库。urllib2 适用于一次性任务,但它有许多缺点,我不会在这里讨论。可能要查看的高级库是requestsmechanize,也许是httplib2。都有优点/缺点,所以我不能告诉你哪个适合你的需要。

您可能还想查看您在请求中发送的用户代理标头,因为如果您自我识别为机器人,那么。是的。

于 2013-07-18T00:47:27.947 回答