V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
FYK
V2EX  ›  Python

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

  •  
  •   FYK · 2019-08-31 00:21:32 +08:00 · 3188 次点击
    这是一个创建于 1916 天前的主题,其中的信息可能已经有所发展或是发生改变。

    元数据存储在第三方队列中,然后我的逻辑是在 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 友,我这个问题的关键在哪里,应该怎么解决。或者提供一个准确的关键词也是极好的,我就是没有准确的关键词,已经搜索很久了也没有搜到想要的。

    第 1 条附言  ·  2019-08-31 14:42:42 +08:00

    补充:

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

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

    @Trim21 应该是不停止的,具体的停止要看 scrapy 的请求队列中是否还有请求存在。我有遇到过你说的这样的情况,就是在取到的 data 长度为 0 时,恰好程序停止了,但停止的实际原因是因为请求队列空了。如果 data 长度为 0,而 scrapy 的请求队列中还有请求,scrapy 会继续执行请求,直到全部消耗完毕才会停止程序。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5295 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 09:28 · PVG 17:28 · LAX 01:28 · JFK 04:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.