zl程序教程

您现在的位置是:首页 >  后端

当前栏目

网络爬虫笔记

2023-09-14 09:00:01 时间

主要有五各方面

一、爬取

使用各种方法应对不同情景下的数据抓取

爬取的情景:

  (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