GEVENT。解析预先知道的页数

时间:2015-01-17 18:22:22

标签: python parsing asynchronous gevent

决定在编写解析器时解决gevent,除了一个问题外,一切都还可以:根据doc,我们需要提前知道我们将解析多少页

for i in range(1, 15):
    handlers_group.add(gevent.spawn(handler, i))
handlers_group.join()

在这种情况下,处理程序如下所示:

def handler(page_num):
    r = requests.get('sait.com?page={}'.format(page_num))
    if r.text != 'page not found':
        # data processing

如果事先不知道分页的解析次数怎么办?只有当答案是“找不到页面”时才应该停止。我们只知道页数通常是15到50,在极少数情况下,超过一百(极限不知道可以满足和一百万,但处理超过两三百没有任何意义)。

想到最平庸的事情 - 创建300页的查询:

for i in range(1, 300):
    handlers_group.add(gevent.spawn(handler, i))
handlers_group.join()

并且当来自服务器的响应将设置为“找不到页面”时,从函数处理程序中终止一组handlers_group。但是在这种情况下,由于来自页面№300(假设没有)的异步响应可能比来自№250(这就是那里)更快,并且我们将在获得所有信息之前杀死处理页面。 真的希望在任何方向帮助社区。

1 个答案:

答案 0 :(得分:0)

您可以使用在404上设置的全局事件,并在事件is_set

时停止迭代
from gevent.event import Event
evt = Event()


def parsing_method():
    eventlets = []
    for i in range(1,10):
        gevent.sleep(0)
        if evt.is_set(): break
        eventlets.append(gevent.spawn(fn))
        #perform as usual

    gevent.join_all(*eventlets) 

但是,你确定你不知道号码数吗?