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
warcraft1236
V2EX  ›  Python

Scrapy 怎么能主动关闭呢?

  •  
  •   warcraft1236 · 2019-02-08 10:46:20 +08:00 · 2680 次点击
    这是一个创建于 2143 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景:

    1. 有一个视频网站,需要登录,由于有 recaptcha 和 fingerprint 存在,模拟登录不太会,所以手动写入 cookie 到代码中去实现登录
    2. 固定的位置的 json 文件,会存储视频的相关信息,格式是{"url":"视频名称"}
    3. json 文件中存储的 url 是视频播放页面,这个页面不需要登录,可以直接解析出来真实的视频地址

    我的逻辑是这样的:

    如果代码中设置的 Cookie 失效或者没设置,就直接从指定的位置读 json 文件。然后请求文件中的 url,解析出来真实的视频地址,放到 pipeline 中下载

    如果代码中设置的 cookie 有效,那么就分析视频列表页面,将结果写入 json 文件,然后读取文件下载

    所以,我在第一段逻辑中需要设置一个关闭 scrapy,这部分代码如下

            if 'login.php' in response.url:
                self.logger.warn('cookie 失效,直接用 follow.json 下载')
                with open('myfollowinfo/follow.json') as f:
                    movie_info = json.loads(f.read())
                self.logger.warn('文件中保存了{0}个视频'.format(len(movie_info)))
                for link, title in movie_info.items():
                    yield scrapy.Request(url=link, callback=self.parse_my_follow_real_link)
                raise CloseSpider(self.crawler)
    

    由于我不知道下载视频需要多久,所以我是不能设置 CLOSESPIDER_TIMEOUT 的值的,所以根据 scrapy 的代码逻辑,会抛出 NotConfigured 异常

    请问我目前这种需求应该怎么做呢?

    6 条回复    2019-04-26 15:40:33 +08:00
    warcraft1236
        1
    warcraft1236  
    OP
       2019-02-08 18:04:22 +08:00
    求教求教
    XxxxD
        2
    XxxxD  
       2019-02-08 18:05:25 +08:00
    不是很懂你的两个逻辑,不过你试试获取登陆过后的 cookie,然后带这个 cookie 请求,不会那么容易失效的
    warcraft1236
        3
    warcraft1236  
    OP
       2019-02-08 21:20:45 +08:00
    @XxxxD 简单说就是 我想在代码中的 if 条件真的时候,只执行 if 内的语句,剩下的这些都不执行,也就是说能不能有什么方法,让 if 里边的 yield scrapy.Request()这个都跑完然后关闭爬虫
    tikazyq
        4
    tikazyq  
       2019-02-09 19:51:41 +08:00 via iPhone
    设置 timeout
    Alfred1993
        5
    Alfred1993  
       2019-03-01 12:53:53 +08:00 via iPhone
    Request()跑完不是会自动关闭吗
    ccdrea
        6
    ccdrea  
       2019-04-26 15:40:33 +08:00
    去看官方文档,Extensions 这部分。https://scrapy-chs.readthedocs.io/zh_CN/0.24/topics/extensions.html
    简单来说,setting 设置接收数据的信号收发标记,一段时间数据为空,自动关闭 scrapy
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2540 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 10:57 · PVG 18:57 · LAX 02:57 · JFK 05:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.