当前位置: 首页 > news >正文

Datawhale-爬虫

task1-初始爬虫

爬虫用python好,python库多,功能全


反爬机制和反反爬机制

顾名思义,一个是防范爬虫的,一个是应对限制爬虫的方法

好的,我们来更深入地探讨反爬机制和反反爬策略的细节,包括具体的技术手段、实现原理和对抗逻辑。这是一个持续演进的“猫鼠游戏”。

一、反爬机制 (Anti-Scraping Mechanisms) - 网站的防御盾牌

网站采用反爬机制的主要目的是:

1.  保护服务器资源:防止爬虫过度消耗带宽、CPU和内存,影响正常用户访问。
2.  保障数据安全与商业利益: 防止敏感数据、价格信息、用户内容、知识产权等被大规模抓取和滥用。
3.  维护服务稳定性:防止爬虫导致的突发流量高峰(DDoS效应)使服务瘫痪。
4.  遵守法规与隐私: 防止爬取受法律保护(如GDPR, CCPA)或个人隐私的数据。
5.  控制数据访问权限: 确保只有授权用户(如付费用户)才能访问特定数据。
6.  提升垃圾信息门槛: 防止自动化脚本批量注册、发帖、刷票等。

常见且详细的反爬技术手段:

1.  基于请求特征的识别与拦截:
    *   User-Agent 检测与过滤: 检查HTTP请求头中的`User-Agent`字段。如果缺失、格式错误、包含常见爬虫库/框架名称(如`python-requests`, `scrapy`, `selenium`等)或明显是伪造的低质量UA,则可能被拦截。**对抗: 使用大量真实浏览器UA轮换,精心伪造完整请求头。
    *   请求头完整性检查: 检查请求头是否包含浏览器通常会发送的字段,如 `Accept`, `Accept-Language`, `Accept-Encoding`, `Connection`, `Referer` (来源页), `Cookie` 等。缺失关键头部的请求会被怀疑。对抗: 模拟真实浏览器的完整请求头集合。
    *   IP 地址频率限制与封禁:
        *   速率限制 (Rate Limiting): 限制单个IP在单位时间(秒/分/小时)内对特定API或页面的请求次数。超出阈值则返回429错误或临时封禁。
        *   IP 封禁 (IP Banning): 对触发规则(如高频请求、访问敏感路径、触发蜜罐)的IP进行长时间或永久封禁。
        *   IP 信誉库: 使用第三方IP信誉服务,直接拦截已知数据中心IP(云服务器、代理服务器)或标记为恶意的IP。对抗: 大规模、高质量的代理IP池(住宅代理 > 数据中心代理,轮换频繁),分布式爬虫架构。
    *   请求频率与模式异常检测: 分析请求的时间间隔(过于规律或极短)、访问路径顺序(不符合用户正常浏览逻辑)、页面停留时间(极短)等行为模式。对抗: 在请求间加入随机延迟,模拟人类浏览路径和速度。

2.  基于会话与身份验证的防护:
    *   强制登录/注册: 将目标数据放在需要用户登录后才能访问的页面。对抗: 模拟登录流程(处理表单、Cookie/Session保持),购买/获取账号池。
    *   Cookie/Token 验证:
        *   首次访问设置复杂Cookie或Token,后续请求必须携带并验证其有效性。
        *   利用Cookie进行会话跟踪和状态维持,检测异常会话。
        *   生成防篡改的加密Token(如JWT)或签名参数,验证请求合法性。对抗: 仔细分析登录流程和后续请求,完整维护Cookie和Session,逆向工程Token生成算法(难度高)。
    *   验证码 (CAPTCHA):
        *   传统图文验证码: 扭曲、粘连、背景干扰的文字/数字识别。
        *   行为验证码:
            *   滑动拼图: 拖动滑块拼合图片。
            *   点选文字: 按顺序点击图片中的文字。
            *   空间推理: 旋转图片至正确方向。
            *   智能验证: 无感验证,通过分析鼠标轨迹、点击位置、设备信息等隐式判断人机。
        *   二次验证: 在特定操作(如翻页过多)后触发验证码。对抗: 使用OCR库(对简单验证码),接入第三方打码平台(人工识别),使用自动化浏览器+机器学习模型(如基于TensorFlow/PyTorch训练识别模型),尝试绕过触发点(如控制请求频率避免触发)。

