爬虫如何写?记住这些不踩坑

举报
技术火炬手 发表于 2020/10/23 10:39:46 2020/10/23
【摘要】 一文带你避开爬虫过程中的坑。

爬虫是什么?

简单的说爬虫就是模拟人的访问操作来获取网页/App数据的一种程序。我们可以把互联网比作一张大网,而爬虫(即网络爬虫)便是在网上爬行的蜘蛛。把网的节点比作一个个网页,爬虫爬到这就相当于访问了该页面,获取了其信息。可以把节点间的连线比作网页与网页之间的链接关系,这样蜘蛛通过一个节点后,可以顺着节点连线继续爬行到达下一个节点,即通过一个网页继续获取后续的网页,这样整个网的节点便可以被蜘蛛全部爬行到,网站的数据就可以被抓取下来了。

而我们平时所看到的搜索引擎、统计数据、出行类软件、聚合类平台都离不开网络爬虫。

image.png

爬虫的应用领域有哪些?

我们常见的应用场景简单举例如下,

  1. 搜索引擎抓取网页信息

    image.png

2.出行类软件通过爬虫抢票

3.论坛或者微博的舆情监控。用数据采集技术来监测搜索引擎、新闻门户、论坛、博客、微博、微信、报刊、视频的舆情。说白了就是用这个来实现实时的发现某一行业或地区的热点事件,譬如清博舆情,百度舆情等等。

image.png

 4.比价网站的应用。如今各大电商平台为了活跃用户进行各种秒杀活动,还有优惠券等,同样的一个商品可能在不同网购平台价格不一样,这就催生了返利网,折多多,折xx等。那么这些网站是如何在几分钟之内甚至秒级的时间内知道一件商品在某站有优惠的呢?这就需要一个数据采集系统(爬虫)来实时监控各站的价格浮动,先采商品的价格、型号、配置等,在做处理、分析、反馈。

为什么学习爬虫?

互联网的快速发展,带来了前所未有的便利,同样也带来很多之前没有遇到的新问题。获取信息的成本越来越低,信息的种类和数量越来越多,但是我们处理信息的能力并没有提升,很难从信息中提取自己感兴趣的内容。

而学会爬虫就可以自动高效的获取互联网中我们感兴趣的内容,帮助我们快速搭建属于自己的信息知识库。

如何完成一个轻量级爬虫

这里简要概述为三个步骤:获取数据 - 解析数据 - 存储数据。以下是完成这些步骤所涉及的工具,供大家参考。

获取数据:urllib2、Requests、Selenium、aiohttp

获取数据的工具:Chrome、Fiddler、MitmProxy、Appium

解析数据:Css 选择器、PyQuery、BeautifulSoup、Xpath、Re

存储数据:MySQL、MongoDB、Redis

image.png

工程化爬虫

image.png

工程化爬虫的项目推荐:Scrapy、PySpider

官方文档:https://docs.scrapy.org/en/latest/、http://docs.pyspider.org/en/latest/

Github 地址:https://github.com/scrapy/scrapy、https://github.com/binux/pyspider

反爬虫的措施与应对

1.网页反爬虫—字体反爬

开发者可以使用 @font-face 为网页指定字体,就可以调用自定义的字体文件来渲染网页中的文字,网页中的文字变成相应的编码,这时通过简单的网页采集就无法获取编码后的网页内容。

应对措施:字体反爬相对与其他的反爬,他的难度属于较为初级的阶段,主要是在处理的时候比较麻烦,比较注重防御的网站,往往一个网站有多套不同的字体加密防御体系,比如 135 用 A 方案,246 用 B 方案,这个需要一定的耐心去分析字体的规律并使用 Python 解析字体文件,找出映射规律才可以解决。

