Python爬虫宝典:从爬取网页到App所有思路总结
Posted yunyun云芸
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python爬虫宝典:从爬取网页到App所有思路总结相关的知识,希望对你有一定的参考价值。
前言
爬虫在工作生活中使用非常广泛,无论是论文数据准备还是市场调研还是工作工具等等都十分有用,爬取的目标大部分是网页或App,所以今天就从这两大类分别来进行介绍。
爬虫大纲:
1.网页爬取
对于网页来说,将其划分为了两种类别
- 服务端渲染
- 客户端渲染
2.App 爬取
对于 App 来说,我又针对接口的形式进行了四种类别的划分
-
普通接口
-
加密参数接口
-
加密内容接口
-
非常规协议接口
一、网页爬取
服务端渲染的意思就是页面的结果是由服务器渲染后返回的,有效信息包含在请求的 html 页面里面,比如猫眼电影这个站点。客户端渲染的意思就是页面的主要内容由 javascript 渲染而成,真实的数据是通过 Ajax 接口等形式获取的,比如淘宝、最右手机版等等站点。
服务端渲染的情况就比较简单了,用一些基本的 HTTP 请求库就可以实现爬取,如 urllib、urllib3、pycurl、hyper、requests、grab
等框架,其中应用最多的可能就是 requests 了。
对于客户端渲染,划分四个处理方法:
- 寻找 Ajax 接口,此种情形可以直接使用 Chrome/Firefox 的开发者工具直接查看 Ajax具体的请求方式、参数等内容,然后用 HTTP 请求库模拟即可,另外还可以通过设置代理抓包来查看接口,如 Fiddler/Charles。
- 模拟浏览器执行,此种情形适用于网页接口和逻辑较为复杂的情况,可以直接以可见即可爬的方式进行爬取,如可以使用Selenium、Splinter、Spynner、pyppeteer、PhantomJS、Splash、requests-html等来实现。
- 直接提取 JavaScript 数据,此种情形适用于真实数据没有经过 Ajax 接口获取,而是直接包含在 HTML结果的某个变量中,直接使用正则表达式将其提取即可。
- 模拟执行 JavaScript,某些情况下直接模拟浏览器执行效率会偏低,如果我们把 JavaScript的某些执行和加密逻辑摸清楚了,可以直接执行相关的 JavaScript 来完成逻辑处理和接口请求,比如使用Selenium、PyExecJS、PyV8、js2py 等库来完成即可。
二、 App 爬取
对于 App 的爬取,这里分了四个处理情况:
- 对于普通无加密接口,这种直接抓包拿到接口的具体请求形式就好了,可用的抓包工具有Charles、Fiddler、mitmproxy。
- 对于加密参数的接口,一种方法可以实时处理,例如 Fiddler、mitmdump、Xposed
等,另一种方法是将加密逻辑破解,直接模拟构造即可,可能需要一些反编译的技巧。 - 对于加密内容的接口,即接口返回结果完全看不懂是什么东西,可以使用可见即可爬的工具 Appium,也可以使用 Xposed 来 hook获取渲染结果,也可以通过反编译和改写手机底层来实现破解。
- 对于非常规协议,可以使用 Wireshark 来抓取所有协议的包,或者使用 Tcpdump 来进行 TCP 数据包截获。
三、解析
解析,对于 HTML 类型的页面来说,常用的解析方法就那几种,正则、XPath、CSS Selector,另外对于某些接口,常见的可能就是 JSON、XML 类型,使用对应的库进行处理即可。
这些规则和解析方法其实写起来是很繁琐的,如果我们要爬上万个网站,可以用上智能解析,意思就是说,如果能提供一个页面,算法可以自动来提取页面的标题、正文、日期等内容,同时把无用的信息给刨除。
对于智能解析,分为四个方法划分:
- 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、验证码、封账号三个方面来阐述反爬的处理手段。
1.防止封 IP
对于封 IP 的情况,可以分为几种情况来处理:
- 首先寻找手机站点、App 站点,如果存在此类站点,反爬会相对较弱。
- 使用代理,如抓取免费代理、购买付费代理、使用 Tor 代理、Socks 代理等。
- 在代理的基础上维护自己的代理池,防止代理浪费,保证实时可用。
- 搭建 ADSL 拨号代理,稳定高效。
2.验证码
验证码分为非常多种,如普通图形验证码、算术题验证码、滑动验证码、点触验证码、手机验证码、扫二维码等。
对于普通图形验证码,如果非常规整且没有变形或干扰,可以使用 OCR 识别,也可以使用机器学习、深度学习来进行模型训练,当然打码平台是最方便的方式。
- 对于算术题验证码,推荐直接使用打码平台。
- 对于滑动验证码,可以使用破解算法,也可以模拟滑动。后者的关键在于缺口的找寻,可以使用图片比对,也可以写基本的图形识别算法,也可以对接打码平台,也可以使用深度学习训练识别接口。
- 对于点触验证码,推荐使用打码平台。
- 对于手机验证码,可以使用验证码分发平台,也可以购买专门的收码设备,也可以人工验证。
- 对于扫二维码,可以人工扫码,也可以对接打码平台。
3.避免封账号
某些网站需要登录才能爬取,但是一个账号登录之后请求过于频繁会被封号,为了避免封号,可以采取如下措施:
- 寻找手机站点或 App 站点,此种类别通常是接口形式,校验较弱。
- 寻找无登录接口,尽可能寻找⽆无需登录即可爬取的接口。
- 维护 Cookies 池,使⽤用批量账号模拟登录,使⽤时随机挑选可用 Cookies使⽤即可,实现:https://github.com/Python3WebSpider/CookiesPool。
六、提高爬取速度
当爬取的数据量非常大时,如何高效快速地进行数据抓取是关键。常见的措施有多线程、多进程、异步、分布式、细节优化等。
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.优化
可以采取某些优化措施来实现爬取的加速,如:
- DNS 缓存
- 使用更快的解析方法
- 使用更高效的去重方法
- 模块分离化管控
5.架构
如果搭建了分布式,要实现高效的爬取和管理调度、监控等操作,我们可以使用两种架构来维护我们的爬虫项目。
- 将 Scrapy 项目打包为 Docker 镜像,使用 K8S 控制调度过程。
- 将 Scrapy 项目部署到 Scrapyd,使用专用的管理工具如 SpiderKeeper、Gerapy 等管理。
到这结束啦,爬虫的好处只有你亲身去体会才知道他有多香,更多Python精彩内容,可以关注我私信我。
以上是关于Python爬虫宝典:从爬取网页到App所有思路总结的主要内容,如果未能解决你的问题,请参考以下文章
python爬虫入门Scrapy框架之CrawlSpider类