3.  基于内容呈现与结构的防护:
    *   JavaScript 渲染与动态加载 (AJAX):关键数据(如列表、价格、详情)不在初始HTML中,而是由浏览器执行JavaScript后,通过AJAX/WebSocket从后端API获取并动态插入DOM。简单的HTTP请求爬虫只能获取“空壳”HTML。对抗: 使用无头浏览器(Headless Browsers)如 Selenium, Puppeteer (Node.js), Playwright, Splash (Scrapy) 等模拟完整浏览器环境执行JS;或通过网络请求分析(浏览器开发者工具的Network面板)找到直接提供数据的API接口并模拟调用。
    *   CSS 样式混淆: 使用CSS类名或样式规则对数据进行视觉伪装或逻辑混淆。
        *   字体映射 (Font Glyph Mapping): 使用自定义字体文件,HTML中的字符编码(如`&#xXXXX;`)对应字体文件中不同的字形(如数字1可能实际显示为5)。爬虫直接提取HTML得到的是乱码。对抗:分析字体文件(`.woff`, `.ttf`)建立编码到实际字符的映射关系。
        *   类名随机化/无意义化: HTML标签的`class`属性每次加载随机生成(如`<div class="j83hx s9k2t">¥100</div>`),无法通过稳定CSS选择器定位。**对抗:** 通过相对位置、标签层级、邻近文本特征或XPath定位;分析JS生成逻辑(如果固定)。
        *   伪元素隐藏: 利用CSS的`::before`, `::after`伪元素和`content`属性插入关键数据,这些内容不在HTML源码里。**对抗:** 使用能渲染CSS的无头浏览器提取完整DOM。
    *   HTML 结构混淆/陷阱:
        *   动态变化的DOM结构: 标签结构、嵌套层级、属性名每次请求可能微调。
        *   蜜罐链接 (Honeypot Traps): 在HTML中插入对用户不可见(`display: none;`, `visibility: hidden;`, 极小尺寸、颜色与背景相同)但对爬虫可见的链接(`<a>`)。爬虫访问这些链接会被记录并封禁IP。对抗: 在解析HTML时忽略隐藏元素或特定样式的元素。
        *   虚假/冗余数据: 插入大量无关或错误数据干扰爬虫解析。

4.  基于API接口的防护:
    *   API 访问令牌 (API Keys/Access Tokens): 要求请求携带唯一密钥,并严格限制调用配额。
    *   参数签名/加密: 要求请求参数按照特定规则排序并加上密钥进行哈希(如HMAC-SHA256)生成签名`sign`,或者对参数进行加密。服务器端验证签名/解密正确性。对抗:逆向工程JS代码中的签名/加密算法(难度高,常混淆)。
    *   GraphQL 查询限制与复杂度分析: 防止恶意构造复杂查询耗尽资源。
    *   WebSockets 协议: 使用非HTTP协议传输数据,增加抓包和分析难度。

5.  其他高级手段:
    *   TLS 指纹/HTTP2 指纹:检测客户端(爬虫库/浏览器)在建立加密连接时的独特特征。
    *   浏览器指纹 (Browser Fingerprinting): 收集浏览器特性(Canvas, WebGL, 字体列表, 插件列表, 屏幕分辨率, 时区, 语言等)生成唯一标识符,追踪和识别爬虫。**对抗:** 使用真实浏览器环境(无头浏览器),但需注意特征暴露;使用插件修改指纹(可能不稳定)。
    *   机器学习行为分析: 在服务端部署ML模型,实时分析用户/爬虫的点击流、鼠标移动轨迹、页面交互模式等,识别自动化行为。**对抗:** 在无头浏览器中模拟更逼真的人类行为(随机移动、滚动、点击延迟),难度极大。
    *   法律声明与 robots.txt: `robots.txt` 文件声明哪些路径允许/禁止爬取(无强制力,但提供法律依据)。清晰的服务条款禁止爬虫。对抗: 法律风险考量,遵守`robots.txt`(至少是尊重),避免爬取明确禁止的数据。

