就想写个爬虫,我到底要学多少东西呢?

就想写个爬虫,我到底要学多少东西呢?
文章图片
【就想写个爬虫,我到底要学多少东西呢?】当今大数据的时代 , 网络爬虫已经成为了获取数据的一个重要手段 。
但要学习好爬虫并没有那么简单 。 首先知识点和方向实在是太多了 , 它关系到了计算机网络、编程基础、前端开发、后端开发、App开发与逆向、网络安全、数据库、运维、机器学习、数据分析等各个方向的内容 , 它像一张大网一样把现在一些主流的技术栈都连接在了一起 。 正因为涵盖的方向多 , 因此学习的东西也非常零散和杂乱 , 很多初学者搞不清楚究竟要学习哪些知识 , 学习过程中遇到反爬也不知道用什么方法来解决 , 本篇我们来做一些归纳和总结 。
初学爬虫
一些最基本的网站 , 往往不带任何反爬措施 。 比如某个博客站点 , 我们要爬全站的话就顺着列表页爬到文章页 , 再把文章的时间、作者、正文等信息爬下来就可以了 。
那代码怎么写呢?用Python的requests等库就够了 , 写一个基本的逻辑 , 顺着把一篇篇文章的源码获取下来 , 解析的话用XPath、BeautifulSoup、PyQuery或者正则表达式 , 或者粗暴的字符串匹配把想要的内容抠出来 , 再加个文本写入存下来就完事了 。
代码很简单 , 就几个方法调用 。 逻辑很简单 , 几个循环加存储 。 最后就能看到一篇篇文章就被我们存到自己的电脑里面了 。 当然有的同学可能不太会写代码或者都懒得写 , 那么利用基本的可视化爬取工具 , 如某爪鱼、某裔采集器也能通过可视化点选的方式把数据爬下来 。
如果存储方面稍微扩展一下的话 , 可以对接上MySQL、MongoDB、Elasticsearch、Kafka等等来保存数据 , 实现持久化存储 。 以后查询或者操作会更方便 。
反正 , 不管效率如何 , 一个完全没有反爬的网站用最最基本的方式就搞定了 。
到这里 , 你就说你会爬虫了吗?不 , 还差的远呢 。
Ajax、动态渲染
随着互联网的发展 , 前端技术也在不断变化 , 数据的加载方式也不再是单纯的服务端渲染了 。 现在你可以看到很多网站的数据可能都是通过接口的形式传输的 , 或者即使不是接口那也是一些JSON的数据 , 然后经过JavaScript渲染得出来的 。
这时候 , 你要再用requests来爬那就不顶用了 , 因为requests爬下来的源码是服务端渲染得到的 , 浏览器看到页面的和requests获取的结果是不一样的 。 真正的数据是经过JavaScript执行的出来的 , 数据来源可能是Ajax , 也可能是页面里的某些Data , 也可能是一些ifame页面等等 , 不过大多数情况下可能是Ajax接口获取的 。
所以很多情况下需要分析Ajax , 知道这些接口的调用方式之后再用程序来模拟 。 但是有些接口带着加密参数 , 比如token、sign等等 , 又不好模拟 , 咋整呢?
一种方法就是去分析网站的JavaScript逻辑 , 死抠里面的代码 , 揪出来这些参数是怎么构造的 , 找出思路来了之后再用爬虫模拟或重写就行了 。 如果你解出来了 , 那么直接模拟的方式效率会高非常多 , 这里面就需要一些JavaScript基础了 , 当然有些网站加密逻辑做的太牛逼了 , 你可能花一个星期也解不出来 , 最后放弃了 。
就想写个爬虫,我到底要学多少东西呢?
文章图片
那这样解不出来或者不想解 , 那咋办呢?这时候可以有一种简单粗暴的方法就是直接用模拟浏览器的方式来爬取 , 比如用Puppeteer、Pyppeteer、Selenium、Splash等 , 这样爬取到的源代码就是真正的网页代码 , 数据自然就好提取了 , 同时也就绕过分析Ajax和一些JavaScript逻辑的过程 。 这种方式就做到了可见即可爬 , 难度也不大 , 同时模拟了浏览器 , 也不太会有一些法律方面的问题 。
但其实后面的这种方法也会遇到各种反爬的情况 , 现在很多网站都会去识别webdriver , 看到你是用的Selenium等工具 , 直接干掉或不返回数据 , 所以你碰到这种网站还得来专门解一下这个问题 。
多进程、多线程、协程
上面的情况如果用单线程的爬虫来模拟是比较简单的 , 但是有个问题就是速度慢啊 。
爬虫是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来爬也行 。
当然拖动只是一种验证码 , 还有文字点选、逻辑推理等 , 要是真不想搞 , 可以找打码平台来解出来再模拟 , 但毕竟花钱的 , 一些高手就会选择自己训练深度学习相关的模型 , 收集数据、标注、训练 , 针对不同的业务训练不同的模型 。 这样有了核心技术 , 也不用再去花钱找打码平台了 , 再研究下验证码的逻辑模拟一下 , 加密参数就能解出来了 。 不过有的验证码难得很 , 有的我也没搞定 。


    推荐阅读