社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python爬虫宝典:从爬取网页到App所有思路总结

云云yyds • 2 年前 • 426 次点击  
阅读 22

Python爬虫宝典:从爬取网页到App所有思路总结

爬虫在工作生活中使用非常广泛,无论是论文数据准备还是市场调研还是工作工具等等都十分有用,爬取的目标大部分是网页或App,所以今天就从这两大类分别来进行介绍。

爬虫大纲:

1.网页爬取

对于网页来说,将其划分为了两种类别

  • 服务端渲染
  • 客户端渲染

2.App 爬取

对于 App 来说,我又针对接口的形式进行了四种类别的划分

  • 普通接口

  • 加密参数接口

  • 加密内容接口

  • 非常规协议接口

在这里插入图片描述

一、网页爬取

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

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

对于客户端渲染,划分四个处理方法:

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

二、 App 爬取

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

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

在这里插入图片描述

三、解析

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

这些规则和解析方法其实写起来是很繁琐的,如果我们要爬上万个网站,可以用上智能解析,意思就是说,如果能提供一个页面,算法可以自动来提取页面的标题、正文、日期等内容,同时把无用的信息给刨除。

对于智能解析,分为四个方法划分:

  1. readability 算法,这个算法定义了不同区块的不同标注集合,通过权重计算来得到最可能的区块位置。
  2. 疏密度判断,计算单位个数区块内的平均文本内容长度,根据疏密程度来大致区分。
  3. Scrapyly 自学习,是 Scrapy 开发的组件,指定⻚页⾯面和提取结果样例例,其可⾃自学习提取规则,提取其他同类⻚页⾯面。
  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 等。

这部分的关键在于和实际业务相结合,看看选用哪种方式更可以应对业务需求。 在这里插入图片描述

五、反爬处理手段

反爬这部分是个重点,爬虫现在已经越来越难了,非常多的网站已经添加了各种反爬措施,在这里可以分为非浏览器检测、封 IP、验证码、封账号、字体反爬等。下面主要从封 IP、验证码、封账号三个方面来阐述反爬的处理手段。

1.防止封 IP

对于封 IP 的情况,可以分为几种情况来处理:

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

2.验证码

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

对于普通图形验证码,如果非常规整且没有变形或干扰,可以使用 OCR 识别,也可以使用机器学习、深度学习来进行模型训练,当然打码平台是最方便的方式。

  1. 对于算术题验证码,推荐直接使用打码平台。
  2. 对于滑动验证码,可以使用破解算法,也可以模拟滑动。后者的关键在于缺口的找寻,可以使用图片比对,也可以写基本的图形识别算法,也可以对接打码平台,也可以使用深度学习训练识别接口。
  3. 对于点触验证码,推荐使用打码平台。
  4. 对于手机验证码,可以使用验证码分发平台,也可以购买专门的收码设备,也可以人工验证。
  5. 对于扫二维码,可以人工扫码,也可以对接打码平台。

在这里插入图片描述

3.避免封账号

某些网站需要登录才能爬取,但是一个账号登录之后请求过于频繁会被封号,为了避免封号,可以采取如下措施:

  1. 寻找手机站点或 App 站点,此种类别通常是接口形式,校验较弱。
  2. 寻找无登录接口,尽可能寻找⽆无需登录即可爬取的接口。
  3. 维护 Cookies 池,使⽤用批量账号模拟登录,使⽤时随机挑选可用 Cookies使⽤即可,实现:github.com/Python3WebS…

六、提高爬取速度

当爬取的数据量非常大时,如何高效快速地进行数据抓取是关键。常见的措施有多线程、多进程、异步、分布式、细节优化等。

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. 使用更快的解析方法
  3. 使用更高效的去重方法
  4. 模块分离化管控

5.架构

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

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

到这结束啦,爬虫的好处只有你亲身去体会才知道他有多香,更多Python精彩内容,可以关注我私信我

在这里插入图片描述

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/118794
 
426 次点击