主要有五各方面css
1、爬取html
使用各类方法应对不一样情景下的数据抓取html5
爬取的情景:python
(1)网页爬取mysql
<1>服务端渲染正则表达式
页面的结果是由服务器渲染后返回的,有效信息包含在请求的 HTML 页面里面redis
处理方法:用一些基本的 HTTP 请求库实现爬取,如 urllib、urllib三、pycurl、hyper、requests、grab 等框架,应用较多的是 requests 算法
<2>客户端渲染sql
页面的主要内容由 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、PyV八、js2py 等库来完成
(2)App爬取
<1>普通接口
直接抓包拿到接口的具体请求形式,可用的抓包工具备 Charles、Fiddler、mitmproxy
<2>加密参数接口
一种方法能够实时处理,例如 Fiddler、mitmdump、Xposed 等,另外一种方法是将加密逻辑破解,直接模拟构造便可,可能须要一些反编译的技巧
<3>加密内容接口
使用可见便可爬的工具 Appium;使用 Xposed 来 hook 获取渲染结果;反编译找出加密算法,直接模拟;改写手机底层来实现破解
<4>很是规协议接口
可使用 Wireshark 来抓取全部协议的包,或者使用 Tcpdump 来进行 TCP 数据包截获
2、解析
解析爬取下来的结果并保留有效信息
(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>深度学习
3、存储
选用适合的存储媒介来存储有效信息
(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 等
4、反爬
(1)非浏览器检测
识别Headers里面有没有包含User-Agent
(2)封 IP
<1>寻找手机站点、App站点,若是存在此类站点,反爬会相对较弱
<2>使用代理
<3>在代理的基础上维护本身的代理池,防止代理浪费,保证明时可用
<4>搭建ADSL拨号代理,稳定高效
(3)验证码
对于普通图形验证码,若是很是规整且没有变形或干扰,可使用 OCR 识别,也可使用机器学习、深度学习来进行模型训练,固然打码平台是最方便的方式;
对于算术题验证码,推荐直接使用打码平台;
对于滑动验证码,可使用破解算法,也能够模拟滑动。后者的关键在于缺口的找寻,可使用图片比对,也能够写基本的图形识别算法,也能够对接打码平台,也可使用深度学习训练识别接口;
对于点触验证码,推荐使用打码平台;
对于手机验证码,可使用验证码分发平台,也能够购买专门的收码设备,也能够人工验证;
对于扫二维码,能够人工扫码,也能够对接打码平台;
(4)封帐号
寻找手机站点或 App 站点,此种类别一般是接口形式,校验较弱;
寻找无登陆接口,尽量寻找⽆无需登陆便可爬取的接口;
维护 Cookies 池,使用批量帐号模拟登陆,随机挑选可用 Cookies 使用便可;
字体反爬
5、加速
(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