推荐工具:fontTools、百度字体编辑器(http://fontstore.baidu.com/static/editor/index.html)

2.网页反爬虫—验证码

验证码是一种区分用户是计算机还是人的公共全自动程序,常见的验证码有:多位英数混合验证码、滑动验证码、点选验证码、旋转验证码等等。

应对措施:项目预算充足的情况下可以对接专业的打码平台,减少 90 % 的工作量;预算不足的情况可以使用华为云 ModelArts,不用写一行代码,就能完成模型的搭建

推荐工具:华为云 ModelArts、CC框架

3.网页反爬虫—JS 加密/混淆

前端的代码都是公开的,那么加密有意义吗?有的,通过去除代码中尽可能多的有意义的信息,比如注释、换行、空格、代码负号、变量重命名、属性重命名(允许的情况下)、无用代码的移除尽可能增加爬虫工程师阅读代码的成本。

应对措施:轻中度混淆或者混淆的代码,可以通过阅读混淆后的代码,梳理加密逻辑后扣取可运行的 Js 代码,使用 Python 库调用完成加密参数的生成;重度混淆使用 AST 语法树还原混淆的代码,去除无意义的垃圾代码,还原清晰的加密逻辑后使用 Python 库调用完成加密参数的生成。

推荐工具:AST、PyExecJS

4.APP 反爬虫

都2020年了,目前通过应用市场下载的 APP还有不加壳的吗?除了加壳防护外,常见的 APP 也应用了单向或双向证书验证,简单的中间人攻击已经无法抓到 APP 的数据包,学习 APP 逆向已经势在必行。

应对措施:APP 逆向需要学习的内容非常多,这里只针对无法抓到 APP 包做简单的总结(推荐工具:Frida、Xposed、IDA、jadx、Charles):

【单向认证和双向认证】

单向验证的情况是客户端校验证书,校验出错就无法访问

双向认证的情况是客户端校验证书的时候,服务端也要校验证书,有一端证书校验失败都无法访问数据。缺点是服务器的压力比较大

处理方法:一般是使用 JustTrustMe,原理是通过 Xpose Hook 校验的 API。

【APP不走代理—如何确定 APP 不走代理?】

(1)关闭代理服务器(fiddler等代理抓包工具)(2)使用手机访问浏览器网页访问失败,确定代理失效(3)使用APP访问,正常访问确定 APP 不走代理访问网络

处理方法:更换不基于代理类型的抓包工具(HTTP Analyzer V7--缺点没办法用在真机、HTTP Debug Pro、手机端的HttpCanary-基于VPN);hook-先反编译看看他是使用了那个框架,然后针对性的hook-菜鸡劝退;iptables 强制拦截转发

【代理检测的APP】

挂上代理之前APP访问正常,挂上代理之后APP无法使用显示网络出错等情况

(1)代理检测(hook 代理检测的方法)(2)证书检测(用 JustTrustMe )

【双向认证的APP】

双向认证的情况是客户端校验证书的时候,服务端也要校验证书,有一端证书校验失败都无法访问数据。

不过在双向认证的APP中要做到双向验证,在APP中一般要配置好服务器端验证的证书,所以在客户端中我们可以找到一个服务端的证书,我们只要在 Fiddler 中配置好这个证书就可以请求了。

ps:证书一般带有密码,需要反编译找到密码,之后导入至系统当中,再从系统中导出为 .cer 证书格式,之后在 FiddlerScript 中配置即可。

分布式爬虫都是什么?

如果你已经学习了如何编写工程化爬虫,并对它有一定的心得,那么你已经开始对爬虫架构有一定的心得了。

而分布式爬虫看着概念吓人,其实往简单的看就是将单机的爬虫分布到多台机器,主要的重点在于消息阻塞处理,日志告警、数据完整性校验等等问题。

针对亿级以下的舆情数据,可以试着学习 Scrapy + Redis + MQ + Celery 这样的组合,足以应对。

如果是针对垂直领域的数据抓取,可以将重心放在如果快而稳的获取数据上,毕竟垂直领域的数据抓取,爬虫与反爬虫的对抗是最激烈的。

学习资源推荐

崔庆才:《Python3 网络爬虫开发实战》

韦世东:《Python3 反爬虫原理与绕过实战》、《Python3 网络爬虫宝典 》

爬虫相关的公众号:NightTeam、咸鱼学Python、进击的Coder、菜鸟学Python编程、妄为写代码 

学Python,请上华为云学院!

华为云学院是华为云官方云计算技术培训学习平台,作为云时代下的创新开发者人才学院,华为云学院打造了架构完整、内容丰富、形式多样的“学、练、考、证”一站式学习与体验平台。用户可通过在线课程进行学习,在沙箱实验室进行练习,考试后获取官方认证证书,掌握最新培训服务资讯,促进综合技能提升。

华为云1024程序员节,向云而生 

直播盛典:邀请华为云云原生开源负责人、华为云DevCloud首席技术布道师等10+大咖现身,剖析云原生的行业趋势,倾授云原生实战秘籍。点击观看直播

干货直通车:大佬级别专家手把手教学,经验和技术分享必不可少,还有在线互动答疑,带你揭晓大厂最深层代码技术,点击查看各技术会场,挖掘更多干货!

本文根据【咸鱼学Python】公众号号主戴煌金在“华为云1024程序员节”技术分论坛的直播内容整理而成,感兴趣的开发者们可点击回看直播


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200