我正在编写一个需要load_url
函数的蜘蛛,它可以为我执行以下操作:
URLGrabber表面看起来很棒,但它有麻烦。第一个我打开了太多文件的问题,但我能够通过关闭keep-alive来解决这个问题。然后,该函数开始引发socket.error: [Errno 104] Connection reset by peer
。应该捕获该错误,并且可能会引发URLGrabberError。
我正在运行python 2.6.4。
是否有人知道使用URLGrabber修复这些问题的方法,或者知道使用其他库完成我需要的其他方法?
答案 0 :(得分:4)
如果您正在编写Web爬虫/屏幕抓取工具,您可能有兴趣查看专用框架,例如scrapy。
你可以用非常少的代码编写非常复杂的网络抓取工具:它会处理调度请求的所有血腥细节,并回调你的结果,以便你以任何你需要的方式处理(它基于扭曲但是它很好地隐藏了所有的实现细节。
答案 1 :(得分:0)
屏幕刮?查看BeautifulSoup
答案 2 :(得分:0)
对于Python中的屏幕抓取,还有Scrapy,但我不知道这是否符合您的要求。
答案 3 :(得分: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
答案 4 :(得分:0)
Harvestman crawler采用的方法值得研究。