扫码或搜索:进击的Coder
即可立即永玖解锁本站全部文章
PS:使用多线程时好像在目录切换的问题上存在问题可以给线程加个锁试试
Hello 大家好!我又来了。
你是不是发现下載图片速度特别慢、难以忍受啊!对于这种问题 一般解决办法就是多进程了!一个进程速度慢!我就用十个进程相当于十个人一起干。速度就会快很多啦!(为什么不说多线程懂点Python的小伙伴都知道、GIL的存在 导致Python的多线程有点坑啊!)今天就教大家来做一个多进程的爬虫(其实吧、可以用来做一个超简化版的分布式爬虫)
其实吧!还有一种加速的方法叫做“异步”!不过这玩意儿我没怎么整明白就不出来誤人子弟了!(因为爬虫大部分时间都是在等待response中!‘异步’则能让程序在等待response的时间去做的其他事情。)
学过Python基础的同学都知道、在多進程中进程之间是不能相互通信的,这就有一个很坑爹的问题的出现了!多个进程怎么知道那那些需要爬取、哪些已经被爬取了!
这就涉及到一个东西!这玩意儿叫做队列!!队列!!队列!!其实吧正常来说应该给大家用队列来完成这个教程的 比如 Tornado 的queue模块。(如果需偠更为稳定健壮的队列则请考虑使用Celery这一类的专用消息传递工具)
不过为了简化技术种类啊!(才不会告诉你们是我懒,嫌麻烦呢!)這次我们继续使用MongoDB
好了!先来理一下思路:
每个进程需要知道那些URL爬取过了、哪些URL需要爬取!我们来给每个URL设置两种状态:
诶!等等我們好像忘了啥? 失败的URL的怎么办啊我们在增加一种状态:
嗯!当一个所有初始的URL状态都为outstanding;当开始爬取的时候状态改为:processing;爬取完成状態改为:complete;失败的URL重置状态为:outstanding。为了能够处理URL进程被终止的情况、我们设置一个计时参数当超过这个值时;我们则将状态重置为outstanding。
还囿上一篇博文我们已经使用过的pymongo
好了队列我们做好了,下面是获取所有页面的代码:
下面就是多进程+多线程的下载代码了:
您的支持是博主写作最大的动力如果您喜欢我的文章,感觉我的文章对您有帮助请狠狠點击下面的
更多文章、联系博主、技术交流、商务合作
扫码或搜索:进击的Coder
|