打造一个健壮高效的网络爬虫

如下内容转自爬虫界大佬崔庆才的文章,传送门html

 

整个分享的主题叫作《健壮高效的网络爬虫》,本次分享从抓取、解析、存储、反爬、加速五个方面介绍了利用 Python 进行网络爬虫开发的相关知识点和技巧,介绍了不一样场景下如何采起不一样措施高效地进行数据抓取的方法,包括 Web 抓取、App 抓取、数据存储、代理选购、验证码破解、分布式抓取及管理、智能解析等多方面的内容,另外还结合了不一样场景介绍了经常使用的一些工具包,所有内容是我在从事网络爬虫研究过程以来的经验精华总结。python

爬取mysql

对于爬取来讲,咱们须要学会使用不一样的方法来应对不一样情景下的数据抓取任务。git

爬取的目标绝大多数状况下要么是网页,要么是 App,因此这里就分为这两个大类别来进行了介绍。github

对于网页来讲,我又将其划分为了两种类别,即服务端渲染和客户端渲染,对于 App 来讲,我又针对接口的形式进行了四种类别的划分——普通接口、加密参数接口、加密内容接口、很是规协议接口。正则表达式

因此整个大纲是这样子的:redis

  • 网页爬取
    • 服务端渲染
    • 客户端渲染
  • App 爬取
    • 普通接口
    • 加密参数接口
    • 加密内容接口
    • 很是规协议接口

爬取 / 网页爬取

服务端渲染的意思就是页面的结果是由服务器渲染后返回的,有效信息包含在请求的 HTML 页面里面,好比猫眼电影这个站点。客户端渲染的意思就是页面的主要内容由 JavaScript 渲染而成,真实的数据是经过 Ajax 接口等形式获取的,好比淘宝、微博手机版等等站点。算法

服务端渲染的状况就比较简单了,用一些基本的 HTTP 请求库就能够实现爬取,如 urllib、urllib三、pycurl、hyper、requests、grab 等框架,其中应用最多的可能就是 requests 了。sql

对于客户端渲染,这里我又划分了四个处理方法:数据库

  • 寻找 Ajax 接口,此种情形能够直接使用 Chrome/Firefox 的开发者工具直接查看 Ajax 具体的请求方式、参数等内容,而后用 HTTP 请求库模拟便可,另外还能够经过设置代理抓包来查看接口,如 Fiddler/Charles。
  • 模拟浏览器执行,此种情形适用于网页接口和逻辑较为复杂的状况,能够直接以可见便可爬的方式进行爬取,如可使用 Selenium、Splinter、Spynner、pyppeteer、PhantomJS、Splash、requests-html 等来实现。
  • 直接提取 JavaScript 数据,此种情形适用于真实数据没有通过 Ajax 接口获取,而是直接包含在 HTML 结果的某个变量中,直接使用正则表达式将其提取便可。
  • 模拟执行 JavaScript,某些状况下直接模拟浏览器执行效率会偏低,若是咱们把 JavaScript 的某些执行和加密逻辑摸清楚了,能够直接执行相关的 JavaScript 来完成逻辑处理和接口请求,好比使用 Selenium、PyExecJS、PyV八、js2py 等库来完成便可。

爬取 / App 爬取

对于 App 的爬取,这里分了四个处理状况:

  • 对于普通无加密接口,这种直接抓包拿到接口的具体请求形式就行了,可用的抓包工具备 Charles、Fiddler、mitmproxy。
  • 对于加密参数的接口,一种方法能够实时处理,例如 Fiddler、mitmdump、Xposed 等,另外一种方法是将加密逻辑破解,直接模拟构造便可,可能须要一些反编译的技巧。
  • 对于加密内容的接口,即接口返回结果彻底看不懂是什么东西,可使用可见便可爬的工具 Appium,也可使用 Xposed 来 hook 获取渲染结果,也能够经过反编译和改写手机底层来实现破解。
  • 对于很是规协议,可使用 Wireshark 来抓取全部协议的包,或者使用 Tcpdump 来进行 TCP 数据包截获。

以上即是爬取流程的相关分类和对应的处理方法。

解析

对于解析来讲,对于 HTML 类型的页面来讲,经常使用的解析方法其实无非那么几种,正则、XPath、CSS Selector,另外对于某些接口,常见的可能就是 JSON、XML 类型,使用对应的库进行处理便可。

这些规则和解析方法其实写起来是很繁琐的,若是咱们要爬上万个网站,若是每一个网站都去写对应的规则,那么不就太累了吗?因此智能解析即是一个需求。

智能解析意思就是说,若是能提供一个页面,算法能够自动来提取页面的标题、正文、日期等内容,同时把无用的信息给刨除,例如上图,这是 Safari 中自带的阅读模式自动解析的结果。

对于智能解析,下面分为四个方法进行了划分:

  • readability 算法,这个算法定义了不一样区块的不一样标注集合,经过权重计算来获得最可能的区块位置。
  • 疏密度判断,计算单位个数区块内的平均文本内容长度,根据疏密程度来大体区分。
  • Scrapyly 自学习,是 Scrapy 开发的组件,指定⻚页⾯面和提取结果样例例,其可⾃自学习提取规则,提取其余同类⻚页⾯面。
  • 深度学习,使⽤用深度学习来对解析位置进⾏行行有监督学习,须要⼤大量量标注数据。

