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

关于 scrapy 处理批量 url

  •  
  •   akmonde · 2018-05-03 19:56:45 +08:00 · 3626 次点击
    这是一个创建于 2422 天前的主题,其中的信息可能已经有所发展或是发生改变。

    RT,我这边有需求处理一批 URL 入口,其中可能会定制传入相应的参数,形式大概类似于:

    execute(['scrapy', 'crawl', 'woshiscrapy', '-a', 'para=%s' % para)       
    

    试过多进程和多线程,完全不适配,似乎异步 twisted 好像需要其他法子解决速度问题。

    本来放弃速度,准备直接 for 循环传入,结果发现调用 execute 执行 scrapy,爬完了第一个 url,就直接退出了主程序。

    很无奈,求各位大佬给点具体的方案建议,小弟有点没招了。

    第 1 条附言  ·  2018-05-04 17:26:22 +08:00
    @Leigg @arithboy @Mitt @lins05
    感谢以上各位大佬,最后采用了 scrapy_redis,不知道大家知道如何让 scrapy 爬行某个站完成后,发出信号或者做出其他动作。
    另外,我这边执行代码后,调用的原生 scrapy 会直接爬行结束,没法运行后面的代码。
    使用 scrapy_redis 则会直接等待监听,但我不知道在哪儿发出爬行完毕的信号,不然我没法去适时 push 下一个 url。
    不知道哪位大佬知道这个,能解答下?
    4 条回复    2018-05-04 02:04:50 +08:00
    Leigg
        1
    Leigg  
       2018-05-03 20:41:58 +08:00 via Android
    参数得有规律才行,用多进程可以的。
    arithboy
        2
    arithboy  
       2018-05-03 22:42:35 +08:00   ❤️ 1
    你把 url 和相应的参数拼成一个 url 列表,然后赋值到 self.start_urls 变量里面跑
    要多进程的话,把 url 放到队列里面,然后启动多个 scrapy 从队列中取
    lins05
        3
    lins05  
       2018-05-03 23:28:25 +08:00
    可以用 scrapyrt, 把 scrapy project 变成一个 http service, 然后调用 http api
    Mitt
        4
    Mitt  
       2018-05-04 02:04:50 +08:00 via iPhone
    可以了解一下 scrapy_redis 然后重写 make_requests_from_data 来实现自定义参数传入
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3867 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 10:15 · PVG 18:15 · LAX 02:15 · JFK 05:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.