决定在编写解析器时解决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(这就是那里)更快,并且我们将在获得所有信息之前杀死处理页面。 真的希望在任何方向帮助社区。 p>
答案 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)
但是,你确定你不知道号码数吗?