一个Python爬虫工程师学习养成记

大数据的时代,网络爬虫已经成为了获取数据的一个重要手段。前端

但要学习好爬虫并无那么简单。首先知识点和方向实在是太多了,它关系到了计算机网络、编程基础、前端开发、后端开发、App 开发与逆向、网络安全、数据库、运维、机器学习、数据分析等各个方向的内容,它像一张大网同样把如今一些主流的技术栈都链接在了一块儿。正由于涵盖的方向多,所以学习的东西也很是零散和杂乱,不少初学者搞不清楚究竟要学习哪些知识,学习过程当中遇到反爬也不知道用什么方法来解决,本篇咱们来作一些概括和总结。web

初学爬虫

一些最基本的网站,每每不带任何反爬措施。好比某个博客站点,咱们要爬全站的话就顺着列表页爬到文章页,再把文章的时间、做者、正文等信息爬下来就能够了。正则表达式

那代码怎么写呢?用 Python 的 requests 等库就够了,写一个基本的逻辑,顺着把一篇篇文章的源码获取下来,解析的话用 XPath、BeautifulSoup、PyQuery 或者正则表达式,或者粗暴的字符串匹配把想要的内容抠出来,再加个文本写入存下来就完事了。算法

代码很简单,就几个方法调用。逻辑很简单,几个循环加存储。最后就能看到一篇篇文章就被咱们存到本身的电脑里面了。固然有的同窗可能不太会写代码或者都懒得写,那么利用基本的可视化爬取工具,如某爪鱼、某裔采集器也能经过可视化点选的方式把数据爬下来。数据库

若是存储方面稍微扩展一下的话,能够对接上 MySQL、MongoDB、Elasticsearch、Kafka 等等来保存数据,实现持久化存储。之后查询或者操做会更方便。编程

反正,无论效率如何,一个彻底没有反爬的网站用最最基本的方式就搞定了。网页爬虫

到这里,你就说你会爬虫了吗?不,还差的远呢。后端

对于初学者想更轻松的学好Python开发技术,Python爬虫,Python大数据分析,人工智能等技术,这里给你们分享一套系统教学资源,加一下我建的Python技术的学习裙;七八四七五八二一四,一块儿学习。有相关开发工具,学习教程,天天还有专业的老司机在线直播分享知识与技术答疑解惑!

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 来爬也行。

固然拖动只是一种验证码,还有文字点选、逻辑推理等,要是真不想搞,能够找打码平台来解出来再模拟,但毕竟花钱的,一些高手就会选择本身训练深度学习相关的模型,收集数据、标注、训练,针对不一样的业务训练不一样的模型。这样有了核心技术,也不用再去花钱找打码平台了,再研究下验证码的逻辑模拟一下,加密参数就能解出来了。不过有的验证码可贵很,有的我也没搞定。

固然有些验证码多是请求过于频繁而弹出来的,这种若是换个 IP 什么的也能解。

封 IP

封 IP 也是个使人头疼的事,行之有效的方法就是换代理了。

代理不少种,市面上免费的,收费的太多太多了。

首先能够把市面上免费的代理用起来,本身搭建一个代理池,收集如今全网全部的免费代理,而后加一个测试器一直不断测试,测试的网址能够改为你要爬的网址。这样测试经过的通常都能直接拿来爬你的目标网站。

付费代理也是同样,不少商家提供了代理提取接口,请求一下就能获取几十几百个代理,咱们能够一样把它们接入到代理池里面。但这个代理也分各类套餐,什么开放代理、独享代理等等的质量和被封的概率也是不同的。

有的商家还利用隧道技术搭了代理,这样代理的地址和端口咱们是不知道的,代理池是由他们来维护的,好比某布云,这样用起来更省心一些,可是可控性就差一些。

还有更稳定的代理,好比拨号代理、蜂窝代理等等,接入成本会高一些,可是必定程度上也能解决一些封 IP 的问题。