若是可以容忍必定的错误率,可使用智能解析来大大节省时间。

目前这部份内容我也还在探索中,准确率有待继续提升。

存储

存储,即选用合适的存储媒介来存储爬取到的结果,这里仍是分为四种存储方式来进行介绍。

  • 文件,如 JSON、CSV、TXT、图⽚、视频、⾳频等,经常使用的一些库有 csv、xlwt、json、pandas、pickle、python-docx 等。
  • 数据库,分为关系型数据库、非关系型数据库,如 MySQL、MongoDB、HBase 等,经常使用的库有 pymysql、pymssql、redis-py、pymongo、py2neo、thrift。
  • 搜索引擎,如 Solr、ElasticSearch 等,便于检索和实现⽂本匹配,经常使用的库有 elasticsearch、pysolr 等。
  • 云存储,某些媒体文件能够存到如七⽜牛云、又拍云、阿里云、腾讯云、Amazon S3 等,经常使用的库有 qiniu、upyun、boto、azure-storage、google-cloud-storage 等。

这部分的关键在于和实际业务相结合,看看选用哪一种方式更能够应对业务需求。

反爬

反爬这部分是个重点,爬虫如今已经愈来愈难了,很是多的网站已经添加了各类反爬措施,在这里能够分为非浏览器检测、封 IP、验证码、封帐号、字体反爬等。

下面主要从封 IP、验证码、封帐号三个方面来阐述反爬的处理手段。

反爬 / 封 IP

对于封 IP 的状况,能够分为几种状况来处理:

  • 首先寻找手机站点、App 站点,若是存在此类站点,反爬会相对较弱。
  • 使用代理,如抓取免费代理、购买付费代理、使用 Tor 代理、Socks 代理等。
  • 在代理的基础上维护本身的代理池,防止代理浪费,保证明时可用。
  • 搭建 ADSL 拨号代理,稳定高效。

反爬 / 验证码

验证码分为很是多种,如普通图形验证码、算术题验证码、滑动验证码、点触验证码、手机验证码、扫二维码等。

  • 对于普通图形验证码,若是很是规整且没有变形或干扰,可使用 OCR 识别,也可使用机器学习、深度学习来进行模型训练,固然打码平台是最方便的方式。
  • 对于算术题验证码,推荐直接使用打码平台。
  • 对于滑动验证码,可使用破解算法,也能够模拟滑动。后者的关键在于缺口的找寻,可使用图片比对,也能够写基本的图形识别算法,也能够对接打码平台,也可使用深度学习训练识别接口。
  • 对于点触验证码,推荐使用打码平台。
  • 对于手机验证码,可使用验证码分发平台,也能够购买专门的收码设备,也能够人工验证。
  • 对于扫二维码,能够人工扫码,也能够对接打码平台。

反爬 / 封帐号

某些网站须要登陆才能爬取,可是一个帐号登陆以后请求过于频繁会被封号,为了不封号,能够采起以下措施:

  • 寻找手机站点或 App 站点,此种类别一般是接口形式,校验较弱。
  • 寻找无登陆接口,尽量寻找⽆无需登陆便可爬取的接口。
  • 维护 Cookies 池,使⽤用批量帐号模拟登陆,使⽤时随机挑选可用 Cookies 使⽤便可,实现:https://github.com/Python3WebSpider/CookiesPool。

加速

当爬取的数据量很是大时,如何高效快速地进行数据抓取是关键。

常见的措施有多线程、多进程、异步、分布式、细节优化等。

加速 / 多线程、多进程

爬虫是网络请求密集型任务,因此使用多进程和多线程能够大大提升抓取效率,如使用 threading、multiprocessing 等。

加速 / 异步

将爬取过程改为非阻塞形式,当有响应式再进行处理,不然在等待时间内能够运行其余任务,如使用 asyncio、aiohttp、Tornado、Twisted、gevent、grequests、pyppeteer、pyspider、Scrapy 等。

加速 / 分布式

分布式的关键在于共享爬取队列,可使用 celery、huey、rq、rabbitmq、kafka 等来实现任务队列的对接,也可使用现成的框架 pyspider、Scrapy-Redis、Scrapy-Cluster 等。

加速 / 优化

能够采起某些优化措施来实现爬取的加速,如:

  • DNS 缓存
  • 使用更快的解析方法
  • 使用更高效的去重方法
  • 模块分离化管控

加速 / 架构

若是搭建了分布式,要实现高效的爬取和管理调度、监控等操做,咱们可使用两种架构来维护咱们的爬虫项目。

  • 将 Scrapy 项目打包为 Docker 镜像,使用 K8S 控制调度过程。
  • 将 Scrapy 项目部署到 Scrapyd,使用专用的管理工具如 SpiderKeeper、Gerapy 等管理。

以上即是我分享的所有内容,全部的内容几乎都展开说了,一共讲了一个半小时。

 

上面的文字版的总结可能比较简略,很是建议你们若有时间的话观看原版视频分享,里面还能看到我本人的真面目哦,如今已经上传到了 Bilibili,连接为:https://www.bilibili.com/video/av34379204,你们也能够经过点击原文或扫码来查看视频。

另外对于这部份内容,其实还有我制做的更丰富的思惟导图,预览图以下:

相关文章
相关标签/搜索