繁体   English   中英

Python中的多步骤并发HTTP请求

[英]Multi-step, concurrent HTTP requests in Python

我需要在Python中进行一些三步式的Web抓取。 我最初抓取了几个基本页面,我需要从这些页面上获取一些选择链接,并检索它们指向的页面,然后再重复一次。 诀窍是我想异步完成所有操作,以便尽快触发每个请求,并且不会在单个请求上阻止整个应用程序。 我该怎么做?

到目前为止,我一直在使用eventlet一步eventlet ,如下所示:

urls = ['http://example.com', '...']
def scrape_page(url):
    """Gets the data from the web page."""
    body = eventlet.green.urllib2.urlopen(url).read()
    # Do something with body
    return data

pool = eventlet.GreenPool()
for data in pool.imap(screen_scrape, urls):
    # Handle the data...

但是,如果我扩展此技术并包括一个嵌套的GreenPool.imap循环,它将阻塞直到该组中的所有请求完成,这意味着该应用程序无法根据需要启动更多请求。

我知道我可以用Twisted或其他异步服务器来做到这一点,但是我不需要这么大的库,我宁愿使用轻量级的东西。 我愿意接受建议。

这是一个主意...但是请原谅我,因为我不知道eventlet。 我只能提供一个粗略的概念。

考虑您的“步骤1”生产者。 创建一个队列,并让您的步骤1工作人员将他们找到的所有新URL放入队列。

创建另一个工人池。 让这些工作人员从队列中拉出URL并进行处理。 如果在他们的处理过程中发现另一个URL,请将其放入队列。 他们将继续为以后的工作加油。

从技术上讲,这种方法可以使其轻松地递归超过1,2,3+个步骤。 只要他们找到新的url并将它们放在队列中,工作就会不断发生。

更好的是,从队列中的原始URL开始,然后创建一个将新URL放入同一队列的单个池。 只需要一个游泳池。

张贴便条

有趣的是,在我发布了这个答案并查找了与事件“队列”等效的内容之后,我立即找到了一个示例,准确地说明了我的描述:

http://eventlet.net/doc/examples.html#producer-consumer-web-crawler

在该示例中,有一个producerfetch方法。 生产者开始从队列中提取URL并生成线程以进行fetch 然后, fetch将所有新的url放回队列中,并且它们彼此之间不断进行馈送。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM