热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:腾讯大佬告诉Python爬虫学习超详细路线图

篇首语:本文由编程笔记#小编为大家整理,主要介绍了腾讯大佬告诉Python爬虫学习超详细路线图相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了腾讯大佬告诉Python 爬虫学习超详细路线图相关的知识,希望对你有一定的参考价值。






初学爬虫

一些最基本的网站,往往不带任何反爬措施。比如某个博客站点,我们要爬全站的话就顺着列表页爬到文章页,再把文章的时间、作者、正文等信息爬下来就可以了。

那代码怎么写呢?用 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 来爬也行。

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

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


封 IP

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

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

首先可以把市面上免费的代理用起来,自己搭建一个代理池,收集现在全网所有的免费代理,然后加一个测试器一直不断测试,测试的网址可以改成你要爬的网址。这样测试通过的一般都能直接拿来爬你的目标网站。我自己也搭建过一个代理池,现在对接了一些免费代理,定时爬、定时测,还写了个 API 来取,放在 GitHub 了:https://github.com/Python3WebSpider/ProxyPool,打好了 Docker 镜像,提供了 Kubernetes 脚本,大家可以直接拿来用。

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

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

还有更稳定的代理,比如拨号代理、蜂窝代理等等,接入成本会高一些,但是一定程度上也能解决一些封 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 配合起来,数据爬取量、爬取速度等等监控也都一目了然。


需要相关爬虫资料的可以通过扫一扫【爬虫】




推荐阅读
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 2022年的风口:你看不起的行业,真的很挣钱!
    本文介绍了2022年的风口,探讨了一份稳定的副业收入对于普通人增加收入的重要性,以及如何抓住风口来实现赚钱的目标。文章指出,拼命工作并不一定能让人有钱,而是需要顺应时代的方向。 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 一次上线事故,30岁+的程序员踩坑经验之谈
    本文主要介绍了一位30岁+的程序员在一次上线事故中踩坑的经验之谈。文章提到了在双十一活动期间,作为一个在线医疗项目,他们进行了优惠折扣活动的升级改造。然而,在上线前的最后一天,由于大量数据请求,导致部分接口出现问题。作者通过部署两台opentsdb来解决问题,但读数据的opentsdb仍然经常假死。作者只能查询最近24小时的数据。这次事故给他带来了很多教训和经验。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 本文介绍了Java虚拟机中的垃圾收集器,包括年轻代收集器Serial收集器、ParNew收集器、Parallel Scavenge收集器,以及老年代收集器Serial Old收集器、Parallel Old收集器和CMS收集器。对每种收集器的算法和特点进行了详细解析,希望对读者有参考价值。 ... [详细]
author-avatar
宝宝壮壮妈
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有