健壮高效的网络爬虫总结

原文连接:juejin.im/post/5bce82…html

1.爬取

绝大多数状况下要么是网页,要么是apppython

1.1网页

服务端渲染mysql

就是页面的结果是由服务器渲染后返回的,有效信息包含在请求的HTML页面里。正则表达式

解决方法:直接用HTTP请求库就能够实现爬取了redis

客户端渲染算法

就是页面的主要内容有JavaScript渲染而成的,真实的数据是经过Ajax接口形式获取的sql

解决方法:数据库

​ 1.寻找Ajax接口,能够直接使用Chrome开发者工具直接查看Ajax具体的请求方式、参数等内容,而后用HTTP请求库模拟便可,另外还能够经过设置代理抓包来查看接口json

​ 2.模拟浏览器执行,网页接口和逻辑较为复杂的状况下:Selenium、Splinter、Spynner、pyppeteer、PhantomJS、Splash、requests-html等来实现浏览器

​ 3.直接提取JavaScript数据,真实数据没有通过Ajax接口获取,而是直接包含在HTML结果的某个变量中,直接使用正则表达式将其提取出来

​ 4.模拟执行JavaScript,有时候模拟浏览器执行效率会偏低,若是咱们把JavaScript的某些执行和加密逻辑摸清楚了,能够直接执行相关的JavaScript来完成逻辑处理和接口请求。好比使用Selenium、PyExecjs、PyV八、js2py等库来完成便可

1.2app抓取

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

1.对于普通无加密接口,这种直接抓包拿到接口的具体请求形式就行了,可用的抓包工具备Charles、Fiddler、mitmproxy

2.对于加密参数的接口,一种方法能够试试处理,例如Fiddler、mitmdump、Xposed等,另外一种方法是将加密逻辑破解,直接模拟构造便可,可能须要一些反编译技巧。

3.对于加密内容的接口,即接口返回结果彻底看不懂是什么东西,可使用可见便可爬的工具Appium,也可使用Xposed来hook获取渲染结果,也能够经过反编译和改写手机底层来破解。

4.对于很是规协议,可使用Wireshark来抓取全部协议的包,或者使用Tcpdump来进行TCP数据包截获

2.解析

对于HTML类型的页面来讲,经常使用的解析方法:正则、Xpath、CSS Selector,对于某些接口来讲常见的可能就是JSON、XML类型,使用对应的库进行处理便可

智能解析

​ 1.readability算法:定义了不一样区块的不一样标注集合,经过权重计算来获得最可能的区块位置

​ 2.疏密度判断,计算单位个数区块内的平均为本内容长度,根据疏密程度来大体区分。

​ 3.Scrapyly自学习,是scrapy开发的组件,指定页页面和提取结果样例,能够自学习提取规则,提取其余同类型页面

​ 4.深度学习,使用深度学习来对未知进行监督学习,须要大量标注数据

3.存储

1.文件:如JSON、CSV、TXT、图片、视频、音频等,经常使用的一些库csv、xlwt、json、pandas、pickle、python-docx等

2.数据库,分为关系型数据库、非关系性数据库,如MySQL、MongoDB、HBase等,经常使用的库有pymysql、pymongo、redis等

3.搜索引擎,如Solr、ElasticSearch等,便于检索和实现文本匹配,经常使用的库有elasticsearch、pysolr等

4.云存储,某些媒体文件能够存到七牛云、又拍云、阿里云、腾讯云、Amazon S3等,经常使用的库有qiniu、upyun、boto、azure-storage、google-cloud-storage等。

4.反爬

简单分为费浏览器监测、封IP、验证码、封帐号、字体反爬等

4.1封IP

1.首先寻找手机站点、APP站点,若是存在此类站点,反爬会相对较弱。

2.使用代理,如抓取免费代理、购买付费代理、使用Tor代理、Socks代理等。

3.在代理的基础上维护本身的代理池,防止代理浪费,保证明时可用。

4.搭建ADSL拨号代理,稳定高效。

4.2验证码

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

1.普通图形验证码,若是很是规整且没有变形或干扰,可使用OCR识别,也可使用机器学习、深度学习来进行模型训练,固然打码平台是最方便的方式。

对于算术验证码,推荐直接使用打码平台

对于滑块验证码,可使用破解算法,也能够模拟滑动。后者的关键在于缺口的找寻,可使用图片对比,也能够写基本的图形识别算法,也能够对接打码平台,也可使用深度学习训练识别接口。

对于点触验证码,推荐使用打码平台

对于手机验证码,可使用验证码分发平台,也能够购买专门的收码设备,也能够人工验证。

对于扫二维码,能够人工扫码,也能够对接打码平台。

4.3封帐号

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

寻找手机站点或App站点,此种类别一般是接口形式,校验较弱。

寻找无登陆接口,尽量寻找无需登陆便可爬的接口。

维护Cookies池,使用批量帐号模拟登陆,使用时随机挑选可用cookies使用

5.加速

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

多线程、多进程、异步、分布式、细节优化等

5.1多进程、多线程

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

5.2异步

将爬取能够运行其余任务,如使用asyncio、aiohttp、Tornado、Twisted、gevent、grequests、pyppeteer、pyspider、Scrapy等。

5.3分布式

分布式的关键在于共享爬取队列,可使用:

​ celery:异步任务队列

​ huey:小型多线程任务队列

​ rq:基于Redis的任务队列

​ rabbitmq:灵活可靠的消息队列

​ kafka:分布式消息系统等来实现任务队列的对接,也可使用现成的框架:

​ pyspider:rabbitmq Redis实现分布

​ Scrapy-Redis:基于Redis实现分布

​ Scrapy-Cluster:scrapy分布式系统

5.4优化

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

DNS缓存

使用更快的解析方法

使用更高效的去重方法

模块分离化管控

5.4架构

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

1.将Scrapy项目打包成Docker镜像,使用K8S控制调度过程。

2.将Scrapy项目部署到Scrapyd,使用专门的管理工具如SpiderKeeper、Gerapy等管理

相关文章
相关标签/搜索