写点什么

Python 爬虫反爬,你应该从这篇博客开启,UA 反爬,Cookie 特定参数反爬

作者:梦想橡皮擦
  • 2021 年 12 月 19 日
  • 本文字数:2530 字

    阅读完需:约 8 分钟

从本篇博客开始,我们将进入《爬虫 120 例》的反爬章节,给大家准备了 20 篇反爬案例,一次学到位。


反爬理论知识

通过前面的爬虫程序,你或许已经注意到,对于目标站点来说,爬虫程序是机器访问,从目标站点的角度来看,爬虫带来的流量都是**“垃圾流量”**,是完全没有价值的(刷量类爬虫除外)。


为了屏蔽这些垃圾流量,或者为了降低自己服务器压力,避免被爬虫程序影响到正常人类的使用,开发者会研究各种各样的手段,去反爬虫。


爬虫与反爬虫是一对共生关系,有爬虫工程师,就必然存在反爬工程师,很多时候,爬虫工程师与反爬工程师都在斗智斗勇


反爬没有特定的分类,如果一个网站上了反爬代码,一般情况下会使用几种反爬措施搭配使用。

服务器验证请求信息类爬虫

本系列的博客从最简单的反爬手段开始学习,入门级反爬:“User-Agent” 用户代理反爬。

User-Agent

用户代理(User-Agent),表示的是用户的浏览器相关信息,该反爬逻辑是通过服务器端验证请求头中的 User-Agent 参数,然后区分是爬虫程序还是正常的浏览器访问。


访问任意网站,唤醒开发者工具,然后在控制台中输入 navigator.userAgent,就可以获取到 UA 字符串(User-Agent 字符串)。



UA 字符串的格式一般可以这么理解:


平台 引擎版本 浏览器版本信息
复制代码


如果在详细分解,可以得到如下格式:


浏览器标识 (操作系统标识;加密等级;浏览器语言) 引擎版本 浏览器版本信息
复制代码


这样你在看上图所示的内容,就比较容易理解其含义了。


Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36
复制代码


在不同的浏览器测试,你会发现 UA 字符串都以 Mozilla 开头,这是由于历史上的浏览器大战,导致的遗留问题。


下面对比市面上主流的三款浏览器的 UA 字符串。


# 谷歌浏览器Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36# 火狐浏览器Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.0# IE11 浏览器Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; rv:11.0) like Gecko
复制代码


分析上述内容中的相关数据含义


  • Mozilla/5.0:表示浏览器;

  • Windows NT 6.1:操作系统,我这里得到的是 Windows 7 操作系统;

  • Win64/WOW64:64 位操作系统;

  • x64:发行版本;

  • N,I,U:加密等级,这里没有出现;

  • AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36:这个如果你去研究,也有很多趣事,不过咱们理解其是浏览器的版本就可以了。


有了基本的认知之后,我们就可以任意的去编写不同的浏览器标识了(多数时候是从开发者工具中直接复制)


相应的,服务器也能从这个字符串中,识别出访问它的浏览器相关信息(其实操作系统的信息也会被携带过去,甚至它可以验证该 UA 字段是否复合特定的规则)

案例实操环节

拿 CSDN 热榜进行测试,如果不设置 UA 字段,你将获取不到任何返回数据,你可以将下述 headers 置为空值,然后查看运行结果。


import requests
headers = { "user-agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36"}res = requests.get('https://blog.csdn.net/phoenix/web/blog/hot-rank?page=0&pageSize=25', headers=headers)print(res.text)
复制代码


User-Agent 生成可以使用 Python 第三方库,pip install fake_useragent ,也可以自己维护一个 UA 类。与 User-Agent 参数相同的还有 HOSTReferer,都可以认为的设置一些信息进行反爬。

Cookie 反爬虫

使用 Cookie 验证,也是常见的反爬,由于目标站点可遇不可求,所以接下来的内容从理论层面说明,在后续会结合复杂的案例进行实操。


Cookie 反爬虫最简单的手段服务器端使用特殊的 Cookie 值进行验证,如果发现传递过去的 Cookie 值不存在,或者不符合生成规范,则不返回数据。


例如服务器验证固定 Cookie 字段,在前文获取热榜代码中,如果你不携带某些 Cookie 值,那得到的就不是完整的数据(可自行测试,差异值为 username)。


还有一种情况是验证 Cookie 是否符合某种格式,例如 Cookie 由 JS 动态生成,而且复合某种潜在(开发者约定)的规则,那该 Cookie 值传递到后台之后,后台工程师直接验证该值即可实现反爬效果,例如 Cookie 规则为 123abc123,前面 3 个随机数,后面 3 个随机数,中间三个随机小写字母,那后台工程师就可以通过正则验证客户端传递的 Cookie 值,是否复合规则,不符合,直接返回异常信息。


当然这种手段很容易被识别出来,进一步还可以加入时间戳,后台工程师拿到 Cookie 中的时间戳之后,验证当前时间的差值,如果超过了某个值,也可以认为该 Cookie 是伪造的。


Cookie 还被用于用户身份的验证,例如很多站点的数据只有登录之后才可以访问,原因是 Cookie 记录了用户信息,Cookie 的这个应用场景比较多,例如华为云博客的系统消息页面


https://developer.huaweicloud.com/usercenter/mysysmessage


点击之后会跳转到登录页面,但如果你在请求头携带 Cookie 访问,则得到对应内容,其中最重要的一个 Cookie 字段是 HWS_ID,测试代码如下,你可以从开发者工具中复制出对应的 Cookie 字段访问该页面。


import requestsfrom lxml import etree
headers = { "user-agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36", "cookie": '你的HWS_ID Cookie值;'}res = requests.get('https://developer.huaweicloud.com/usercenter/mysysmessage', headers=headers, allow_redirects=False)with open("./1.html", "w", encoding="utf-8") as f: f.write(res.text)elements = etree.HTML(res.text)print(elements.xpath("//title/text()"))
复制代码

订阅时间

今天是持续写作的第 <font color=red>269</font> / 365 天。可以<font color=#04a9f4>关注</font>我,<font color=#04a9f4>点赞</font>我、<font color=#04a9f4>评论</font>我、<font color=#04a9f4>收藏</font>我啦。


发布于: 3 小时前阅读数: 5
用户头像

爬虫 100 例作者,蓝桥签约作者,博客专家 2021.02.06 加入

6 年产品经理+教学经验,3 年互联网项目管理经验; 互联网资深爱好者; 沉迷各种技术无法自拔,导致年龄被困在 25 岁; CSDN 爬虫 100 例作者。 个人公众号“梦想橡皮擦”。

评论

发布
暂无评论
Python爬虫反爬,你应该从这篇博客开启,UA反爬,Cookie 特定参数反爬