不过这些背后也不简单,为啥一个好好的高匿代理就是莫名其妙爬不了,背后的一些事就很少讲了。

封帐号

有些信息须要模拟登陆才能爬嘛,若是爬的过快,人家网站直接把你的帐号封禁了,就啥都没得说了。好比爬公众号的,人家把你 WX 号封了,那就全完了。

一种解决方法固然就是放慢频率,控制下节奏。

还有种方法就是看看别的终端,好比手机页、App 页、wap 页,看看有没有能绕过登陆的法子。

另外比较好的方法,那就是分流。若是你号足够多,建一个池子,好比 Cookies 池、Token 池、Sign 池反正无论什么池吧,多个帐号跑出来的 Cookies、Token 都放到这个池子里面,用的时候随机从里面拿一个。若是你想保证爬取效率不变,那么 100 个帐号相比 20 个帐号,对于每一个帐号对应的 Cookies、Token 的取用频率就变成原来的了 1/5,那么被封的几率也就随之下降了。

奇葩的反爬

上面说的是几种比较主流的反爬,固然还有很是多奇葩的反爬。好比返回假数据、返回图片化数据、返回乱序数据、返回骂人的数据、返回求饶的数据,那都具体状况看着办吧。

这些反爬也得当心点,以前见过一个反爬直接返回 rm -rf / 的也不是没有,你要是正好有个脚本模拟执行返回结果,后果本身想象哈。

JavaScript 逆向

说到重头了。随着前端技术的进步和网站反爬意识的加强,不少网站选择在前端上下功夫,那就是在前端对一些逻辑或代码进行加密或混淆。固然这不只仅是为了保护前端的代码不被轻易盗取,更重要的是反爬。好比不少 Ajax 接口都会带着一些参数,好比 sign、token 等等,这些前文也讲过了。这种数据咱们能够用前文所说的 Selenium 等方式来爬,但总归来讲效率过低了,毕竟它模拟的是网页渲染的整个过程,而真实的数据可能仅仅就藏在一个小接口里。

若是咱们可以把一些接口的参数真正找出其中的逻辑,用代码来模拟执行,那效率就会有成倍的提高,并且还能在必定程度上规避上述的反爬现象。

但问题是什么?难啊。

Webpack 是一方面,前端代码都被压缩和转码成一些 bundle 文件,一些变量的含义已经丢失,很差还原。而后一些网站再加上一些 obfuscator 的机制,把前端代码变成你彻底看不懂的东西,好比字符串拆散打乱、变量十六进制化、控制流扁平化、无限 debug、控制台禁用等等,前端的代码和逻辑已经面目全非。有的用 WebAssembly 等技术把前端核心逻辑直接编译,那就只能慢慢抠了,虽说有些有必定的技巧,可是总归来讲仍是会花费不少时间。但一旦解出来了,那就万事大吉了。怎么说?就像奥赛题同样,解出来升天,解不出来 GG。

不少公司招聘爬虫工程师都会问有没有 JavaScript 逆向基础,破解过哪些网站,好比某宝、某多、某条等等,解出来某个他们须要的可能就直接录用你。每家网站的逻辑都不同,难度也不同。

App

固然爬虫不只仅是网页爬虫了,随着互联网时代的发展,如今愈来愈多的公司都选择将数据放到 App 上面,甚至有些公司只有 App 没有网站。因此数据只能经过 App 来爬。

咋爬呢?基本的就是抓包工具了,Charles、Fiddler 一把梭,抓到接口以后,直接拿来模拟就好了。

若是接口有加密参数怎么办呢?一种方法你能够边爬边处理,好比 mitmproxy 直接监听接口数据。另外一方面你能够走 Hook,好比上 Xposed 也能够拿到。

那爬的时候又怎么实现自动化呢?总不能拿手来戳吧。其实工具也多,安卓原生的 adb 工具也行,Appium 如今已是比较主流的方案了,固然还有其余的某精灵都是能够实现的。

