互联网防反爬机制的六种反爬技术大解析

Posted 小可爱酥酥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了互联网防反爬机制的六种反爬技术大解析相关的知识,希望对你有一定的参考价值。

目录

前言

反爬虫

仔细分析这七种反爬技术

1、user-agent

2、验证码

3、封IP

4、关联请求上下文

5、JavaScript 参与运算

6、提高数据获取成本


前言

​ 互联网时代,无论在工作上,还是生活上都离不开网络,而网络能给我们带来什么?

新闻,小说,资料,各行业的数据或者报表等等;

​ 比如:快毕业了为了论文,在各种网站上爬取需要的数据进行分析;还有一些为了兴趣爱好,爬取各种类型的图片,视频,文章,数据等。

​ 各网站的开发人员为了约束这种行为,开始绞尽脑汁,采取各种手段去约束爬虫,于是,有了反爬机制!

反爬虫

今天小编来和大家谈谈反爬技术。要了解反爬技术就必须要知道爬虫,所谓爬虫其实就是由计算机自动与服务器交互获取数据的工具。

目前常见而好用的反爬技术有七种,它们分别是:user-agent,验证码,封IP,滑块验证,关联请求上下文,javascript 参与运算以及提高数据获取成本。

 如果对Python爬虫、数据分析、机器学习、人工智能、面试经验、接单兼职、代码画图、游戏代码感兴趣可以进到881744585,群内会有不定期的分享学习资料和有趣的代码。还会有技术大牛,业内同行一起交流技术

仔细分析这七种反爬技术

1、user-agent

数据请求头,最初级的反爬,只要在请求中模拟请求头即可轻松飘过。

解决方法:可以自己设置一下user-agent,或者更好的是,可以从一系列的user-agent里随机挑出一个符合标准的使用

无论是浏览器,程序,还是爬虫,在向服务器发起网络请求时,都会先发送一个请求头文件 headers

比如:

{
  "headers": {
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", 
    "Accept-Encoding": "gzip, deflate, br", 
    "Accept-Language": "zh-CN,zh;q=0.9,zh-HK;q=0.8", 
    "Host": "httpbin.org", 
    "Sec-Fetch-Dest": "document", 
    "Sec-Fetch-Mode": "navigate", 
    "Sec-Fetch-Site": "none", 
    "Upgrade-Insecure-Requests": "1", 
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36", 
    "X-Amzn-Trace-Id": "Root=1-5fe2b4fe-6e4edc1c4dbbe85a3c25492b"
  }
}

# "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36"

请求头大部分的字段主要是浏览器向服务端 “表明自己的身份”用的,很多网站都会建立 user-agent 白名单,只有在正常范围内的 user-agent 才能正常访问 。

user-agent 是一个阅读器标志,用户都是一中阅读器,网站很粗糙的辨别你有咩有作弊,必须要结构不同的阅读器标志,不然就会认为你是爬虫,宁杀错,不放过,你说气不气;

缺点:很容易伪造头部

处理方案:

修改阅读器标志,模拟其他阅读器的标志(定义一个标志库,随机获取一个),能够通过API接口实现各种阅读器的收集模拟;

# 定义 user-agent/标志库
# 第一种方法
def get_user_agent():
    """
    模拟headers的user-agent字段,
    返回一个随机的user-agent字典类型的键值对
    """
    agents = [
    "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36",
    "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
    "Mozilla/5.0 (Windows NT 10.0;) Gecko/20100101 Firefox/61.0",
    "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36",
    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)",
    "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.5; en-US; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15",
    ]
    
    fakeheader = {}
    fakeheader['User-agent'] = agents[random.randint(0,len(agents))]
    return fakeheader

def get_html(url):
    try:
        r= requests.get(url, timeout=30,headers=get_user_agent())
        r.raise_for_status
        r.encoding = r.apparent_encding
        return r.status_code
   except:
    	return "someting wrong!"
    
 # 第二种方法
def get_html():
    agents = [...]
    headers = {
        'User-Agent': random.choice(user_agent_list),
    	'Referer': 'https://www.baidu.com',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7',
        'Cookie': '...'
    }
    try:
        r= requests.get(url, timeout=30,headers=headers)
        r.raise_for_status
        r.encoding = r.apparent_encding
        return r.status_code
   except:
    	return "someting wrong!"

2、验证码

验证码是最常用的反爬虫措施,但简单验证码通过机器学习自动识别,通常正确率能达到50%以上甚至更高。

复杂验证码通过提交到专门的打码平台进行人工打码,依据验证码的复杂度,打码工人平均每码收1-2分钱,成本比较低。也同样容易被绕过,使得数据容易被爬取。

验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。可以防止:恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上用验证码是现在很多网站通行的方式,我们利用比较简易的方式实现了这个功能。这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于 计算机无法解答CAPTCHA的问题,所以回答出问题的用户就可以被认为是人类。