二、反反爬策略 (Anti-Anti-Scraping Strategies) - 爬虫的矛

爬虫开发者的目标是:稳定、高效、低成本地获取目标数据,同时尽量降低对目标网站的影响和规避法律风险。

详细的反反爬策略与技术:

1.  伪装成人类浏览器:
    *   精心伪造请求头: 使用真实、多样化的`User-Agent`,并确保`Accept*`, `Connection`, `Referer`, `Cookie` 等头部完整且合理。工具:`fake_useragent`库。
    *   维持会话状态: 正确处理登录后的`Cookies`和`Session`,并在后续请求中携带。使用`requests.Session()`或自动化浏览器管理会话。
    *   模拟浏览行为:
        *   随机延迟: 在请求间加入随机时间间隔(如 `time.sleep(random.uniform(1, 5))`)。
        *   浏览路径: 模拟用户点击链接的自然顺序,而非直接访问深层链接。
        *   页面停留: 在获取页面后“等待”一段时间再解析或发起下一个请求(尤其在无头浏览器中)。
        *   鼠标移动与滚动 (无头浏览器): 使用自动化浏览器API模拟人类在页面上的随机鼠标移动、滚动操作。

2.  分布式架构与IP管理:
    *   大规模代理IP池:
        *   类型选择: 优先使用住宅代理(IP来自真实家庭宽带,更难被识别)和移动代理,其次是高质量的数据中心代理。避免免费代理(不稳定、不安全、易被封)。
        *   轮换策略: 每个请求/每个会话/达到一定频率后自动切换IP。
        *   代理提供商: 选择可靠、IP池大、更新快的服务商(如BrightData, Oxylabs, Smartproxy等)。
        *   代理协议支持: HTTP(S), SOCKS4/5。
    *   分布式爬虫: 在多台机器(或云服务器)上部署爬虫节点,共享任务队列和结果存储,分散请求源IP和负载。工具:Scrapy-Redis, Celery。

3.  应对验证码:
    *   降低触发频率: 通过控制请求速度、模拟人类行为、维护有效会话,尽量减少触发验证码。
    *   自动化识别 (简单验证码): 使用 `pytesseract` (OCR) + 图像预处理(二值化、降噪、去干扰线)。
    *   第三方打码平台: 将验证码图片发送给平台,由人工打码员识别后返回结果(如Super鹰、图鉴)。需付费,有延迟。
    *   机器学习模型: 针对特定网站的复杂验证码(如点选、滑动),收集标注数据训练CNN等模型进行识别。投入成本高。
    *   自动化浏览器交互 (行为验证码): 使用Selenium/Puppeteer/Playwright的API模拟拖动滑块、点击等操作。可能需要分析JS轨迹生成算法(难度高)或使用预录制的轨迹。
    *   验证码服务集成: 使用如2Captcha, Anti-Captcha等服务的API自动处理验证码(背后也是人工或AI)。

4.  处理动态内容 (JavaScript/AJAX):
    *   无头浏览器:
        *   Selenium: 老牌,支持多语言和浏览器(需对应WebDriver),功能强大但相对慢。
        *   Puppeteer: 官方Chrome/Chromium无头控制库(Node.js),速度快,API现代。
        *   Playwright: 由Puppeteer原团队开发(支持Node.js, Python, .NET, Java),支持Chromium, WebKit, Firefox,功能最全面。
        *   Splash: 基于Webkit的无头浏览器,专为Scrapy设计,轻量高效。
        *   关键: 使用`wait`函数(如`WebDriverWait`, `page.waitForSelector`, `page.waitForFunction`)等待目标元素或数据加载完成再提取。
    *   API 逆向工程:
        *   使用浏览器开发者工具的Network面板,观察页面加载过程中发出的XHR/Fetch请求。
        *   分析请求的URL、方法(GET/POST)、请求头(特别是`Authorization`, `Cookie`, `X-Requested-With`, `Content-Type`)、请求参数(Query String, Form Data, Request Payload - 可能含签名/加密)。
        *   尝试直接模拟这些API请求获取结构化数据(通常是JSON)。这通常比渲染整个页面效率高得多,但需要破解可能的签名/加密机制。

