首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python爬虫-速度(3)

前言

普通爬虫

多进程提速

多线程提速

异步协程提速

最后

018.11.11

前言

说句题外话:今天还在敲代码的人,是没有钱还是没女朋友?我猜两样都没有!

早之前是以为会一口气把爬虫这个系列了结的,但不知何故,居然没做到——我肯定不会怪罪自己的拖延症呀!只是有开头就得有结尾,毕竟我是那么那么注重仪式感的人。

再从GitHub把代码clone下来,发现不能用了。刨根问底,居然是学校就业网站改版,这倒令我惊奇。会是因为哪个老师或者学生确实无聊所以动了“美好校园”的念头?缘由于我来说肯定是不得而知的。

重写一份吧。结构上相比两个月前的代码是有所优化的,但不至于天壤之别。相似处多,所以不再单独对此次基础代码进行说明。

此篇目的是:基于(2)的提速方法,改写(1)爬虫代码。当然了,因为网页改版,接下来我会是基于新的代码做改写。

那就开始啦。

Python爬虫-速度(1)

(Python爬虫-速度(2))

普通爬虫

此次代码对应目录:NewSchoolJobsCrawl

效果如下:

多次运行,整个程序跑完在60s左右。

多进程提速

在ProcessPoolExecutor助攻下,多进程爬虫的实现真的会很简单。我们只需要把浏览页处理的逻辑提取出来(我把它放到了main()中),然后构建一个进程池去执行这部分的代码就好。这样说会很抽象,将下面的代码与普通爬虫的代码做对比,理解起来容易些。

平均耗时:10s上下

多线程提速

同样的,有了ThreadPoolExecutor后,多线程也变得简单起来。除了类名,其他部分可以完全和多进程的代码一样。

平均耗时:9s+

异步协程提速

异步协程的改动会大一些,这是因为requests模块不支持异步操作。我们需要借助aiohttp来封装一个get请求方式的get()方法如下:

通过这个方法,就可以实现异步操作了。

其他地方也需要做相应的调整,比如async修饰的函数,调用时需要await关键字,但都是小问题。更多需要在意协程是如何使用的。

平均耗时:9s+

最后

感觉这一次写得很“潦草”,这是没办法的事儿。因为以上三个内容(多进程,多线程,协程)每一个都可以拿出来单独写好长一篇。可我这个系列是:爬虫。为了不客夺主位,只好一切从简。

但无论如何是有说到的爬虫提速的,让我的爬虫系列有头有尾——虽然虎头蛇尾。

这次展示的三个提速代码,并非将速度达到极致,许多地方还可以优化,但我并不建议如此。因为出于兴趣爱好的爬虫,真的没有必要分秒必争,况且网站的运维人员也需要休息、娱乐,也需要陪陪家人。而不是一直待公司跟你玩儿“猫捉老鼠”吧!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181111G12S1H00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券