Python 反爬虫——信息验证

文中案例参考 GitHub项目

2 信息验证型反爬虫

2.1 User-Agent反爬虫

  • User-Agent是用户身份识别的重要信息,User-Agent中包含用户浏览器、浏览器引擎、操作系统等信息
  • python的requests库请求时候,服务器读取到的User-Agent信息就是 python-requests/2.21.0
  • User-Agent反爬虫:
    • nginx中加入User-Agent检测,将python,Java,PHP等一些关键词都加入到黑名单中
    • 检测时候,发现含有这些关键词,就认定为是爬虫程序
  • 除了User-Agent头部信息,常用的还有Host,Referer头部信息
      1. Host 描述请求将被发送的目的地,只含域名和端口号;
      1. Origin 请求是从哪里发起的,包括域名和端口号,这个参数一般存在于CORS跨域请求中,
        可以看到response有对应的header: Access-Control-Allow-Origin
      1. Referer 告知服务器请求的原始资源的URI,其用于所有类型的请求,包括:协议+域名+查询参数

2.2 Cookies反爬虫

  • 服务器端,一般是Nginx中加入检测请求头信息中是否有http_cookie信息,然后返回不同的结果。
  • 浏览器正常请求网页,服务器返回的cookie会自动保存在本地,下次访问时候会自动携带
  • 没有携带cookie访问,返回结果都是重定向,一般都是重定向30x,一般都是定位到首页或者登陆页面

2.3 签名验证反爬虫

  • JavaScript异步动态请求类型一般都是xhr(ajax封装对象),可以在请求里面查找类型为xhr的请求,请求源一般都是js文件

  • 请求正文内容里面有特征值是32位(一般是MD5加密后字段),一般可以大胆猜测就是签名验证反爬虫,

  • 加密内容都是使用JavaScript里面的函数生成的,通过进js文件搜索关键字,就可以找到加密字段的生成方式

  • 案例1:

  • 访问一下网址,然后点击查看详情

    • http://www.porters.vip/verify/sign/
    • 上述网址,点击查看详情,查看network
    • 下面网址就是动态加密生成的,直接复制去请求是无效的,网址有多个参数还有时间戳,直接浏览器再次去请求就是无效的
    • http://www.porters.vip/verify/sign/fet?actions=31288&tim=1583827827&randstr=JUBMB&sign=1f46e27e48caacc155fbf9afde6bbbc0
    • 动态加密请求,就是需要破解动态网址是如何生成的
    • 点击查看详情,network里面有一个fet…开头的网址请求,类型是xhr(ajax封装的对象)
  • 查看网址,点击查看详情位置,参考图片005,发现onclick绑定一个fetch()函数

    • 表明点击后执行该函数,函数都是放在js代码里面,head里面发现引入了两个自定义的js文件
    • Chrome检查,查看,右键在js文件上,open in new tab
    • 查看fetch()函数具体内容,函数访问一个动态生成的网址,网页内容插入替换原始网页id="content"标签的内容
    • 然后我们在python中实现该真实网址的生成方式
  • 案例2:

  • 有道翻译加密分析:

    • 打开有道翻译,输入中国,network里面出现一个xhr类型的post请求,请求源Initiator是一个js文件
    • post请求,Request URL: http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule
    • 请求体的formdata里面有很多参数,i就是要翻译的字符串
    • 加密的参数进请求源js文件里面搜索,可以找到参数的生成方式
    • 具体参考006图片
    • 实际有道翻译加密只需要保留formdata中的i和doctype就可以获取翻译后的json数据,直接忽略加密内容
    • 参考006案例

2.4 js动态请求补充:

  • 网页源码中(Name,Status,Type,Initiator,Size,Time,Waterfall)的含义

    • 第一列 Name :请求的名称,一般会将URL 最后一部分内容当作名称
    • 第二列 Status :响应的状态码,显示为 200 代表响应是正常的 通过状态码,我们可以判断发送了请求之后是否得到了正常的响应 。
    • 第三列 Type: 请求的文档类型 。这里为 document ,代表我们这次请求的是 HTML 文档, 内容就是一些 HTML 代码。
    • 第四列 Initiator: 请求源。 用来标记请求是由哪个对象或进程发起的
    • 第五列 Size : 从服务器下载的文件和请求的资源大小。 如果是从缓存中取得的资源,则该列 会显示from cache。
    • 第六列 Time : 发起请求到获取响应所用的总时间
    • 第七列 Waterfall:网络请求的可视化瀑布流
  • 动态ajax请求一般是xhr类型

    • xhr:XMLHttpRequest在后台与服务器交换数据,这意味着可以在不加载整个网页的情况下,对网页某部分的内容进行更新。
      是Ajax的一种用法,而Ajax并不是一门语言,只是一种不需要加载整个网页,只是更新局部内容的技术。

    • 案例:

    • 比较常见的就是网页内容繁多,我们仅仅看评论时,无需整个页面都加载,

    • 那么就可以采用这种方式来实现,只需要在翻页时,局部加载评论的内容即可。

  • js(ajax)动态请求

    • 1、在使用Chrome或者firebug抓取类似网页的内容时,只需要找到xhr类型的url地址,Initiator请求源一般是一个js文件
    • 2、在浏览器地址栏中打开即可看到对应的内容。
    • 3、一般情况为json格式,
    • 4、再利用python等语言抓取json中的需要的内容即可

3 动态渲染反爬虫

3.1 Selenium工具

  • 工具1:Selenium + Chrome + 驱动器 三件套抓取动态渲染网页
    • 缺点:执行效率低,占用系统资源大,不能异步请求

3.2 Puppeteer工具

  • 工具2:Puppeteer(python中的库叫pyppeteer)
  • 安装:
    • 安装命令:
      pip install pyppeteer
      python -m pip install pyppeteer

    • 从GIT安装最新版本:python -m pip install -U git+https://github.com/miyakogi/pyppeteer.git@dev

    • 推荐安装方式:

      • 第一步:需要先安装支持库 pip install tdqm
      • 第二步:pip install pyppeteer
      • 第三步:含有pyppeteer的代码运行时候,会自动下载chromium解压安装(Chrome的实验版)
  • 参考案例008

3.3 Splash异步渲染服务

  • Splash是一个异步的JavaScript的渲染服务,它带有HTTP API的轻量级Web服务器。

  • 可视化界面地址:http://www.porters.vip:8050/

  • 上面地址输入网址,然后render me就可以获取网页的截图、资源加载数据、HTML原始文本

  • 脚本里面也可以自己编写,但是使用的是Lua语言

  • 参考009图片

  • Splash服务也可以和Python语言结合使用

  • 参考案例009

  • 上面三种渲染工具对比:

    • Selenium套件通过驱动浏览器执行操作,本质上是模拟浏览器操作
    • Puppeteer实际上通过API控制Chromium或者Chrome浏览器
    • Splash基于开源的浏览器引擎WebKit
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章