2010-01-11 42 views
2

我正在写一个需要load_url函数执行对我下面的蜘蛛:有没有比urlgrabber更好的库来获取Python中的远程URL?

  1. 重试该URL,如果有错误是暂时性的,没有泄漏例外。
  2. 不会泄露内存或文件句柄
  3. 使用HTTP-保持活动的速度(可选)

URLGrabber表面上看起来不错,但它有麻烦。第一个问题是打开了太多的文件,但是我可以通过关闭keep-alive来解决此问题。然后,该功能开始提出socket.error: [Errno 104] Connection reset by peer。该错误应该被捕获,并且可能会引发URLGrabberError。

我正在运行python 2.6.4。

有谁知道用URLGrabber修复这些问题的方法,或者知道另一种方法来完成我需要的不同库吗?

+0

BeautifulSoup ftw? – Kimvais 2010-01-11 08:32:00

+0

BeautifulSoup非常棒,但它用于解析HTML。我需要有关HTTP传输功能的帮助。类似于'urllib2.urlopen',但具有所描述的功能。 – Gattster 2010-01-11 08:33:55

回答

4

如果您正在编写网络爬虫/屏幕刮板,您可能有兴趣查看专用框架,如scrapy

你可以用很少的代码编写真正相当复杂的网络爬虫:它负责调度请求的所有血淋淋的细节,并以结果回复你,以你需要的任何方式处理(它基于扭曲但它很好地隐藏了所有的实现细节)。

+0

scrapy玩django不错吗?我需要把所有东西都放到django/mysql数据库中。 – Gattster 2010-01-11 08:44:14

+0

我假设你想在你的django后端基于你的刮脸excersise的结果创建记录?如果是这样,那么你所需要做的就是将抓取器返回的结果转换为django模型记录(我很久没有使用过django,但iirc使用SQLAlchemy)并调用相关方法将这些记录保存到数据库中:基于scrapy的代码与任何其他python代码没有什么不同(IE,如果你可以使用普通的Python脚本获取数据,你可以使用基于Scrapy的刮板来实现)) – jkp 2010-01-11 08:49:24

+0

不,它不使用SQLAlchemy。尽管如此,将记录放入数据库并不会太难。您必须将'DJANGO_SETTINGS_MODULE'环境变量设置为带有DB连接的设置文件的导入路径,然后像在Django视图中一样创建和保存模型。 – LeafStorm 2010-01-11 11:34:21

0

此外,在Python中的屏幕抓取有Scrapy,虽然我不知道这是否会满足您的要求。

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