爬虫系列 --- 反爬机制和破解方法汇总和加密手段

反爬机制和破解方法汇总

一什么是爬虫和反爬虫?
爬虫:使用任何技术手段,批量获取网站信息的一种方式。
反爬虫:使用任何技术手段,阻止别人批量获取自己网站信息的一种方式。
二 Headers and referer 反爬机制
*headers进行反爬是最常见的反爬虫策略。
*还有一些网站会对 Referer (上级链接)进行检测(机器行为不太可能通过链接跳转实现)
从而实现爬虫。

headers 知识补充***
host:提供了主机名及端口号
Referer 提供给服务器客户端从那个页面链接过来的信息(有些网站会据此来反爬)
Origin:Origin字段里只包含是谁发起的请求,并没有其他信息.(仅存于post请求)
User agent: 发送请求的应用程序名(一些网站会根据UA访问的频率间隔时间进行反爬)
proxies: 代理,一些网站会根据ip访问的频率次数等选择封ip.
cookie: 特定的标记信息,一般可以直接复制,对于一些变化的可以选择构造.
(session=requests.session()自动把cookie信息存入response对象中)

Accept首部为客户端提供了一种将其喜好和能力告知服务器的方式
首部            描述

Accept          告诉服务器能够发送哪些媒体类型

Accept-Charset      告诉服务器能够发送哪些字符集

Accept-Encoding     告诉服务器能够发送哪些编码方式(最常见的是utf-8)

Accept-Language     告诉服务器能够发送哪些语言

Cache-control: 这个字段用于指定所有缓存机制在整个请求/响应链中必须服从的指令

三 ip限制
限制ip访问频率和次数进行反爬.

解决措施:构造自己的 IP 代理池,然后每次访问时随机选择代理(但一些 IP 地址不是非常稳定,需要经常检查更新)

四 UA限制
UA使用户访问网站时候的浏览器标识.
温馨提醒:
当然如果反爬对时间还有限制的话,可以在requests 设置timeout(最好是随机休眠,这样会更安全稳定,time.sleep())

解决措施,构建自己的UA池,每次python做requests访问时随机挂上UA标识,更好的模拟浏览器行为.
超级简单的请求头fake_useragent库(https://www.jianshu.com/p/b76df35aec93)

#随机请求头
import requests
from fake_useragent import UserAgent
ua = UserAgent()
headers = {‘User-Agent’: ua.random}
url = ‘待爬网页的url’
resp = requests.get(url, headers=headers)
##待补充 请求加睡眠时间

五.验证码反爬虫或者模拟登陆
图片验证码:通过简单的图像识别是可以完成
验证码识别的基本方法:截图,二值化、中值滤波去噪、分割、紧缩重排(让高矮统一)、字库特征匹配识别。

六 Ajax动态加载
Ajax动态加载的工作原理是:从网页的 url 加载网页的源代码之后,会在浏览器里执行JavaScript程序。
这些程序会加载出更多的内容,并把这些内容传输到网页中。这就是为什么有些网页直接爬它的URL时却
没有数据的原因。
解决方案:若使用审查元素分析”请求“对应的链接(方法:右键→审查元素→Network→清空,点击”加载更多
“,出现对应的GET链接寻找Type为text/html的,点击,查看get参数或者复制Request URL),循环过程。如果“请求”之前有页面,依据上一步的网址进行分析推导第1页。以此类推,抓取抓Ajax地址的数据。对返回的json使用requests中的json进行解析,使用eval()转成字典处理

抓包工具推荐:fiddler

七.cookie限制
一次打开网页会生成一个随机cookie,如果再次打开网页这个cookie不存在,那么再次设置,第三次打开仍然不存在,这就非常有可能是爬虫在工作了.

解决措施:在headers挂上相应的cookie或者根据其方法进行构造.

MD5加密和RSA加密

1.MD5加密

MD5(单向散列算法)的全称是Message-Digest Algorithm 5(信息-摘要算法),MD5算法的使用不需要支付任何版权费用。

MD5的功能:

①.输入任意长度的信息,经过处理,输出为128位的信息(数字指纹);
  ②.不同的输入得到的不同的结果(唯一性);
  ③.根据128位的输出结果不可能反推出输入的信息(不可逆),也就是只能加密,不能解密;

MD5的用途:

1、防止被篡改:
   1)比如发送一个电子文档,发送前,我先得到MD5的输出结果a。然后在对方收到电子文档后,对方也得到一个MD5的输出结果b。如果a与b一样就代表中途未被篡改。2)比如我提供文件下载,为了防止不法分子在安装程序中添加木马,我可以在网站上公布由安装文件得到的MD5输出结果。3)SVN在检测文件是否在CheckOut后被修改过,也是用到了MD5.

  2、防止直接看到明文:
  现在很多网站在数据库存储用户的密码的时候都是存储用户密码的MD5值。这样就算不法分子得到数据库的用户密码的MD5值,也无法知道用户的密码(其实这样是不安全的,后面我会提到)。(比如在UNIX系统中用户的密码就是以MD5(或其它类似的算法)经加密后存储在文件系统中。当用户登录的时候,系统把用户输入的密码计算成MD5值,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这不但可以避免用户的密码被具有系统管理员权限的用户知道,而且还在一定程度上增加了密码被破解的难度。)

  3、防止抵赖(数字签名):
  这需要一个第三方认证机构。例如A写了一个文件,认证机构对此文件用MD5算法产生摘要信息并做好记录。若以后A说这文件不是他写的,权威机构只需对此文件重新产生摘要信息,然后跟记录在册的摘要信息进行比对,相同的话,就证明是A写的了。这就是所谓的“数字签名”。

我们强大的支付宝使用MD5加密,正式因为MD5强大的用途。

2.RSA加密

①.RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名。

②.RSA加密是可逆的,一个字符串可以经rsa加密后,经加密后的字符串传到对端如服务器上,再进行解密即可。前提是服务器知道解密的私钥,当然这个私钥最好不要再网络传输。

③.RSA以它的三个发明者Ron Rivest, Adi Shamir, Leonard Adleman的名字首字母命名,这个算法经受住了多年深入的密码分析,虽然密码分析者既不能证明也不能否定RSA的安全性,但这恰恰说明该算法有一定的可信性,目前它已经成为最流行的公开密钥算法。
   ④.RSA的安全基于大数分解的难度。其公钥和私钥是一对大素数(100到200位十进制数或更大)的函数。从一个公钥和密文恢复出明文的难度,等价于分解两个大素数之积(这是公认的数学难题)。

RSA的公钥、私钥的组成,以及加密、解密的公式可见于下表:

RSA的安全性:

在RSA密码应用中,公钥KU是被公开的,即e和n的数值可以被第三方窃听者得到。破解RSA密码的问题就是从已知的e和n的数值(n等于pq),想法求出d的数值,这样就可以得到私钥来破解密文。从上文中的公式:d ≡e-1 (mod((p-1)(q-1)))或de≡1 (mod((p-1)(q-1))) 我们可以看出。密码破解的实质问题是:从Pq的数值,去求出(p-1)和(q-1)。换句话说,只要求出p和q的值,我们就能求出d的值而得到私钥。
   当p和q是一个大素数的时候,从它们的积pq去分解因子p和q,这是一个公认的数学难题。比如当pq大到1024位时,迄今为止还没有人能够利用任何计算工具去完成分解因子的任务。因此,RSA从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。
  然而,虽然RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价。即RSA的重大缺陷是无法从理论上把握它的保密性能如何。
  此外,RSA的缺点还有:A)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密。B)分组长度太大,为保证安全性,n 至少也要 600 bits 以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;且随着大数分解技术的发展,这个长度还在增加,不利于数据格式的标准化。因此,使用RSA只能加密少量数据,大量的数据加密还要靠对称密码算法。

我相信这么强大的加密方式想要破解,几乎不可能吧。这也是RSA用在支付宝加密中的原因。

你可能感兴趣的:(爬虫系列,---,反爬机制和破解方法汇总)