Crawler - 常用反爬机制介绍

目录

1. Headers

2. IP限制

3. UA限制

4.验证码反爬虫或者模拟登陆

5.cookie限制

6.Ajax动态加载


1. Headers

用户的headers进行反爬是最常见的反爬虫策略。

相应的解决措施:通过审查浏览器的headers,把相应headers传给python的requests

注:Headers 相关知识:

host:主机名及端口号

Referer:提供给服务器客户端从那个页面链接过来的信息(有些网站会据此来反爬)

Origin:Origin字段包含是谁发起的请求,并没有其他信息。跟Referer不一样的 是Origin字段并没有包含涉及到用户隐私的URL路径和请求内容。

并且Origin字段只存在于POST请求,而Referer则存在于所有类型的请求。

User agent:发送请求的应用程序名(一些网站会根据UA访问的频率间隔时间进行反爬)

proxies: 代理,一些网站会根据ip访问的频率次数等选择封ip

cookie: 特定的标记信息,一般可以直接复制,对于一些变化的可以选择构造

Accept首部为客户端提供了一种将其喜好和能力告知服务器的方式,包括他们想要什么,

可以使用什么,以及最重要的,他们不想要什么。这样服务器就可以根据这些额外信息,对要发送的内容做出更明智的决定。

首部           描述

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

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

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

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

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

Public:所有内容都将被缓存(客户端和代理服务器都可缓存)

Private:内容只缓存到私有缓存中(仅客户端可以缓存,代理服务器不可缓存)

public max-age=xxx (xxx is numeric) 缓存的内容将在 xxx 秒后失效, 这个选项只在HTTP 1.1可用

No-store 不缓存

2. IP限制

用单一的IP地址访问频率过高,服务器会在短时间内禁止这个IP访问。限制网络的出口IP地址,禁止该IP段的使用者进行内容访问,即为IP禁封。

解决措施:构造自己的IP代理池,然后每次访问时随机选择代理 或 购买代理IP

3. UA限制

UA即为用户代理(User-Agent),服务器通过UA识别访问者的身份。当网站针对指定UA的访问,返回异常页面(如403,500)或跳转到其他页面的情况,即为UA禁封。

解决措施:构造自己的UA池,每次python做requests访问时随机挂上UA标识,更好地模拟浏览器行为。当然如果反爬对时间还有限制的话,可以在requests 设置timeout,最好停顿时长随机。

4.验证码反爬虫或者模拟登陆

验证码:如果一个爬虫要解释一个验证码中的内容,这在以前通过简单的图像识别是可以完成的,但是就现在来讲,验证码的干扰线,噪点都很多,甚至还出现了人类都难以认识的验证码。

不是所有爬虫都装备了图像识别技术。其实爬虫处理这些登录页面有什么意义呢?除非你是想爆破密码或者刷xxx什么的。

相应的解决措施:验证码识别的基本方法:截图,二值化、中值滤波去噪、分割、紧缩重排(让高矮统一)、字库特征匹配识别。(python的PIL库或者其他)

5.cookie限制

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

解决措施:在headers挂上相应的cookie或者根据其方法进行构造。如果过于复杂,可以考虑使用selenium模块(可以完全模拟浏览器行为)

6.Ajax动态加载

网页不希望被爬虫拿到数据而使用Ajax动态加载,这样就为爬虫造成了绝大的麻烦,如果一个爬虫不具备js引擎,或者具备js引擎但是没有处理js返回的方案,或者是具备了js引擎但是没办法让站点显示启用脚本设置。基于这些情况,ajax动态加载反制爬虫还是相当有效的。

Ajax动态加载的工作原理是:从网页的 url 加载网页的源代码之后,会在浏览器里执行JavaScript程序。这些程序会加载出更多的内容,并把这些内容传输到网页中。这就是为什么有些网页直接爬它的URL时却没有数据的原因。

处理方法:若使用审查元素分析”请求“对应的链接(方法:右键→审查元素→Network→清空,点击”加载更多“,出现对应的GET链接寻找Type为text/html的,点击,查看get参数或者复制Request URL),循环过程。如果“请求”之前有页面,依据上一步的网址进行分析推导第1页。以此类推,抓取抓Ajax地址的数据。对返回的json使用requests中的json进行解析,使用eval()转成字典处理(上一讲中的fiddler可以格式化输出json数据

猜你喜欢

转载自blog.csdn.net/helunqu2017/article/details/112827137