爬虫的几种方式(使用什么技术来进行一个爬取数据)
在网页数据爬取中,确实存在多种数据呈现和获取形式,远不止静态HTML解析和简单JS渲染。理解这些形式对于应对不同的反爬机制至关重要:
主要数据获取形式与应对策略
-
纯静态HTML (基础形式)
- 特点: 数据直接嵌入在服务器返回的初始HTML文档中(在
<body>
标签内)。 - 爬取方式: 使用
requests
获取HTML响应,然后用BeautifulSoup
,lxml
,pyquery
等库解析HTML结构(标签、类名、ID、属性)提取数据。 - 优点: 最简单直接。
- 缺点: 对动态内容无能为力,数据格式可能混杂在标签中不易提取。
- 特点: 数据直接嵌入在服务器返回的初始HTML文档中(在
-
JavaScript动态渲染 (AJAX/前端框架)
- 特点: 初始HTML是一个“空壳”或骨架。数据由浏览器执行JavaScript代码后,通过AJAX/XHR/Fetch请求从API获取,并在客户端动态插入/渲染到DOM中。用户交互(滚动、点击)可能触发更多数据加载。页面源码(
View Source
)看不到关键数据。 - 爬取方式:
- 逆向工程API (推荐): 使用浏览器开发者工具(Network面板 - XHR/JS/Fetch/Doc等标签页),分析数据加载时发出的真实HTTP请求(URL、参数、Headers、Cookies、请求体)。找到规律后,用
requests
或httpx
等库直接模拟这些请求获取结构化数据(通常是JSON)。这是最高效、最稳定的方式。 - 无头浏览器 (重量级): 当API极其复杂(如加密参数)、或交互逻辑无法绕过时使用。工具如
Selenium
,Playwright
,Puppeteer
。它们启动真实浏览器(如Chrome, Firefox),执行JS,渲染页面,然后你可以通过其API获取渲染后的HTML或操作页面。
- 逆向工程API (推荐): 使用浏览器开发者工具(Network面板 - XHR/JS/Fetch/Doc等标签页),分析数据加载时发出的真实HTTP请求(URL、参数、Headers、Cookies、请求体)。找到规律后,用
- 优点: 能获取到动态加载的数据。
- 缺点: 逆向API需要技巧和时间;无头浏览器资源消耗大、速度慢、易被检测。
- 特点: 初始HTML是一个“空壳”或骨架。数据由浏览器执行JavaScript代码后,通过AJAX/XHR/Fetch请求从API获取,并在客户端动态插入/渲染到DOM中。用户交互(滚动、点击)可能触发更多数据加载。页面源码(
-
API接口调用 (理想形式)
- 特点: 网站本身有设计良好的、供其前端使用的RESTful或GraphQL API。数据以结构化格式(JSON/XML)返回。
- 爬取方式: 同“逆向工程API”方式。仔细分析请求的认证方式(API Key, Bearer Token, OAuth)、参数、分页逻辑等。
- 优点: 数据纯净、结构化,效率最高。
- 缺点: 需要理解API文档或通过逆向分析;可能有访问频率限制或认证要求。
-
WebSocket实时数据流
- 特点: 用于需要极高实时性的场景(聊天、实时报价、监控仪表盘)。客户端与服务器建立持久连接,数据通过双向通道持续推送。
- 爬取方式: 使用支持WebSocket的库(如Python的
websockets
)。需要模拟建立连接、发送握手/订阅消息、持续监听并解析接收到的数据帧。 - 优点: 能获取实时流数据。
- 缺点: 实现相对复杂;连接可能不稳定;数据量可能巨大;通常需要身份验证。
-
服务器端渲染中的隐藏数据
- 特点: 数据确实在服务器端渲染进了HTML,但并非直接显示在可视文本中。常见形式:
- 内联JSON: 数据以JSON格式嵌入在
<script>
标签内(如window.__INITIAL_STATE__ = {...}
)或HTML元素的data-*
属性中。 - 注释: 数据隐藏在HTML注释中(较少见)。
- 内联JSON: 数据以JSON格式嵌入在
- 爬取方式: 获取HTML后,除了解析可见DOM,还需要:
- 查找特定的
<script>
标签内容,用正则表达式或字符串操作提取JSON字符串,再用json.loads()
解析。 - 查找元素上的
data-*
属性值。 - 扫描HTML文本中的注释内容。
- 查找特定的
- 优点: 数据通常结构化且完整,存在于初始响应中。
- 缺点: 需要额外步骤提取和解析;位置和格式可能变化。
- 特点: 数据确实在服务器端渲染进了HTML,但并非直接显示在可视文本中。常见形式:
-
图片/Canvas/SVG中的文本
- 特点: 关键信息(如价格、电话号码、验证码)被绘制成图片、Canvas元素或SVG图形,而非文本。这是对抗简单文本提取的反爬手段。
- 爬取方式:
- OCR (光学字符识别): 下载图片/截图Canvas/SVG区域,使用OCR库识别(如Python的
pytesseract
+Pillow
)。需要预处理图片(去噪、二值化、调整大小等)提高识别率。 - 逆向绘图逻辑 (极难): 分析生成图片的JS代码逻辑(如果未混淆且逻辑简单)。
- OCR (光学字符识别): 下载图片/截图Canvas/SVG区域,使用OCR库识别(如Python的
- 优点: 能破解这种反爬。
- 缺点: OCR识别率受图片质量、字体、干扰线/点影响;速度慢;处理复杂验证码通常不现实。
关键反爬机制与应对核心
你提到的“Cookie校验”是身份验证和会话管理的一部分,这是爬取动态网站或API时几乎必然会遇到的核心问题:
-
Cookie/Session:
- 作用: 服务器识别用户会话状态(是否登录、用户身份、临时令牌等)。首次访问后,服务器通过
Set-Cookie
Header下发Cookie,浏览器后续请求自动携带。 - 爬取应对:
- 模拟登录: 用
requests.Session()
对象(保持Cookie)或手动管理Cookie,先发送登录请求(POST用户名/密码),获取并保存服务器返回的Cookie(如sessionid),后续请求带上这个Cookie。 - 携带初始Cookie: 有些页面需要特定Cookie(非登录态)才能访问,需在首次请求时带上。
- 分析Cookie依赖: 有些Cookie(如
__cf_bm
用于Cloudflare防护)需要先获取才能访问后续资源。
- 模拟登录: 用
- 作用: 服务器识别用户会话状态(是否登录、用户身份、临时令牌等)。首次访问后,服务器通过
-
Token认证:
- 作用: 更现代的认证方式,如JWT。Token通常在登录后返回(可能在响应体或Header如
Authorization: Bearer
),后续请求需在Header中携带。 - 爬取应对: 登录后提取Token,在后续请求的
Authorization
Header中设置。
- 作用: 更现代的认证方式,如JWT。Token通常在登录后返回(可能在响应体或Header如
-
动态参数签名/加密:
- 作用: 高级反爬。API请求参数或路径中包含由时间戳、随机数或其他因素生成的、经过加密或签名的值(如
_signature
,X-ASDF-Token
)。生成逻辑在JS中(通常混淆)。 - 爬取应对:
- 逆向JS (最难): 使用Chrome开发者工具(Sources面板)调试JS,定位参数生成函数,理解其逻辑并在Python中复现(可能需要
execjs
,PyExecJS
调用JS引擎)。 - 无头浏览器执行 (取巧): 用Selenium/Playwright执行生成参数的JS代码片段,获取结果。
- 逆向JS (最难): 使用Chrome开发者工具(Sources面板)调试JS,定位参数生成函数,理解其逻辑并在Python中复现(可能需要
- 作用: 高级反爬。API请求参数或路径中包含由时间戳、随机数或其他因素生成的、经过加密或签名的值(如
-
User-Agent / Headers校验:
- 作用: 服务器检查请求头是否像正常浏览器。
- 爬取应对: 设置合理的
User-Agent
和其他常见Headers(如Referer
,Accept
,Accept-Language
)。使用fake_useragent
库轮换UA。
-
IP限制 & 验证码:
- 作用: 限制单个IP的请求频率;在可疑请求时弹出验证码。
- 爬取应对:
- 代理IP池: 使用付费或免费代理IP(HTTP/HTTPS/Socks5),并在请求中轮换。注意代理质量。
- 请求速率控制: 在代码中加入
time.sleep(random.uniform(a, b))
模拟人类操作间隔。 - 验证码处理: 简单图片验证码可尝试OCR(识别率低);复杂验证码(滑动、点选)通常需要人工打码平台(如打码兔、2Captcha)或高级AI模型(成本高)。尽量通过控制请求频率避免触发。
总结与建议
- 优先尝试直接获取结构化数据: 千方百计寻找并模拟API请求,这是最有效的方式。仔细研究Network面板。
- 理解会话与认证: Cookie、Token、动态签名是爬取动态内容的核心门槛。掌握模拟登录和会话保持。
- 按需选择工具:
- 静态/简单动态:
requests
+BeautifulSoup/lxml
(+ 逆向API)。 - 复杂JS渲染/交互:
Selenium
/Playwright
。 - 实时数据流:
websockets
。 - OCR需求:
pytesseract
+Pillow
。 - JS逆向:浏览器调试工具 +
execjs
/node.js
子进程。
- 静态/简单动态:
- 尊重网站规则: 查看
robots.txt
,控制请求频率,避免对目标网站造成过大负担。了解相关法律法规。 - 持续学习与适应: 反爬技术不断进化,爬虫也需要不断调整策略。调试和分析能力是关键。
选择哪种爬取形式取决于目标网站的具体实现和技术栈。成功的爬虫开发者需要熟练掌握多种技术,并具备强大的分析调试能力来应对各种反爬措施。
相关文章:
爬虫的几种方式(使用什么技术来进行一个爬取数据)
在网页数据爬取中,确实存在多种数据呈现和获取形式,远不止静态HTML解析和简单JS渲染。理解这些形式对于应对不同的反爬机制至关重要: 主要数据获取形式与应对策略 纯静态HTML (基础形式) 特点: 数据直接嵌入在服务器返回的初始HT…...
XML 编码:结构化数据的基石
XML 编码:结构化数据的基石 引言 XML(可扩展标记语言)作为互联网上广泛使用的数据交换格式,已经成为结构化数据存储和传输的重要工具。本文旨在深入探讨XML编码的原理、应用场景以及编码规范,帮助读者更好地理解和运用XML。 XML编码概述 1. XML的起源 XML诞生于1998年…...
nt!CcGetVacbMiss函数分析之设置好nt!_VACB然后调用函数nt!SetVacb
第一部分:MmMapViewInSystemCache函数返回 Status MmMapViewInSystemCache (SharedCacheMap->Section, &Vacb->BaseAddress, &NormalOffset, …...

JSP、HTML和Tomcat
9x9上三角乘法表 乘法表的实现 <% page contentType"text/html;charsetUTF-8" language"java" %> <!DOCTYPE html> <html> <head><title>99 上三角乘法表</title><style>body {font-family: monospace;padding…...

(1)pytest简介和环境准备
1. pytest简介 pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,效率更高。根据pytest的官方网站介绍,它具有如下特点: 非常容易上手,入门简单&a…...
Git 入门学习教程
Git 入门学习教程 什么是 Git? Git 是一个分布式版本控制系统,由 Linus Torvalds 为 Linux 内核开发而创建。它可以帮助开发者: 跟踪代码变化协作开发项目回退到之前的版本创建分支进行实验性开发 安装 Git Windows 下载 Git for Windo…...

构建高性能风控指标系统
一、引言 在金融风控领域,指标是风险识别的核心依据。风控平台核心系统之一--规则引擎的运行依赖规则、变量和指标,一个高性能的指标系统非常重要,本文将深入探讨风控平台指标系统的全链路技术实现,涵盖从指标配置到查询优化的完…...
openfeignFeign 客户端禁用 SSL
要针对特定的 Feign 客户端禁用 SSL 验证,可以通过自定义配置类实现。以下是完整解决方案: 1. 创建自定义配置类(禁用 SSL 验证) import feign.Client; import feign.httpclient.ApacheHttpClient; import org.apache.http.conn…...
DeepSeek 赋能自动驾驶仿真测试:解锁高效精准新范式
目录 一、自动驾驶仿真测试概述1.1 自动驾驶发展现状1.2 自动驾驶仿真测试流程 二、DeepSeek 技术剖析2.1 DeepSeek 简介2.2 DeepSeek 核心技术原理 三、DeepSeek 在自动驾驶仿真测试中的应用原理3.1 与自动驾驶仿真测试流程的结合点3.2 如何提升仿真测试效果 四、DeepSeek 在自…...

晨控CK-UR12与西门子PLC配置Modbus TCP通讯连接操作手册
晨控CK-UR12与西门子PLC配置Modbus TCP通讯连接操作手册 晨控CK-UR12系列作为晨控智能工业级别RFID读写器,支持大部分工业协议如RS232、RS485、以太网。支持工业协议Modbus RTU、Modbus TCP、Profinet、EtherNet/lP、EtherCat以及自由协议TCP/IP等。 本期主题:围绕…...

实验一:PyTorch基本操作实验
import torch # PyTorch中初始化矩阵常见有以下几种方法 # 1. 直接使用固定值初始化 # M torch.tensor([[1.0, 2.0, 3.0]]) # 1x3矩阵 # 2. 随机初始化 # M torch.rand(1, 3) # 1x3矩阵,元素在0-1之间均匀分布 # M torch.randn(1, 3) # 1x3矩阵,元…...

可视化大屏通用模板Axure原型设计案例
本文将介绍一款基于Axure设计的可视化大屏通用模板,适用于城市、网络安全、园区、交通、社区、工业、医疗、能源等多个领域。 模板概述 这款Axure可视化大屏通用模板集成了多种数据展示模块和组件,旨在为用户提供一个灵活、可定制的数据展示平台。无论…...
通配符(Wildcard)与正则表达式(Regular Expression)的关系及区别
通配符(Wildcard)与正则表达式(Regular Expression)的关系及区别 1. 通配符(Wildcard) 定义:通配符是用于简单模式匹配的特殊符号,主要用于文件名匹配(如命令行操作&…...

历年山东大学计算机保研上机真题
历年山东大学计算机保研上机真题 2025山东大学计算机保研上机真题 2024山东大学计算机保研上机真题 2023山东大学计算机保研上机真题 在线测评链接:https://pgcode.cn/school 从1到100找质数 题目描述 从 1 1 1 到 100 100 100 中找出所有的质数。 输入格式 …...

Java处理动态的属性:字段不固定、需要动态扩展的 JSON 数据结构
文章目录 引言I `JSONObject` 接收和返回JSONObject 接收和返回数据存储II 签名测试接口dto的定义签名计算III JsonAnySetter 和JsonAnyGetter 注解@JsonAnySetter 的用法@JsonAnyGetter 的用法综合示例引言 应用场景: 签名测试接口、表单配置项、参数列表、插件信息等。技术实…...

MAC电脑怎么通过触摸屏打开右键
在Mac电脑上,通过触摸屏打开右键菜单的方法如下: 法1:双指轻点:在触控板上同时用两根手指轻点,即可触发右键菜单。这是Mac上常用的右键操作方法。 法2:自定义触控板角落:可以设置触控板的右下角或左下角作为右键区域…...

用 Whisper 打破沉默:AI 语音技术如何重塑无障碍沟通方式?
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...

【东枫科技】KrakenSDR 天线阵列设置
标准测向需要五根相同的全向天线。您可以折衷使用更少的天线,但为了获得最佳性能,我们建议使用全部五根天线。这些天线通常是磁铁安装的鞭状天线,或偶极子天线。我们建议始终使用均匀圆形阵列 (UCA) 天线,因为它可以确定来自各个方…...
Spring Boot中的事件与JMS消息集成
Spring Boot事件机制 Spring框架的事件处理是其核心特性之一,通过ApplicationEvent类和ApplicationListener接口实现。在Spring Boot应用中,事件机制是实现模块间消息传递的重要方式,通常用于业务逻辑内部通信。 内置事件类型 Spring应用上下文在启动时会触发多种内置事件…...
ubuntu/windows系统下如何让.desktop/.exe文件 在开机的时候自动运行
目录 1,让 .desktop 文件在 Ubuntu 开机时自动启动 1.1 创建 autostart 目录(如果不存在) 1.2 将 .desktop 文件复制到 autostart 目录 1.3 确保 .desktop 文件有可执行权限 2,windows 2.1 打开「启动」文件夹: 2.2 将 .exe 或快捷方…...

云计算数据治理
知识星球:数据书局。打算通过知识星球将这些年积累的知识、经验分享出来,让各位在数据治理、数据分析的路上少走弯路,另外星球也方便动态更新最近的资料,提供各位一起讨论数据的小圈子 1.摘要 云计算可以推动创新和各行业应用的…...
【Net】TCP粘包与半包
文章目录 TCP粘包与半包1 背景2 粘包(packet stick)3 半包(packet split)4 为什么会出现粘包/半包?5 如何解决?6 示例7 总结 TCP粘包与半包 在网络编程中,粘包和半包问题是常见的 TCP 协议特有…...

【Android】如何抓取 Android 设备的 UDP/TCP 数据包?
目录 前言理解抓包tcpdump 实时抓包Wireshark 解包抓包后的一些思考 前言 在真正接触 UDP/TCP 抓包之前,我一直以为这是一项高深莫测的技术。可当我们真正了解之后才发现,其实并没有那么复杂——不过如此。 所谓的大佬,往往只是掌握了你尚未…...
深度解析 Nginx 配置:从性能优化到 HTTPS 安全实践
引言 Nginx 作为高性能的 Web 服务器和反向代理,其配置灵活性和强大功能备受开发者青睐。本文基于一份生产环境的 Nginx 配置文件,详细拆解其核心配置逻辑,涵盖性能优化、HTTPS 安全配置、反向代理及静态资源处理等关键环节,帮助…...
触发器与存储过程详解
触发器与存储过程详解 1. 触发器(Trigger)基础概念 1.1 定义与特性 go专栏:https://duoke360.com/tutorial/path/golang 触发器是数据库中的一种特殊存储程序,它在特定数据库事件(如INSERT、UPDATE、DELETE)发生时自动执行。触发器具有以下核心特性: 事件驱动:与表事件绑…...
游戏盾与高防CDN的协同防御策略分析
游戏盾与高防CDN的协同防御策略可以从技术互补性、分层防护机制、动态流量调度等角度展开分析,以下为核心要点: 1. 分层防御架构:流量分层过滤 高防CDN边缘层:利用全球分布的边缘节点作为“第一道防线”…...

Scratch节日 | 六一儿童节射击游戏
六一儿童节快乐!这款超有趣的 六一儿童节射击游戏,让你变身小猫弓箭手,守护节日的快乐时光! 🎮 游戏玩法 上下方向键:控制小猫的位置,自由移动,瞄准目标! 空格键&#…...

GPU层次结构(Nvidia和Apple M芯片,从硬件到pytorch)
这里写目录标题 0、驱动pytorch环境安装验证1.window环境2.Mac Apple M芯片环境 1、Nvidia显卡驱动、CUDA、cuDNN关系汇总1**1. Nvidia显卡驱动(Graphics Driver)****2. CUDA(Compute Unified Device Architecture)****3. cuDNN&a…...

一次借助ChatGPT抵御恶意攻击的经历,为个人服务器添加自动防御系统Fail2ban
title: 一次借助ChatGPT抵御恶意攻击的经历,为个人服务器添加自动防御系统Fail2ban tags: 个人成长 categories:杂谈 我有一台个人服务器,托管着自己的WordPress网站,也放了RustDesk这种私有化的远程桌面工具,最近我发现RustDesk…...

(九)深度学习---自然语言处理基础
分类问题回归问题聚类问题各种复杂问题决策树√线性回归√K-means√神经网络√逻辑回归√岭回归密度聚类深度学习√集成学习√Lasso回归谱聚类条件随机场贝叶斯层次聚类隐马尔可夫模型支持向量机高斯混合聚类LDA主题模型 一.文本数据的表示方法 二.神经网络文本情感分析案例 三…...