主要有五各方面
一、爬取
使用各种方法应对不同情景下的数据抓取
爬取的情景:
(1)网页爬取
<1>服务端渲染
页面的结果是由服务器渲染后返回的,有效信息包含在请求的 HTML 页面里面
处理方法:用一些基本的 HTTP 请求库实现爬取,如 urllib、urllib3、pycurl、hyper、requests、grab 等框架,应用较多的是 requests
<2>客户端渲染
页面的主要内容由 JavaScript 渲染而成,真实的数据是通过 Ajax 接口等形式获取的
处理方法:
A.寻找Ajax接口
用 Chrome/Firefox 的开发者工具直接查看 Ajax 具体的请求方式、参数等内容,还可以通过设置代理抓包来查看接口(如 Fiddler/Charles)然后用 HTTP 请求库模拟
B.模拟浏览器执行
适用于网页接口和逻辑较为复杂的情况,可以直接以可见即可爬的方式进行爬取,如可以使用 Selenium、Splinter、Spynner、pyppeteer、PhantomJS、Splash、requests-html 等来实现
C.直接提取JavaScript 数据
此种情形适用于真实数据没有经过 Ajax 接口获取,而是直接包含在 HTML 结果的某个变量中,直接使用正则表达式将其提取
D.模拟执行JavaScript
某些情况下直接模拟浏览器执行效率会偏低,如果把 JavaScript 的某些执行和加密逻辑摸清楚了,可以直接执行相关的 JavaScript 来完成逻辑处理和接口请求,比如使用 Selenium、PyExecJS、PyV8、js2py 等库来完成
(2)App爬取
<1>普通接口
直接抓包拿到接口的具体请求形式,可用的抓包工具有 Charles、Fiddler、mitmproxy
<2>加密参数接口
一种方法可以实时处理,例如 Fiddler、mitmdump、Xposed 等,另一种方法是将加密逻辑破解,直接模拟构造即可,可能需要一些反编译的技巧
<3>加密内容接口
使用可见即可爬的工具 Appium;使用 Xposed 来 hook 获取渲染结果;反编译找出加密算法,直接模拟;改写手机底层来实现破解
<4>非常规协议接口
可以使用 Wireshark 来抓取所有协议的包,或者使用 Tcpdump 来进行 TCP 数据包截获
二、解析
解析爬取下来的结果并保留有效信息
(1)普通解析:
<1>正则表达式,常用库re
<2>XPath,常用库lxml、Scrapy Selector
<3>CSS Selector,常用库pyquery、cssselect
<4>JSON、XML,使用json、xml2dict
(2)智能解析
<1>readability 算法
<2>疏密度判断
<3>Scrapyly 自学习
<4>深度学习
三、存储
选用适合的存储媒介来存储有效信息
(1)文件
如 JSON、CSV、TXT、图片、视频、音频等,常用的一些库有 csv、xlwt、json、pandas、pickle、python-docx 等
(2)数据库
分为关系型数据库、非关系型数据库,如 MySQL、MongoDB、HBase 等,常用的库有 pymysql、pymssql、redis-py、pymongo、py2neo、thrift
(3)搜索引擎
如 Solr、ElasticSearch 等,便于检索和实现⽂本匹配,常用的库有 elasticsearch、pysolr 等
(4)云存储
如七牛云、又拍云、阿里云、腾讯云、Amazon S3 等,常用的库有 qiniu、upyun、boto、azure-storage、google-cloud-storage 等
四、反爬
(1)非浏览器检测
识别Headers里面有没有包含User-Agent
(2)封 IP
<1>寻找手机站点、App站点,如果存在此类站点,反爬会相对较弱
<2>使用代理
<3>在代理的基础上维护自己的代理池,防止代理浪费,保证实时可用
<4>搭建ADSL拨号代理,稳定高效
(3)验证码
对于普通图形验证码,如果非常规整且没有变形或干扰,可以使用 OCR 识别,也可以使用机器学习、深度学习来进行模型训练,当然打码平台是最方便的方式;
对于算术题验证码,推荐直接使用打码平台;
对于滑动验证码,可以使用破解算法,也可以模拟滑动。后者的关键在于缺口的找寻,可以使用图片比对,也可以写基本的图形识别算法,也可以对接打码平台,也可以使用深度学习训练识别接口;
对于点触验证码,推荐使用打码平台;
对于手机验证码,可以使用验证码分发平台,也可以购买专门的收码设备,也可以人工验证;
对于扫二维码,可以人工扫码,也可以对接打码平台;
(4)封账号
寻找手机站点或 App 站点,此种类别通常是接口形式,校验较弱;
寻找无登录接口,尽可能寻找⽆无需登录即可爬取的接口;
维护 Cookies 池,使用批量账号模拟登录,随机挑选可用 Cookies 使用即可;
字体反爬
五、加速
(1)多线程/进程
使用多进程和多线程可以大大提高抓取效率,如使用 threading、multiprocessing 等
(2)异步
将爬取过程改成非阻塞形式,当有响应式再进行处理,否则在等待时间内可以运行其他任务,如使用 asyncio、aiohttp、Tornado、Twisted、gevent、grequests、pyppeteer、pyspider、Scrapy 等
(3)分布式
共享爬取队列,可以使用 celery、huey、rq、rabbitmq、kafka 等来实现任务队列的对接,也可以使用现成的框架 pyspider、Scrapy-Redis、Scrapy-Cluster 等
(4)优化
<1>DNS缓存
<2>使用更快的解析方法
BeautifulSoap的lxml模式比html5lib模式快很多
<3>使用更高效的去重方法
基于Redis去重相对更高效,对接BloomFilter实现更快更节省空间
<4>模块分离化管控
<1>将Scrapy项目打包为Docker镜像,用K8S控制调度过程
<2>将Scrapy项目部署到Scrapyd,使用专用的管理工具管理,如SpiderKeeper、Gerapy
参考资料
链接:https://pan.baidu.com/s/1dGozl8FahrxnSZdEetOyRA
提取码:ci8b
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/20499.html