无头浏览器与请求签名技术-Cloudflare防护

爬虫代理

在实际数据采集实践中,许多目标网站(例如 Amazon)都会采用 Cloudflare 等防护措施,防止机器人和非正常流量。本文将分享一个故障场景下的排查与改进方案,讲述如何利用无头浏览器、请求签名技术以及爬虫代理 IP来实现数据采集。

本文结构如下:

  • 时间轴呈现方案进程
  • 方案分析
  • 架构改进方案

时间轴呈现方案进程

  1. 初次尝试(T0):
    在最初采集 Amazon 商品信息时,使用常规的请求方式(如 Python 的 requests 库)直接访问目标页面,但由于 Cloudflare 的机制,返回了验证码页面或直接拒绝访问。
  2. 排查与调试(T1):
    经过详细分析,确认 Cloudflare 主要通过检测 Cookie、User-Agent 以及请求行为来判断是否为真实用户。传统的请求方式难以模拟完整的浏览器环境,导致防护措施生效。
  3. 引入无头浏览器(T2):
    为了完整地执行页面中的 JavaScript,并获取有效的 Cookie 信息,开始采用 Selenium 等无头浏览器方案。同时,利用代理 IP 技术规避单 IP 访问过于集中的风险。
  4. 请求签名技术落地(T3):
    在无头浏览器获取到 Cookie 信息后,通过对目标 URL 与 Cookie 的加密计算,生成请求签名。将签名附加到后续请求中,进一步模拟浏览器真实行为,绕过 Cloudflare 的二次验证。
  5. 系统测试与数据提取(T4):
    经过多次调试后,成功采集到 Amazon 上的商品标题、价格和评价等信息,同时整个流程在代理支持下实现了稳定的运行。

方案分析

Cloudflare 防护主要依赖以下几方面来辨识是否为正常用户请求:

  • Cookie 策略: Cloudflare 会在首次访问时生成一系列 Cookie,并要求后续请求带上这些 Cookie,否则将视为异常流量。
  • User-Agent 检测: 非浏览器默认的 User-Agent 或者缺失相关头信息的请求容易被直接屏蔽。
  • 行为监测与签名验证: 通过对请求 URL 及 Cookie 等信息进行加密计算,生成签名,验证请求是否来自真实用户。

传统的 HTTP 请求难以满足上述条件,因此本文引入了无头浏览器技术。通过 Selenium 模拟完整的浏览器行为,可以获取到 Cloudflare 设置的 Cookie,再结合自定义的请求签名算法(例如 MD5 散列计算),将签名附加到请求中,从而绕过防护。同时,采用爬虫代理技术,利用代理 IP、用户名和密码等信息,确保请求来源的多样性,进一步降低被限制的风险。


架构改进方案

在当前方案基础上,为提高系统的稳定性和扩展性,建议从以下几个方面进行架构改进:

  1. 无头浏览器集群化部署:
    利用 Docker 或 Kubernetes 部署无头浏览器集群,实现并发采集任务的分布式调度。这样既可以提高采集效率,也能避免单节点故障导致整个系统中断。
  2. 签名算法优化:
    根据目标网站的动态检测机制,持续调整和优化签名生成算法。可以考虑通过机器学习等方式不断学习目标网站的防护规则,实现自适应的请求签名策略。
  3. 代理池管理:
    构建一个自动化代理池,动态监控代理 IP 的可用性,并自动切换故障代理。参考爬虫代理的接入方式,实现代理IP的自动认证和更新。
  4. 多层次容错机制:
    在请求失败或防护触发时,设置重试、延时等容错机制,同时记录失败日志,方便后续问题排查与数据补采。
  5. 数据清洗与存储:
    对采集到的数据进行实时清洗、去重,并存储到数据库中。可以利用异步消息队列对爬虫任务进行解耦,提升系统整体的健壮性。

示例代码

下面给出一个基于 Selenium 的无头浏览器示例代码,展示如何设置代理、Cookie、User-Agent,并生成请求签名以采集 Amazon 商品信息。代码中引用了爬虫代理的域名、端口、用户名和密码(请根据实际情况替换)。

import time
import hashlib
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import Bydef generate_signature(url, cookies):"""模拟生成请求签名的逻辑这里简单地将 URL 与所有 cookie 拼接后计算 MD5 值,实际中可能需要更复杂的算法"""raw = url + ''.join([cookie['name'] + cookie['value'] for cookie in cookies])return hashlib.md5(raw.encode('utf-8')).hexdigest()def scrape_amazon_product(product_url):# 设置 Chrome 无头浏览器选项chrome_options = Options()chrome_options.add_argument("--headless")  # 开启无头模式# 设置代理 IP,参考亿牛云爬虫代理的配置(www.16yun.cn)proxy_host = "proxy.16yun.cn"  # 代理服务器域名proxy_port = "8080"               # 代理端口proxy_user = "16YUN"           # 代理用户名proxy_pass = "16IP"           # 代理密码# 如果代理需要认证,则需要构造代理认证字符串,此处为简单示例proxy = f"{proxy_host}:{proxy_port}"chrome_options.add_argument(f'--proxy-server=http://{proxy}')# 设置 User-Agent 模拟真实浏览器user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"chrome_options.add_argument(f'user-agent={user_agent}')# 初始化 webdriver(确保已安装对应的 chromedriver 并配置到环境变量中)driver = webdriver.Chrome(options=chrome_options)try:# 访问目标页面(Amazon 商品页面)driver.get(product_url)# 等待页面加载及 Cloudflare 防护检测通过(根据实际情况调整等待时间)time.sleep(5)# 获取页面 Cookie,用于生成请求签名cookies = driver.get_cookies()signature = generate_signature(product_url, cookies)print("生成的请求签名:", signature)# 提取商品信息(标题、价格、评价等)# 商品标题product_title = driver.find_element(By.ID, "productTitle").text if driver.find_elements(By.ID, "productTitle") else "无商品标题"# 商品价格(价格可能位于不同的元素中,此处仅为示例)try:product_price = driver.find_element(By.ID, "priceblock_ourprice").textexcept Exception as e:product_price = "价格信息获取失败"# 商品评价(同样,评价信息的获取可能因页面结构不同而变化)try:product_review = driver.find_element(By.ID, "acrCustomerReviewText").textexcept Exception as e:product_review = "评价信息获取失败"print("商品标题:", product_title)print("商品价格:", product_price)print("商品评价:", product_review)finally:# 关闭浏览器driver.quit()if __name__ == '__main__':# 示例目标商品链接(请替换为实际存在的商品链接)target_url = "https://www.amazon.com/dp/B08N5WRWNW"scrape_amazon_product(target_url)

代码说明

  • 无头浏览器设置: 通过 chrome_options.add_argument("--headless") 启用无头模式,以便在后台静默运行浏览器。
  • 代理 IP 配置: 利用爬虫代理提供的域名、端口、用户名和密码,设置代理服务器,从而规避单 IP 请求风险。
  • User-Agent 与 Cookie: 在启动浏览器时,设置 User-Agent 参数;同时,浏览器执行页面中的 JavaScript 后能自动获取 Cloudflare 下发的 Cookie,这为后续请求签名提供数据支持。
  • 请求签名: 通过将目标 URL 与 Cookie 拼接后计算 MD5 散列值,模拟生成请求签名。

总结

在面对 Cloudflare 防护和复杂网站反爬机制时,单一的 HTTP 请求方案往往难以奏效。通过引入无头浏览器,可以完整模拟真实用户的浏览行为;结合请求签名技术,进一步通过 Cookie 与请求参数的加密验证,实现了对防护机制的绕过。同时,采用爬虫代理 IP确保了请求的分散性与稳定性。

未来,通过无头浏览器集群化、代理池管理及签名算法优化,可以不断提升数据采集的效率与成功率,为故障排查及架构改进提供更加成熟的解决方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/73022.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Cloud之注册中心之Nacos健康监测和环境隔离

目录 Nacos健康检查 两种健康检查机制 Nacos服务类型实例 Nacos环境隔离 创建namespace 配置namespace Nacos健康检查 两种健康检查机制 Nacos作为注册中⼼, 需要感知服务的健康状态, 才能为服务调⽤⽅提供良好的服务. Nacos 中提供了两种健康检查机制: 客⼾…

Vue3实战学习(Element-Plus常用组件的使用(输入框、下拉框、单选框多选框、el-image图片))(上)(5)

目录 一、Vue3工程环境配置、项目基础脚手架搭建、Vue3基础语法、Vue3集成Element-Plus的详细教程。(博客链接如下) 二、Element-Plus常用组件使用。 &#xff08;1&#xff09;el-input。(input输入框) <1>正常状态的el-input。 <2>el-input的disable状态。 <3…

微服务——网关、网关登录校验、OpenFeign传递共享信息、Nacos共享配置以及热更新、动态路由

之前学习了Nacos&#xff0c;用于发现并注册、管理项目里所有的微服务&#xff0c;而OpenFeign简化微服务之间的通信&#xff0c;而为了使得前端可以使用微服务项目里的每一个微服务的接口&#xff0c;就应该将所有微服务的接口管理起来方便前端调用&#xff0c;所以有了网关。…

2025年3月11日(有限元牛顿迭代法:通俗讲解与示例)

牛顿迭代法的正确流程解释 是的&#xff0c;你的理解基本正确&#xff01;但需要更准确地描述内外力的关系和迭代逻辑。以下是更清晰的步骤说明&#xff1a; 核心流程&#xff08;修正版&#xff09; 假设已知 外力 ( F_{\text{ext}} )&#xff08;如2000 N&#xff09;&…

爬虫的精准识别:基于 User-Agent 的正则实现

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

【AI大模型】LLM训练deepseek如何识别视频

要让像DeepSeek这样的大语言模型&#xff08;LLM&#xff09;具备视频识别能力&#xff0c;需要结合多模态学习技术&#xff0c;将视觉信息与文本语义进行融合。以下是实现这一目标的关键步骤和技术要点&#xff1a; --- 一、视频识别的核心挑战 1. 多模态数据&#xff1a;视频…

【物联网-以太网-W5500】

物联网-以太网-W5500 ■ W5500-简介■■■■ ■ W5500-简介 ■ ■ ■ ■

centos linux安装mysql8 重置密码 远程连接

1. 下载并安装 MySQL Yum 仓库 从 MySQL 官方网站下载并安装 Yum 仓库配置文件。 # 下载MySQL 8.0的Yum仓库包 wget https://dev.mysql.com/get/mysql80-community-release-el7-5.noarch.rpm # 安装Yum仓库包 sudo rpm -ivh mysql80-community-release-el7-5.noarch.rpm2. 启…

C++【类和对象】(超详细!!!)

C【类和对象】 1.运算符重载2.赋值运算符重载3.日期类的实现 1.运算符重载 (1).C规定类类型运算符使用时&#xff0c;必须转换成调用运算符重载。 (2).运算符重载是具有特殊名字的函数&#xff0c;名字等于operator加需要使用的运算符&#xff0c;具有返回类型和参数列表及函数…

【面试】Java 多线程

多线程 1、什么是线程和进程2、创建线程有几种方式3、线程有几种状态4、什么是上下文切换5、什么是守护线程&#xff0c;和普通线程有什么区别6、什么是线程池&#xff0c;如何实现的7、Executor和Executors的区别8、线程池处理任务的流程9、线程数设定成多少更合适10、执行exe…

宿主机运行pyspark任务读取docker hadoop容器上的数据

熬了四个大夜才搞明白&#xff0c;最晚一天熬到早上十点/(ㄒoㄒ)/~~&#xff0c;最后发现只要加个参数就解决了。。。抱头痛哭 问题描述&#xff1a; Hadoop集群部署在docker容器中&#xff0c;宿主机执行pyspark程序读取hive表 问题一&#xff1a;当master(local[*])时&…

