第一次搞 scrapy,求问关于 start_requests() 内 yield request 的问题

2019-08-31 00:21:32 +08:00
 FYK

元数据存储在第三方队列中,然后我的逻辑是在 start_requests() 中 while 从队列中循环获取数据,然后根据这些数据拼接 URL,再 yield, 伪代码如下:

def start_requests(self):
    data = get_data_from_queue()
    if len(data) > 0:
        url = data 内数据拼接
        yield scrapy.Request(url,其它参数)

最终的结果是队列数量和实际请求数量相差极大,比如我在队列中的消息数量为 1000,然后开启爬虫,等爬虫停止的时候,根据它的最后的日志信息发现请求队列中只入队了几十个。而队列中的消息已经消费完了。

我目前的想法是,是不是从第三方获取消息太快了,scrapy 这边 yield request 的时候没跟上,然后现在在调整单次从队列获取的数量大小?但是收效甚微,极端数量为 1 的时候,队列还没消费完,爬虫已经停止了。

我觉得这应该是很简单的问题,举个例子 for 循环这样 yield request 对于有规则的 url 也是常见的场景,但是受限于这方面知识面不足,我目前没有什么好的思路去尝试解决这个问题。

想问各位 v 友,我这个问题的关键在哪里,应该怎么解决。或者提供一个准确的关键词也是极好的,我就是没有准确的关键词,已经搜索很久了也没有搜到想要的。

3010 次点击
所在节点    Python
4 条回复
leishi1313
2019-08-31 01:27:44 +08:00
你放整个的代码吧,粗看并不是一个 for 或者 yield 的问题
OldPanda
2019-08-31 02:21:18 +08:00
如果不方便放整个的代码,能不能放这部分的原代码加上 get_data_from_queue() 函数的实现?
Trim21
2019-08-31 08:58:55 +08:00
按你这个伪代码,如果某次取到的 data 长度为 0,不就结束生成请求了…
FYK
2019-08-31 14:47:31 +08:00
@leishi1313 已补充,不太方便原样,所以改了下变量名啥的,但是实际的逻辑就是这样子

@OldPanda 已补充,不太方便原样,所以改了下变量名啥的,但是实际的逻辑就是这样子

@Trim21 应该是不停止的,具体的停止要看 scrapy 的请求队列中是否还有请求存在。我有遇到过你说的这样的情况,就是在取到的 data 长度为 0 时,恰好程序停止了,但停止的实际原因是因为请求队列空了。如果 data 长度为 0,而 scrapy 的请求队列中还有请求,scrapy 会继续执行请求,直到全部消耗完毕才会停止程序。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/596668

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX