Python爬虫从0到1(第十一天)——反爬入门

一、反爬与反反爬

1.1 反爬的类型

  • 信息校验型:例如用户身份的验证
  • 动态渲染型:动态数据
  • 文本混淆型:字体加密、CSS偏移反爬
  • 特征识别型:爬虫特征

1.2 反反爬的介绍

反反爬的主要思路->尽可能的去模拟浏览器对服务器发起请求,浏览器中认为如何操作,代码中就如何去实现。

例如:浏览器中先请求了url1,然后获取到服务器返回的cookie保存在本地,然后再去请求url2,此时就会带上url1返回的cookie进行请求,如果没有携带这个cookie就会请求失败

1.2.1 请求头参数验证
1.2.1.1 通过User-Agent字段来反爬
  • 反爬原理:默认情况下,通过requests库发起请求的时候是没有User-Agent字段的,因此服务器直接认出了我们的爬虫(裸奔)
  • 解决办法:在请求之前,将User-Agent封装到请求头中进行请求,最好是搭建一个UA池
1.2.1.2 referer字段验证
  • 反爬原理:默认情况下并没有携带referer字段
  • 解决办法:添加referer字段(例如B站评论、腾讯课堂评论)
1.2.1.3 cookie验证
  • 反爬原理:服务器通过cookie来验证用户的身份是否是正常访问用户身份,通过为访问用户设定一定的特征参数实现,如果目标网站并不需要登录,那么只需要带上上一次返回的cookie进行请求即可,使用session最佳
  • 解决办法:携带着网站中返回的cookie进行访问,如果网站需要登录,那么通过搭建账号池来进行请求,或者通过账号池进一步搭建cookie池
1.2.2 通过js来反爬

正常情况下,浏览器会自动运行服务器返回的js代码,然后将js代码执行后的结果进行渲染后显示在浏览器中,所以,就目前市场上存在的网站而言,基本上99%的网站的页面都是经过了js渲染之后的结果。

1.2.2.1 通过js实现数据的加密
  • 反爬原理:通过js代码将数据或者需要验证的参数进行加密
  • 解决办法:模拟数据或参数的加密

二、MD5与base64加密介绍(js常见加密)

Hash,译做“散列”,也有直接音译为“哈希”的。把任意长度的输入,通过某种hash算法,变换成固定长度的输出,该输出就是散列值,也称摘要值。该算法就是哈希函数,也称摘要函数。

MD5的固定长度为128比特,16字节,通常用他的16进制字面值输出他,是一个长度为32位的字符串

2.1 MD5加密算法

MD5是一种被广泛使用的线性散列算法,能够产生一个128位(16字节)的散列值(hash),用于确保信息传输完整的一致性。并且MD5加密之后产生的是一个固定长度(32位或16位)的数据。

正常情况下MD5是不存在解密的。但是理论上MD5是可以进行反向暴力破解。暴力破解的大致原理就是试用大量的不同数据来加密之后跟已有的加密数据进行对比。但是,暴力破解所消耗的成本是特别大的,所以正常情况没有人愿意去暴力破解一个MD5加密的密码。

2.1.1 MD5加密算法的特点
  1. md5加密不可逆,安全度相对较高
  2. 不管是多长的字符串,都能生成32位的字符串

Python中MD5加密的使用

"""
md5加密的介绍
    123 》 qwere
    明文 》 密文
    1212121 》 qwere

md5特点:
    密文长度固定
    不能够反解析
"""
import hashlib
a = '123'
# hexdigest将MD5 hash值转换为16进制数字字符串
print(hashlib.md5(a.encode()).hexdigest())

a = '123qwqwqwqw'
# hexdigest将MD5 hash值转换为16进制数字字符串
print(hashlib.md5(a.encode()).hexdigest())

md5在线解密: https://www.cmd5.com/

一些简单的密文可以通过工具解密出来,但是复杂的就无法解密

因为加密过程会出现损失

2.1.2 加盐操作

从原来的H§编程了H(p+salt),相当于哈希函数H发生了变化,每次哈希计算使用的salt是随机的,如果H发生了改变,则已有的表数据就完全无法使用,必须针对特定的H重新生成,这样就提高了破解的难度。

import hashlib
a = '123'  # 密码  123 > qwe      123a > qwer
b = a + 'qwerty'
res_a = hashlib.md5(b.encode()).hexdigest()
print(res_a)

2.2 base64伪加密

Base64是一种用64个字符来表示任意二进制数据的方法。base64是一种编码方式而不是加密算法,只是看上去像是加密而已。

Base64使用A-Z,a-z,0-9,+,/这64个字符实现对数据的加密

加密步骤:

  1. 取得明文对应的二进制编码;
  2. 每3个字节组成一个单元,再把每个单元内的3字节变成4个字节,变化方法是:把原来的38=24个比特位,分成 46=24个比特位,且在每6个比特位前面加2个0,这样就组成了4个字节(如果,序列最后不够3个字节,例如剩余2 个字节或是1个字节,也要看成是一个单元最后变成4个字节,不足的用=号表示);
  3. 查找base64位编码表,把转换后的字节用对应的字符表示,这样,原来的明文就用base64加密了;
"""
加密方式 -- base64

可以反解析 解密
"""

import base64

a = '123'
b = '123456789'
c = '456789'
# b64encode 加密
res_a = base64.b64encode(a.encode()).decode()
res_b = base64.b64encode(b.encode()).decode()
res_c = base64.b64encode(c.encode()).decode()

print(res_a)
print(res_b)
print(res_c)
"""
/017-代码/lx_07_base64加密.py
MTIz
MTIzNDU2Nzg5
NDU2Nzg5
"""

"""
反解析
"""
a = 'MTIz'
b = 'MTIzNDU2Nzg5'
c = 'NDU2Nzg5'
#  b64decode 解密
res_a = base64.b64decode(a.encode()).decode()
res_b = base64.b64decode(b.encode()).decode()
res_c = base64.b64decode(c.encode()).decode()

print(res_a)
print(res_b)
print(res_c)

那么如果在网站中遇到了反爬手段需要我们去逆向的话思路应该如何去进行解决呢?下一章节开始,我们将由简单到复杂为大家带来几个js逆向的经典案例!

你可能感兴趣的:(python,爬虫,开发语言)