请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

selenium集成到scrapy,代码执行顺序问题

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放入到队列导致第二个页面深度爬取会更快,希望上面的解答能回复你的问题

0 回复 有任何疑惑可以回复我~
  • 提问者 幕布斯1312376 #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2019-08-20 09:03:58
  • vimor #2
    请问老师,selenium可以设置代理访问吗
    回复 有任何疑惑可以回复我~ 2019-08-28 10:29:11
  • bobby 回复 vimor #3
    可以设置代理访问 https://stackoverflow.com/questions/11450158/how-do-i-set-proxy-for-chrome-in-python-webdriver
    回复 有任何疑惑可以回复我~ 2019-08-29 11:31:54

相似问题

登录后可查看更多问答,登录/注册

问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信