「产业气象站」我到底要学多少东西呢?,就想写个爬虫( 二 )


多进程、多线程、协程
上面的情况如果用单线程的爬虫来模拟是比较简单的 , 但是有个问题就是速度慢啊 。
爬虫是IO密集型的任务 , 所以可能大多数情况下都在等待网络的响应 , 如果网络响应速度慢 , 那就得一直等着 。 但这个空余的时间其实可以让CPU去做更多事情 。 那怎么办呢?多开点线程吧 。
所以这时候我们就可以在某些场景下加上多进程、多线程 , 虽然说多线程有GIL锁 , 但对于爬虫来说其实影响没那么大 , 所以用上多进程、多线程都可以成倍地提高爬取速度 , 对应的库就有threading、multiprocessing了 。
异步协程就更牛逼了 , 用aiohttp、gevent、tornado等等的基本上你想搞多少并发就搞多少并发 , 但是还是悠着点 , 别把人家网站搞挂了 。
总之 , 用上这几个 , 爬虫速度就提上来了 。
但速度提上来了不一定是好事 , 反爬接着肯定就要来了 , 封你IP、封你账号、弹验证码、返回假数据 , 所以有时候龟速爬似乎也是个解决办法?
分布式
多线程、多进程、协程都能加速 , 但终究还是单机的爬虫 。 要真正做到规模化 , 还得来靠分布式爬虫来搞 。
分布式的核心是什么?资源共享 。 比如爬取队列共享、去重指纹共享等等 。
我们可以使用一些基础的队列或组件来实现分布式 , 比如RabbitMQ、Celery、Kafka、Redis等等 , 但经过很多人的尝试 , 自己去实现一个分布式爬虫 , 性能和扩展性总会出现一些问题 , 当然特别牛逼的除外哈 。 不少企业内部其实也有自己开发的一套分布式爬虫 , 和业务更紧密 , 这种当然是最好了 。
现在主流的Python分布式爬虫还是基于Scrapy的 , 对接Scrapy-Redis、Scrapy-Redis-BloomFilter或者用Scrapy-Cluster等等 , 他们都是基于Redis来共享爬取队列的 , 总会多多少少遇到一些内存的问题 。 所以一些人也考虑对接到了其他的消息队列上面 , 比如RabbitMQ、Kafka等等 , 解决一些问题 , 效率也不差 。
总之 , 要提高爬取效率 , 分布式还是必须要掌握的 。
验证码
爬虫难免遇到反爬 , 验证码就是其中之一 。 要会反爬 , 那首先就要会解验证码 。
现在你可以看到很多网站都会有各种各样的验证码了 , 比如最简单的图形验证码 , 要是验证码的文字规整的话 , OCR过一遍或者基本的模型库都能识别 , 不想搞这个的话可以直接去对接个打码平台来搞 , 准确率还是有的 。
然而你可能现在都见不到什么图形验证码了 , 都是一些行为验证码 , 如某验、某盾等等 , 国外也有很多 , 比如reCaptcha等等 。 一些稍微简单一点的 , 比如滑动的 , 你可以找点办法识别缺口 , 比如图像处理比对、深度学习识别都是可以的 。 轨迹呢自己写个模拟正常人行为的 , 加点抖动之类的 。 有了轨迹之后咋模拟呢 , 如果你牛逼 , 那么可以直接去分析验证码的JavaScript逻辑 , 把轨迹数据录入 , 那就能得到里面的一些加密参数 , 直接拿着这些参数放到表单或接口里面就能直接用了 。 当然也可以用模拟浏览器的方式来拖动 , 也能通过一定的方式拿到加密参数 , 或者直接用模拟浏览器的方式把登录一起做了 , 拿着Cookies来爬也行 。
【「产业气象站」我到底要学多少东西呢?,就想写个爬虫】当然拖动只是一种验证码 , 还有文字点选、逻辑推理等 , 要是真不想搞 , 可以找打码平台来解出来再模拟 , 但毕竟花钱的 , 一些高手就会选择自己训练深度学习相关的模型 , 收集数据、标注、训练 , 针对不同的业务训练不同的模型 。 这样有了核心技术 , 也不用再去花钱找打码平台了 , 再研究下验证码的逻辑模拟一下 , 加密参数就能解出来了 。 不过有的验证码难得很 , 有的我也没搞定 。


推荐阅读