(1)图片验证码

​ 复杂性

​ 打码平台雇佣了人力,专门帮人识别验证码。识别完把结果传回去。总共的过程用不了几秒时间。这样的打码平台还有记忆功能。图片被识别为“锅铲”之后,那么下次这张图片再出现的时候,系统就直接判断它是“锅铲”。时间一长,图片验证码服务器里的图片就被标记完了,机器就能自动识别了。

简单型

​ OCR识别技术(利用python第三方库--tesserocr)来识别,经过灰度变换和二值化后,由模糊的验证码背景变成清晰可见的验证码。对于容易迷惑人得图片验证码,在这种验证码,语言一般自带图形库,添加上扭曲就成了这个样子,我们可以利用9万张图片进行训练,完成类似人的精准度,到达识别验证码的效果

(2)短信验证码

​ 用Webbrowser技术,模拟用户打开短信的行为,最终获取短信验证码。

(3)计算题图片验证码

​ 把所有可能出现的汉字都人工取出来,保存为黑白图片,把验证码按照字体颜色二值化,去除噪点,然后将所有图片依次与之进行像素对比,计算出相似值,找到最像的那张图片

(4)滑块验证码

​ 我们可以利用图片的像素作为线索,确定好基本属性值,查看位置的差值,对于差值超过基本属性值,我们就可以确定图片的大概位置。

滑块验证结合了机器学习技术,只需要滑动滑块,而不用看那些复杂到有时人眼也无法分辨的字母。

但由于部分厂商实现时校验算法较为简单,导致经常只需要相对简单的模拟滑动操作就能绕过,从而使得数据被恶意爬取。类似案例:淘宝,阿里云,淘宝联盟。

(5)图案验证码

​ 对于这种每次拖动的顺序不一样,结果就不一样,我们怎么做来识别呢?

利用机器学习所有的拖动顺序,利用1万张图片进行训练,完成类似人的操作,最终将其识别

利用selenium技术来模拟人的拖动顺序,穷尽所有拖动方式,这样达到是别的效果

(6)标记倒立文字验证码

​ 首先点击前两个倒立的文字,可确定7个文字的坐标, 验证码中7个汉字的位置是确定的,只需要提前确认每个字所在的坐标并将其放入列表中,然后人工确定倒立文字的文字序号,将列表中序号对应的坐标即可实现成功登录。

解决方法:接入第三方验证码平台,实时破解网站得验证码

缺点:影响正常得用户体验操作,验证码越复杂,网站体验感越差。

3、封IP

这是最有效也最容易误杀的方案。该策略建立在 IP 稀有的前提下,目前通过代理池购买,ADSL,或者拨号 VPS 等方式,可以低成本获取数十万的 IP 池,导致单纯的封IP策略效果越来越差。

解决方法:

比较成熟的方式是:IP代理池

简单的说,就是通过ip代理,从不同的ip进行访问,这样就不会被封掉ip了。可是ip代理的获取本身就是一个很麻烦的事情,网上有免费和付费的,但是质量都层次不齐。如果是企业里需要的话,可以通过自己购买集群云服务来自建代理池。

 

4、关联请求上下文

反爬虫可以通过 Token 或网络请求上下文是否进行了完整流程的方式来判断是否真人访问。但对具有协议分析能力的技术人员来说进行全量模拟并没有太大困难。类似案例:知乎,百度登录过程。

5、JavaScript 参与运算

简单的爬虫无法进行 js 运算,如果部分中间结果需要 js 引擎对 js 进行解析和运算,那么就可以让攻击者无法简单进行爬取。但爬虫开发者依然可以通过自带 js 引擎模块或直接使用 phantomjs ,chrome等无端浏览器进行自动化解析。

解决方法:这里就要请出一个大杀器:”PhantomJS“PhantomJS是一个Python包,他可以在没有图形界面的情况下,完全模拟一个”浏览器“,js脚本验证什么的再也不是问题了。

6、提高数据获取成本

当面对的是职业选手时,只能通过提升对方人力成本来实现,比如代码混淆、动态加密方案、假数据,混淆数据等方式,利用开发速度大于分析速度的优势,来拖垮对方的意志。如果对方咬定不放松,那只能持续对抗,直到一方由于机器成本或人力成本放弃。典型案例:汽车之家字体替换,去哪儿网网隐藏在CSS元素坐标中。

以上就是六种反爬技术的解析,大家都弄清楚了吗?

 

以上是关于互联网防反爬机制的六种反爬技术大解析的主要内容,如果未能解决你的问题,请参考以下文章

互联网防反爬机制的六种反爬技术大解析

python学习——xpath

使用python2爬取有道翻译

Python爬虫实践 —— 1.对反爬机制的认识

进击的反爬机制

爬虫抓取技术