采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
scrapy是异步的,这个好理解,scrapy是多线程的还是多进程的呢,在哪里能看到?还有在scrapy中间件里使用request调用代理api,会不会破坏了scrapy的异步性
scrapy能处理阻塞io,那么我在代码里加个sleep,或者使用selenium,这样还不会破坏异步性吗?好像会破坏,目前我写了一个代理中间件,用requests库调用的代理api,如果这不会破坏异步性,哪种写法会破坏异步,哪种不会呢
阻塞肯定能运行啊,只是写了阻塞代码会影响后续的请求的发出,使用selenium确实会破坏阻塞性,所以selenium课程中用的并不多,在模拟登陆的时候使用就行了。,毕竟登陆也不是每个请求都要做,还有一种解决更通用的是将模拟登陆分开成另一个独立的服务,这样scrapy就和这个登陆服务之间建立了一个cookie池了,这样就好多了。使用requests是同步io。如果少量使用还可以,大量使用肯定会破坏异步性的,解决办法就是使用aiohttp来替代requests
scrapy 本身并没有什么太多的多线程和多进程等,因为scrapy底层是twisted,这个框架是一个异步io框架,是基于回调实现的,并不是多线程也不是多进程,回调比多线程和多进程性能都高,但是有一个很大的限制就是不能在代码中使用阻塞io方法,不然所有的请求都会被阻塞,但是有很多库都是同步io,所以为了解决这个问题twisted在启动的时候就会启动一个线程池,可以把阻塞的方法扔到这个线程池中去执行,使用ip代理并不会破坏异步性
登录后可查看更多问答,登录/注册
带你彻底掌握Scrapy,用Django+Elasticsearch搭建搜索引擎
4.7k 30
2.5k 18
1.1k 18
1.3k 15
2.7k 15