5.  解析混淆数据:
    *   CSS 字体映射:
        *   下载网页中引用的自定义字体文件(.woff, .ttf)。
        *   使用`fonttools`等库解析字体文件,获取字符编码(Unicode codepoint)到字形名称(Glyph name)或轮廓的映射。
        *   对比网页源码中的编码(如`&#xef12;`)和字体映射关系,找到对应的实际字符。可能需要动态维护映射,因为字体文件可能更换。
    *   CSS 类名混淆/伪元素:
        *   无头浏览器渲染: 直接获取渲染后的DOM文本(`element.textContent`, `element.innerHTML`),这是最可靠的方式。
        *   相对定位/XPath: 如果结构相对稳定,使用基于邻近元素、父节点或特定文本模式的XPath定位。
        *   分析JS: 如果类名由固定JS逻辑生成(非完全随机),尝试分析JS代码确定规则。
    *   蜜罐识别: 在解析HTML时,检查元素的CSS样式属性(计算样式`getComputedStyle(element)`),过滤掉`display: none`, `visibility: hidden`, `opacity: 0`, 极小尺寸(`width/height <= 1px`)或位置在视口外的元素。避免点击或跟随这些链接。

6.  应对高级指纹和行为检测:
    *   无头浏览器配置:
        *   启用`--disable-blink-features=AutomationControlled`等标志隐藏自动化特征。
        *   覆盖`navigator.webdriver`属性为`undefined`或`false`。
        *   安装插件(如Puppeteer Extra Stealth Plugin)修改各种浏览器指纹特征(Canvas, WebGL, 字体, 插件列表等)。
        *   模拟不同设备配置文件(分辨率、User-Agent、触摸支持等)。
    *   更精细的行为模拟: 在无头浏览器中,除了点击和输入,加入更随机的鼠标移动轨迹(使用`bezier-curves`模拟人类移动)、滚动的速度和停顿、表单填写的思考时间等。这非常复杂且效果不一定好。

7.  健壮性与容错:
    *   错误处理: 对网络错误(Timeout, ConnectionError)、HTTP错误码(403, 404, 429, 500)、解析失败、验证码出现等情况进行捕获和相应处理(重试、换IP、休眠、记录日志、跳过等)。
    *   重试机制: 对可重试错误(如429, 网络抖动)实施带退避策略的重试(如指数退避)。
    *   状态持久化: 保存爬取进度(URL队列、已爬URL集合、已解析数据),支持断点续爬。
    *   监控与告警: 监控爬虫运行状态、成功率、被封情况,及时告警。

三、核心对抗逻辑与注意事项

*   成本与收益的平衡: 反爬措施越强,反反爬的成本(时间、金钱、技术难度)越高。爬虫开发者需要评估目标数据的价值是否值得投入。
*   持续对抗与更新: 没有一劳永逸的方案。网站会不断升级防御,爬虫脚本也需要持续维护和更新策略。
*   尊重 `robots.txt` 与法律合规: 始终检查目标网站的`robots.txt`文件。即使技术上能绕过反爬,也要考虑服务条款、版权法、数据保护法(GDPR, CCPA, PIPL等)和计算机滥用法。爬取公开数据通常风险较低,但绕过登录抓取私有数据、大规模爬取导致服务中断、侵犯版权或隐私可能面临法律诉讼。
*   道德考量: 避免对目标网站造成过大负担。控制爬取速度,尽量在网站访问低峰期运行。
*   选择合适工具: 根据目标网站的反爬强度选择技术栈。简单网站用`requests`/`BeautifulSoup`;动态网站用`Selenium`/`Playwright`;需要大规模分布式和IP管理用`Scrapy`+代理中间件;破解API优先考虑。

总结:

反爬与反反爬是一场高度技术化的动态博弈。理解双方使用的详细技术原理是制定有效策略的基础。成功的爬虫开发者需要精通网络协议(HTTP/HTTPS)、浏览器工作原理、前端技术(HTML/CSS/JS)、编程、数据分析,并具备逆向工程思维和持续学习能力,同时时刻牢记法律与道德的边界。

