有没有比urlgrabber更好的Python远程URL抓取库?
我正在写一个爬虫,需要一个叫做 load_url
的功能,具体要求如下:
- 如果遇到临时错误,要能重试这个网址,而且不能让错误信息泄露出去。
- 不能造成内存或文件句柄的泄漏。
- 可以使用 HTTP-KeepAlive 来提高速度(这个是可选的)。
URLGrabber 看起来很不错,但实际上有些问题。我第一次遇到的问题是打开的文件太多了,不过我通过关闭 Keep-Alive 解决了这个问题。然后,函数开始抛出一个 socket.error: [Errno 104] Connection reset by peer
的错误。这个错误应该被捕获,并且可能应该抛出一个 URLGrabberError 来替代。
我使用的是 Python 2.6.4。
有没有人知道怎么解决 URLGrabber 的这些问题,或者有没有其他库可以实现我需要的功能?
5 个回答
0
Scrapy听起来很不错,我会考虑在未来使用它。不过对于这个项目,我现在真的只想要一个简单的功能,正如上面所说的那样。我已经创建了一个,看起来可以完成这个任务。
import urllib2
class HttpLoadError(RuntimeError):
pass
class Http404(HttpLoadError):
pass
class HttpFailedRepeatedly(HttpLoadError):
pass
def safeurlopen(url):
import time
i = 0
while True:
i += 1
try:
return urllib2.urlopen(url)
except (urllib2.HTTPError, socket.error), e:
if getattr(e, 'code', '') == 404:
raise Http404
if i >= 10:
raise HttpFailedRepeatedly(e)
time.sleep(30)
def safeurlopenandread(url):
rh = safeurlopen(url)
res = rh.read()
rh.close()
return res
0
可以看看Harvestman爬虫使用的方法,这些方法可能很值得研究。
4
如果你正在写一个网络爬虫或者网页抓取工具,你可能会想看看一个专门的框架,比如scrapy。
你可以用很少的代码写出相当复杂的网络爬虫:这个框架会处理所有繁琐的细节,比如安排请求的时间和把结果反馈给你,让你可以按照需要处理这些结果(它是基于twisted的,但把所有的实现细节都很好地隐藏起来了)。