最后,有的时候可能真的就不想走自动化的流程,我就想把里面的一些接口逻辑抠出来,那就得搞逆向了,IDA Pro、jdax、FRIDA 等工具就派上用场了,固然这个过程和 JavaScript 逆向同样很痛苦,甚至可能得读汇编指令。搞一个案例掉一把头发也不是不可能的。

智能化

上面的这一通,都搞熟了,恭喜你已经超过了百分之八九十的爬虫玩家了,固然专门搞 JavaScript 逆向、App 逆向的都是站在食物链顶端的男人,这种严格来讲已经不算爬虫范畴了,这种神咱们就不算在里面了,反正我不是。

除了上面的一些技能,在一些场合下,咱们可能也须要结合一些机器学习的技术,让咱们的爬虫变得更智能起来。

好比如今不少博客、新闻文章,其页面结构类似度比较高,要提取的信息也比较相似。

好比如何区分一个页面是索引页仍是详情页?如何提取详情页的文章连接?如何解析文章页的页面内容?这些其实都是能够经过一些算法来计算出来的。

因此,一些智能解析技术也营运而生,好比提取详情页,一位朋友写的 GeneralNewsExtractor 表现就很是好。

假如说我来了一个需求,我要爬取一万个新闻网站数据,要一个个写 XPath 吗?写死我吧。若是有了智能化解析技术,在容忍必定错误的条件下,完成这个就是分分钟的事情。

总之,若是咱们能把这一块也学会了,咱们的爬虫技术就会如虎添翼。

运维

这块也是一个重头戏。爬虫和运维也是息息相关。

好比写完一个爬虫,怎样去快速部署到 100 台主机上跑起来。

好比怎么灵活地监控每一个爬虫的运行状态。

好比爬虫有处代码改动,如何去快速更新。

好比怎样监控一些爬虫的占用内存、消耗的 CPU 情况。

好比怎样科学地控制爬虫的定时运行、

好比爬虫出现了问题,怎样能及时收到通知,怎样设置科学的报警机制。

这里面,部署你们各有各的方法,好比用 Ansible 固然能够。若是用 Scrapy 的话有 Scrapyd,而后配合上一些管理工具也能完成一些监控和定时任务。不过我如今用的更可能是仍是 Docker + Kubernetes,再加上 DevOps 一套,好比 GitHub Actions、Azure Pipelines、Jenkins 等等,快速实现分发和部署。

定时任务你们有的用 crontab,有的用 apscheduler,有的用管理工具,有的用 Kubernetes,个人话用 Kubernetes 就多一些了,定时任务也是很好实现。

至于监控的话,也有不少,专门的一些爬虫管理工具自带了一些监控和报警功能。一些云服务也带了一些监控的功能。我用的是 Kubernetes + Prometheus + Grafana,什么 CPU、内存、运行状态,一目了然,报警机制在 Grafana 里面配一下也很方便,支持 Webhook、邮件甚至某钉。

数据的存储和监控,用 Kafka、Elasticsearch 我的感受也挺方便的,我主要用的是后者,而后再和 Grafana 配合起来,数据爬取量、爬取速度等等监控也都一目了然。

结语

至此,爬虫的一些涵盖的知识点也就差很少了,怎么样,梳理一下,是否是计算机网络、编程基础、前端开发、后端开发、App 开发与逆向、网络安全、数据库、运维、机器学习都涵盖到了?上面总结的能够算是从爬虫小白到爬虫高手的路径了,里面每一个方向其实可研究的点很是多,每一个点作精了,都会很是了不得。

爬虫每每学着学着,就成为了一名全栈工程师或者全干工程师,由于你可能真的啥都会了。可是没办法啊,都是被爬虫逼的啊,若是不是生活所困,谁愿意一身才华呢?

相关文章
相关标签/搜索