(AI生成,仅供参考)

robots协议——表明可以进行爬虫的页面和不能爬虫的页面,提供法律声明

可以使用的库:

from urllib.request import urlopen;import requests——用法有所不同;最开始,我们是爬取页面的源代码

页面渲染

一、所有数据否直接写在HTML中,通过页面源代码获得

二、客户端渲染(前端JS渲染)

客户端第一次请求后,服务器A返回HTML框架(其中有对应数据的服务器地址);

之后,想查看什么数据,请求后,对应服务器B会返回相关数据,填充到对应框架的位置。

协议

简单了解,这里只需认识

HTTP协议:Hyper Text Transfer Protocol(超⽂本传输协议),是⽤于从万维⽹(WWW:World Wide Web )服务器传输超⽂本到本地浏览器的传送协议。浏览器和服务器之间数据交互遵守的就是HTTP协议。

http

请求:(客户端发给服务器)

请求⾏ : 请求⽅式(get/post) 请求url地址 协议
请求头 : 放⼀些服务器要使⽤的附加信息(这些信息中间不能多空一行,每行要连在一起)
请求体 :⼀般放⼀些请求参数(请求头和请求体要用隔开一行)

响应:(服务器对客户端发来的信息的回应,返回给客户端)

状态⾏ : 协议 状态码
响应头 : 放⼀些客户端要使⽤的⼀些附加信息
响应体 : 服务器返回的真正客户端要⽤的内容(HTML,json)等

请求头中最常⻅的⼀些重要内容(爬⾍需要):

  • User-Agent:请求载体的身份标识(⽤啥发送的请求)
  • Referer:防盗链(这次请求是从哪个⻚⾯来的?反爬会⽤到)
  • cookie:本地字符串数据信息(⽤户登录信息,反爬的token)

响应头中⼀些重要的内容:

  • Content-Type:返回内容的内容类型,比如Content-Type: text/html; charset=utf-8
  • 各种神奇的莫名其妙的字符串(这个需要经验了,⼀般都是token字样,防⽌各种攻击和反爬)

写爬虫时,要先自己去看要爬的网页的请求格式(爬虫要先仿造浏览器去请求,get、post的请求格式不同)——上面了解http的知识就是为了这一步;

得到response后,就用相关库的函数来操作。

相关文章:

  • 论文笔记:Trajectory generation: a survey on methods and techniques
  • 【数据结构】图论实战:DAG空间压缩术——42%存储优化实战解析
  • Java线程池全面解析:原理、实现与最佳实践
  • 视频点播web端AI智能大纲(自动生成视频内容大纲)的代码与演示
  • APISIX 简介:云原生 API 网关的架构与实践
  • 提升教学演示效率:基于交互设计的电子教鞭解决方案
  • 【RocketMQ 生产者和消费者】- 消费者重平衡(1)
  • Scale AI 的王晓磊带着对整个 AI 行业动态的深入了解加入 Meta
  • Javascript的新能力:显式资源管理(Explicit Resource Management)
  • Flask入门指南:从零构建Python微服务
  • WinForms视频播放开发实战指南
  • 公钥加密与签名算法计算详解(含计算题例子)
  • 股票T0程序化交易如何做?
  • MySQL的Sql优化经验总结
  • 【配置教程】新版OpenCV+Android Studio环境配置(4.11测试通过)
  • MySQL 中 DISTINCT 去重的核心注意事项详解
  • 【沉浸式解决问题】Mysql中union连接的子查询是否并行执行
  • Python训练营打卡Day50
  • 4 Studying《ARM System Developer’s Guide》9-15
  • 【时时三省】(C语言基础)关于变量的声明和定义
  • 国内好的网站建设/国内重大新闻10条
  • 摄影网站建设需求分析/苏州百度推广排名优化
  • 济阳做网站公司/广告做到百度第一页
  • 杭州电子商务公司排行/网站推广和seo
  • wordpress发送到朋友圈美图/seo综合优化公司
  • 东莞品牌网站建设报价/免费推广网站大全下载安装