元数据存储在第三方队列中,然后我的逻辑是在 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 友,我这个问题的关键在哪里,应该怎么解决。或者提供一个准确的关键词也是极好的,我就是没有准确的关键词,已经搜索很久了也没有搜到想要的。
补充:
def start_requests(self):
records = self.service.batch_receive_message(3)
while len(records) > 0:
for record in records:
record = json.loads(record.message_body)
a = record.get('a')
b = record.get('b')
c = record.get('c')
url = self.base_url.format(a = a, b = b, c = c)
yield scrapy.Request(url, meta=record, callback=self.parse, errback=self.error_back)
records =self.service.batch_receive_message(3)
1
leishi1313 2019-08-31 01:27:44 +08:00
你放整个的代码吧,粗看并不是一个 for 或者 yield 的问题
|
2
OldPanda 2019-08-31 02:21:18 +08:00
如果不方便放整个的代码,能不能放这部分的原代码加上 get_data_from_queue() 函数的实现?
|
3
Trim21 2019-08-31 08:58:55 +08:00 via Android
按你这个伪代码,如果某次取到的 data 长度为 0,不就结束生成请求了…
|
4
FYK OP @leishi1313 已补充,不太方便原样,所以改了下变量名啥的,但是实际的逻辑就是这样子
@OldPanda 已补充,不太方便原样,所以改了下变量名啥的,但是实际的逻辑就是这样子 @Trim21 应该是不停止的,具体的停止要看 scrapy 的请求队列中是否还有请求存在。我有遇到过你说的这样的情况,就是在取到的 data 长度为 0 时,恰好程序停止了,但停止的实际原因是因为请求队列空了。如果 data 长度为 0,而 scrapy 的请求队列中还有请求,scrapy 会继续执行请求,直到全部消耗完毕才会停止程序。 |