有没有比urlgrabber更好的库来获取python中的远程URL?

时间:2010-01-11 08:29:37

标签: python screen-scraping

我正在编写一个需要load_url函数的蜘蛛,它可以为我执行以下操作:

  1. 如果出现临时错误,请重试该网址,不会泄露例外情况。
  2. 不泄漏内存或文件句柄
  3. 使用HTTP-KeepAlive获取速度(可选)
  4. URLGrabber表面看起来很棒,但它有麻烦。第一个我打开了太多文件的问题,但我能够通过关闭keep-alive来解决这个问题。然后,该函数开始引发socket.error: [Errno 104] Connection reset by peer。应该捕获该错误,并且可能会引发URLGrabberError。

    我正在运行python 2.6.4。

    是否有人知道使用URLGrabber修复这些问题的方法,或者知道使用其他库完成我需要的其他方法?

5 个答案:

答案 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采用的方法值得研究。