关于scrapy数据库异步操作

来源:7-8 职位信息入库-2

慕婉清4097246

2019-11-27

老师你好,请教两个关于scrapy的问题:1)yield 多个scrapy.Request出去,callback指向同一个函数,在callback函数中time.sleep, 会不会阻塞别的request的callback处理? 我调试的结果:看起来会阻塞

2)yield 几十上百个scrapy.Request出去, 所有request的callback里提取页面内容将item yield出去后退出。pipeline中用adbapi异步写数据库,但是异步数据库操作会随着callback跑完退出、spider关闭 而终止,异步数据操作写不完 上面两个问题好像相互矛盾:要等异步数据库操作完成,就得让spider不退出,要让spider不退出,就得让最后一个request的callback不退出或延时退出,但延时又会阻塞其它的request的处理。请解答,谢谢

写回答

1回答

bobby

2019-11-28

  1. 确实会的,这个我也强调过在scrapy中不要用同步的方法

  2. adbapi的好处就是可以快速的将请求发送出去,也就是快速的交给mysql去处理

    整个scrapy的处理是单线程的,因为底层依赖的是twisted,所以不论是入库还是继续请求url都是在一个线程中,也就是按顺序执行的,这个也就是为什么在pipeline中不建议使用同步的方式入库的原因

0
2
bobby
回复
慕婉清4097246
url的下载不是同步,也是异步的,也就是即使是一个线程,你随时yield出去的request也可以被立马把请求发送出去而不用等到响应返回
2019-12-01
共2条回复

Scrapy打造搜索引擎 畅销4年的Python分布式爬虫课

带你彻底掌握Scrapy,用Django+Elasticsearch搭建搜索引擎

5795 学习 · 6290 问题

查看课程