动态网页抓取(什么是爬虫?反爬的出发点是什么?(上))
优采云 发布时间: 2022-02-25 23:23动态网页抓取(什么是爬虫?反爬的出发点是什么?(上))
?作者|leo
01 什么是爬行动物?
爬虫,顾名思义,就像一个探索、模拟人类行为的小型机器人,传播到网络的各个角落,按照一定的规则采集和组织数据,并反馈回来。这是一个非常形象的描述爬行原理的方式。
从技术角度看,爬虫主要是根据一定的程序规则或技术指标,通过网络请求获取资源,然后通过一定的分析方法提取所需的信息,并将获取的资源存储起来。
02 为什么会出现反爬虫?
你见过的最奇怪的验证码是什么?不管是考小学数学的验证码,还是考人文知识的验证码,现在越来越多的奇葩验证码出现,这在一定程度上给我们参观者带来了很多不便,但他们真正的目的不是为了给用户增加难度,而是为了防止大多数不受控制的访问机器人。
爬虫的访问速度和目的很容易发现与普通用户不同。大多数爬虫都有无节制地大量爬取访问目标的行为。这些访问请求会给访问目标带来巨大的服务器压力。以及不必要的资源投入,因此经常被运营商定义为“垃圾流量”。
因此,运营商为了更好地维护自身利益,会根据爬虫的特点采取不同的手段来阻止大量爬虫的访问。
根据反爬的起点,反爬的限制方法可分为:
? 主动限制:开发者会通过技术手段主动限制爬虫的访问请求,如:验证请求头信息、限制重复访问同一个ip、验证码技术等。
? 被动限制:为了在不降低用户体验的情况下节省访问资源,开发者采用了间接的技术手段限制爬虫访问,如:动态网页加载、数据分段加载、鼠标悬停预览数据等。
? 根据具体的反爬虫实现方式,大致可分为:信息验证反爬虫、动态渲染反爬虫、文本混淆反爬虫、特征识别反爬虫。爬虫和反爬虫无异于一场攻防的博弈,既有竞争又有相互促进的可能。
常见的反爬策略及对策:
信息验证爬虫:
一种。User-Agent 发送爬虫:
基本原理:可以向服务器发送请求的客户端有多种形式,可以是不同类型的个人电脑、手机、平板电脑、编程程序,也可以是网络请求软件。服务器应该如何识别这些不同的客户端?结尾?
User-Agent 就是用户发送请求时附加的请求信息的记录。其主要格式包括以下部分:
**浏览器 ID(操作系统 ID、加密级别 ID;浏览器语言)渲染引擎 ID 版本信息**
例如:
Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, 像 Gecko)
User-Agent的反爬主要是通过对User-Agent头域的值进行校验。如果黑名单中有值,则会被服务器屏蔽。
例如Python常用的Requests库,如果发送请求时没有设置header参数,服务器读取User-Agent的值为python-requests/2.21.0
湾。Cookies 反爬虫
Cookies不仅可以用来存储网络用户的身份信息或保持登录状态,还可以作为反爬虫的识别信息。
主要原理是客户端访问服务端时,服务端会返回Set-Cookie头域,客户端存储信息,再次访问服务端时携带相应的cookie信息。此时,服务器只需要验证cookie是否符合要求即可。规则没问题,如果不匹配,就会重定向到另一个页面,并在响应中添加 Set-Cookie 头字段和 Cookie 值。
上述验证cookies的方法只是一种比较简单的反爬机制。爬虫工程师只需要复制浏览器请求头中的cookie即可轻松规避。这时候cookie验证往往结合javascript文件生成随机cookie值进行验证。:
**Cookie名称+3个小于9的随机正整数+5个随机大写字母+6个小于9的正整数+3个随机大写字母**
这种机制仍有被重复使用的可能。即使加上cookie过期时间也不能完全保证cookie的重用。在这种情况下,需要结合上述方法引入时间戳进行进一步判断。取出cookie值的时间戳和当前时间。对邮票进行差值计算,如果超过一定时间,就会被认定为伪造。
C。签名验证反爬虫:
主要原理是在发送请求时,将客户端生成的一些随机数和不可逆的MD5加密字符串发送给服务器。服务器使用相同的方法进行随机值计算和MD5加密。如果MD5值相等,则表示请求正常,否则返回403.
目前这种反爬虫方法广泛应用于各种大型网站,绕过它不仅需要从XHR信息中查找相关请求信息,还需要在Javascript代码中查找加密方法.
动态渲染反爬虫:
动态网页常用于改善用户体验,节省资源消耗,提高响应速度。不是直接针对爬虫程序的反爬措施,而是无意中产生反爬效果,爬虫程序没有页面渲染。功能,但是一旦遇到动态渲染的页面,就无法完全返回所需的信息。
比如我们要爬取英雄联盟中的英雄名字并下载对应的图片时,使用requests库按照原来的爬取方式进行爬取,会发现获取到的字段都是空值。主要原因是网站使用了javacript动态加载技术,只有找到核心js传输代码才能找到对应的信息。
通过网页检查工具,我们可以清楚的看到 hero_list.js 文件中存放了所有的英雄信息,以及对应的英雄图片链接和详情页信息。
那么我们在分析信息的时候,需要针对js文件来做。
动态渲染的主要解决方案:
动态渲染技术组合非常灵活。如果每次遇到这样的网站都要分析接口、参数和javascript代码逻辑,时间和成本会高很多。那么直接提取渲染结果页面的能力对于爬虫分析来说会简单很多。目前主要的渲染提取工具有:Puppeter、Selenium、Splash。
2.1 硒
Selenium 是解决动态渲染最常用的技术之一。
浏览器驱动程序是 Selenium 向浏览器发送指令或传递渲染结果的主要工具。
目前驱动一般从以下网址下载:
[]()
我们可以通过简单的代码提取相应的信息。
from selenium import webdriver
url = 'https://www.udemy.com/course/network-security-course/'
driver = webdriver.Chrome()
res = driver.get(url)
course = driver.find_element_by_css_selector('.clp-lead__title').text.replace('\n','')
print(course)
driver.quit()
2.2 傀儡师
在使用 Selenium 进行数据爬取时,执行大批量的任务显然需要很长时间。这时候我们要介绍一种异步加载和提取数据的方法,就是Puppeter方法,它是谷歌开源的Node库。除了拥有一组高级 API 来控制浏览器之外,它还提供了许多手动操作的替代方案,最重要的是,它支持异步。
import asyncio
from pyppeter import launch
async def main():
browser = await launch()
page = await browser.newPage()
await page.goto('https://www.udemy.com/course/network-security-course/')
res = await page.xpath("//*[@class='clp-lead__title']")
text = await(await res[0].getProperty('textContent')).jsonValue()
print(text)
await browser.close()
asyncio.get_event_loop().run_until_complete(main())
2.3 分布式渲染服务Splash
Splash 应用于分布式爬取需求。假设我们想在更多的机器上运行爬虫程序,是否可以通过安装 Puppeter 和 Selenium 组件来完成?显然没有。
Splash 是一个带有轻量级 Web 浏览器的异步 Js 渲染服务。当我们将它部署在云端时,多个爬虫可以通过同一个 API 访问渲染的页面。
动态网页的广泛应用,不仅提升了用户体验,也在一定程度上限制了爬虫程序的使用。页面解析结合动态渲染技术解决了80%以上复杂页面的爬取,但效率远不如直接解析javascript。文件速度很快,往往要花很多时间才能找到网站入口和js文件的位置。因此,具体技术需要根据实际情况灵活运用。
03 文本混淆和反爬虫
文本混淆可以有效防止爬虫获取Web应用中的文本数据。通过混淆文本信息来限制爬虫获取数据的技术手段称为文本混淆反爬虫。
文字混淆和反爬虫的前提是不影响普通用户的体验,所以文字混淆不能直接显示,所以开发者通常使用CSS特性来实现混淆。
常见的文本混淆方法包括:图像伪装、文本映射、自定义字体
3.1 图片伪装
该方法使用图片替换原创文本信息,使得直接提取文本的方法无效。例如:电话
电话
这段代码是某个网站的截取代码,通过图片的方式伪装了原文电话号码。因此,如果要获取这些信息,简单的爬虫方法是不可能实现的,那么主要应对措施是什么?
这里主要需要的是光学字符识别技术,对于纯文本信息,可以很容易的实现,没有像素干扰。在 python 中,我们主要使用 PyTesseract 库来提取图像文本。
3.2 SVG 映射反爬虫
SVG是一种基于XML描述图形的二维矢量图形格式,图形质量不受图形放大或缩小的影响。这个特性在 Web网站 中被广泛使用。
使用SVG映射反爬虫的主要原理是映射不同的字符串和不同的数字。当服务器进行数据解析时,进行相关处理,然后浏览器进行渲染,最终达到隐藏信息的目的。
绕过SVG映射可以通过提取数据对应的相关信息来解决。如下图所示,我们最终通过在html代码中找到class-to-numbers的映射关系得到电话号码信息。
mappings = {
'vhk08k':0, 'vhk6zl':1,'vhk9or':2,'vhkfln':3,'vhkbvu':4,'vhk84t':5,'vhkvxd':6,
'vhkqsc':7,'vhkkj4':8,'vhk0f1':9,
}
html_class = ['vhkbvu','vhk08k','vhkfln','vhk0f1']
phone_num = [mappings.get(i) for i in html_class]
print(phone_num)
目前主流的反爬虫技术表明:
除上述爬虫技术外,还包括常见的验证码识别反爬虫。它的主要实现机制是通过各种动态生成的验证码来防止爬虫访问网页信息,所以绕过验证码也是目前的技术。难点,传统的文字和图形验证码可以通过光学识别来解决,而动态滑块验证码和逻辑操作验证码只能通过多种技术的结合来实现。
另一种常见的反爬虫是特征识别反爬虫。如果你尝试过爬取Boss直接招聘网页上的信息,你会发现无论是使用常规爬取方式还是使用Selenium动态渲染工具,还是分析Javascript文件,基本上都无法有效提取相关数据,并且返回值都是空值。主要原因是目标站采用WebDriver特征识别。主要原理是反爬虫程序可以识别发送请求的客户端的webdriver属性是否由webdriver驱动。要访问的话,绕过方法也是基于这个属性。webdriver 检测的主要结果有三个:true、false 和 undefined。当我们使用渲染工具拥有webdriver属性时,返回值为真,那么我正在触发验证。可以通过在此属性之前将其更改为 false 或 undefined 来规避此识别。
以上就是对目前主流的反爬技术和绕行策略的简单介绍。在这场攻防博弈中,核心思想是如何分析对手的执行机制,以便更好地提出解决方案。当然,涉及的也很多。深入的理论知识,也有大量的人为逻辑陷阱在其中,所以掌握爬虫技术,实践和理论学习同等重要。
目前主流的反爬虫技术表明:
除上述爬虫技术外,还包括常见的验证码识别反爬虫。它的主要实现机制是防止爬虫通过各种状态下生成的验证码访问网页信息,所以绕过验证码也是目前的技术。难点,传统的文字和图形验证码可以通过光学识别来解决,而动态滑块验证码和逻辑操作验证码只能通过多种技术的结合来实现。
另一种常见的反爬虫是特征识别反爬虫。如果你尝试过爬取Boss直接招聘网页上的信息,你会发现无论是使用常规爬取方式还是使用Selenium动态渲染工具,还是分析Javascript文件,基本上都无法有效提取相关数据,并且返回values 都是空值。
主要原因是目标站采用了WebDriver特征识别。主要原理是反爬虫程序可以识别发送请求的客户端的webdriver属性是否通过webdriver驱动的浏览器访问。
那么绕过的方法也是围绕着这个属性来的。webdriver 检测的主要结果有三个:true、false 和 undefined。当我们使用渲染工具有webdriver属性时,返回值为true,那么我会在触发之前验证这个属性。将其修改为 false 或 undefined 可以绕过这种识别。
以上就是对目前主流的反爬技术和绕行策略的简单介绍。在这场攻防博弈中,核心思想是如何分析对手的执行机制,以便更好地提出解决方案。当然,涉及的也很多。深入的理论知识,也有大量的人为逻辑陷阱在其中,所以掌握爬虫技术,实践和理论学习同等重要。