selenium集成到scrapy,代码执行顺序问题
来源:9-4 selenium集成到scrapy中
幕布斯1312376
2019-08-03
start_urls = ['https://item.jd.com/7652029.html',
'https://item.jd.com/100003395445.html',
'https://item.jd.com/7437708.html',
'https://item.jd.com/100003717483.html',
'https://item.jd.com/100003344497.html'
]
代码的其他部分是按照老师的思路完成的,整体的实现效果也是一样的,但是在页面的执行顺序上存在一些疑问。
(1) ‘https://item.jd.com/7652029.html’
(2) ‘https://item.jd.com/100003395445.html’
(3) parse()
(4) ‘https://item.jd.com/7437708.html’
(5) parse()
(6) ‘https://item.jd.com/100003717483.html’
(7) parse()
(8) ‘https://item.jd.com/100003344497.html’
(9) parse()
(10) parse()
我的代码在debug调试过程中发现其执行效果是:
第1个请求
第2个请求
第1个请求的解析函数,
第3个请求
第2个请求的解析函数
第4个请求
第3个请求的解析函数
第5个请求
第4个请求的解析函数
第5个请求的解析函数
并且重复执行三遍都是同样的执行顺序结果。
老师在视频最后提到相关说法,我的理解是:
scrapy是一个高效的异步框架,selenium是一个同步框架,这样的写法使得scrapy在请求过程中也变成了同步请求。
那么问题是:
既然是同步请求为代码执行顺序会是上述那样?
异步请求url是指url是随机请求吗?
感谢老师的回答!
1回答
-
scrapy的是一个异步框架的本质是因为使用了twisted, twisted是一个异步网络库,异步网络库的根本就是提交url出去的时候一旦交出去不会等待对方返回而是直接处理下一个url,所以这里的根本在于所有的处理都是一个线程中进行的,包括提交url到服务器,服务器返回html后的处理:包括解析和入库。所以异步框架中非常忌讳写同步的代码,因为同步的代码会影响所有过程,包括进一步提交url到服务器,包括下一个html的返回处理,所以基于这个根本上肯定是有序的,但是里面的顺序影响的在于服务器返回的速度,比如交出一个url之后立马有html返回来了,异步框架可能就会处理返回的html而不是提交下一个url,但是服务器返回的不同的url的html时间是不确定的,。所以很多时候给我们造成的就好像是不是顺序的,但实际上确实有一定的顺序性,不如第二个url返回的速度快于第一个url返回的速度,那么我们就会快速解析出第二url的html中的更多url放入到队列导致第二个页面深度爬取会更快,希望上面的解答能回复你的问题
032019-08-29
相似问题