基本上我的程序具有以下结构。
def first_parse:
for link in links:
yield Request(url = link, callback = second_parse)
def second_parse:
# webDriver.get(url) and crawl data.
我使用selenium Webdriver从first_parse加载url。对于每个页面,程序需要一些时间来加载页面并完成工作。但由于某些原因,我总是想念链接中的一些链接。
所以我怀疑yield操作何时将Request发送到second_parse,但second_parse仍在处理前一个请求。这样请求错过了。我是对的吗?
如果没有,发送请求的收益率会发生什么?例如,如果有20个链接,first_parse将向second_parse函数发送20个请求。对于每个请求,second_parse将花费10秒,所以当第一个请求在second_parse上运行时,其他请求将在队列中等待?还是刚刚离开?
答案 0 :(得分:2)
您正在webdriver
方法中重复使用相同的second_parse()
实例。我怀疑这是导致问题的原因,因为当没有完成当前操作时,已经实例化的webdriver导航到不同的页面。您应该在webdriver
方法中实例化然后关闭second_parse()
:
def second_parse(self, response):
webDriver = webdriver.Firefox()
webDriver.get(url)
# scrape
webDriver.close()
这可能导致最多20个浏览器同时处于活动状态。