有没有比urlgrabber更好的Python远程URL抓取库?

2 投票
5 回答
908 浏览
提问于 2025-04-15 17:53

我正在写一个爬虫,需要一个叫做 load_url 的功能,具体要求如下:

  1. 如果遇到临时错误,要能重试这个网址,而且不能让错误信息泄露出去。
  2. 不能造成内存或文件句柄的泄漏。
  3. 可以使用 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的,但把所有的实现细节都很好地隐藏起来了)。

撰写回答