《平凡的世界》:在泥土中寻找星辰的勇气

“平凡不是平庸的代名词&#xff0c;而是千万人用脊梁扛起时代的勋章。”——路遥的《平凡的世界》用百万字书写了黄土地上孙少安、孙少平两兄弟的挣扎与觉醒&#xff0c;撕开了“奋斗逆袭”的浪漫滤镜&#xff0c;告诉你&#xff1a;真正的英雄主义&#xff0c;是在认清了生活…

【SpringMVC】深入解析使用 Postman 和浏览器模拟将单个与多个参数传递到后端和后端接收过程

SpringMVC—请求(Request) 访问不同的路径&#xff0c;就是发送不同的请求&#xff1b;在发送请求时&#xff0c;可能会带一些参数&#xff0c;所以学习Spring的请求&#xff0c;主要是学习如何传递参数到后端以及后端如何接收&#xff1b; 我们主要是使用 浏览器 和 Postman …

04 | 初始化 fastgo 项目仓库

提示&#xff1a; 所有体系课见专栏&#xff1a;Go 项目开发极速入门实战课&#xff1b;欢迎加入我的训练营&#xff1a;云原生AI实战营&#xff0c;一个助力 Go 开发者在 AI 时代建立技术竞争力的实战营&#xff1b;本节课最终源码位于 fastgo 项目的 feature/s01 分支&#x…

Docker 安装成功后,安装 Dify 中文版本的步骤

Docker 安装成功后&#xff0c;安装 Dify 中文版本的步骤如下1&#xff1a; 克隆 Dify 代码仓库&#xff1a;在终端中执行以下命令&#xff0c;将 Dify 源代码克隆至本地环境。 bash git clone https://github.com/langgenius/dify.git进入 Dify 的 docker 目录&#xff1a; b…

RPC服务调用深度解析:从原理到Java实践

一、RPC的核心原理与架构设计 1.1 RPC的本质 RPC&#xff08;Remote Procedure Call&#xff09;是一种分布式系统间通信协议&#xff0c;允许程序像调用本地方法一样调用远程服务。其核心目标是通过位置透明性和协议标准化隐藏网络通信细节。RPC的调用流程可抽象为以下步骤&…

电脑的写字板如何使用?

打开写字板&#xff1a; 直接按一下键盘上的win R 键&#xff0c;然后输入&#xff1a;write &#xff0c; 再按一下回车 , 即可打开写字板 可以在里面写文字 和 插入图片等… &#xff0c; 如下所示&#xff1a; 保存写字板内容&#xff1a; 当我们写好了之后&#xff0c;…

医疗AI测试实战:如何确保人工智能安全赋能医疗行业?

一、医疗AI测试的重要性 人工智能&#xff08;AI&#xff09;正广泛应用于医疗行业&#xff0c;如疾病诊断、医学影像分析、药物研发、手术机器人和智能健康管理等领域。医疗AI技术的应用不仅提高了诊断效率&#xff0c;还能降低误诊率&#xff0c;改善患者治疗效果。然而&…

AI日报 - 2025年3月12日

AI日报 - 2025年3月12日 &#x1f31f; 今日概览&#xff08;60秒速览&#xff09; ▎&#x1f916; AGI突破 | Anthropic CEO预测AI将主导代码编写 &#x1f52c; 自训练技术显著提升LLM思维清晰度 ▎&#x1f4bc; 商业动向 | OpenAI与CoreWeave达成119亿美元基建协议 &…

跳表数据结构

跳表&#xff08;Skip List&#xff09;是一种支持高效插入、删除和查找的链表结构&#xff0c;用于加速查找操作&#xff0c;特别适用于有序数据集合。它在Redis、LevelDB等系统中被用于**有序集合&#xff08;Sorted Set&#xff09;**的实现。 1. 跳表的结构 跳表的核心思…