深入与浅出-Python爬虫逆向实战

一、什么是爬虫逆向?

爬虫逆向,简单来说,就是通过分析网页的前端和后端行为,找出数据的来源和获取方式,从而实现自动化抓取。很多时候,直接使用requestsBeautifulSoup可能无法获取到目标数据,因为数据可能由JavaScript动态加载,或者隐藏在API请求中。逆向工程的目标,就是通过分析这些行为,找到数据的真实来源,并模拟请求获取数据。


二、案例背景:一个动态加载的网页

假设我们遇到了一个动态加载的网页,页面内容通过JavaScript从后端API获取。我们的目标是抓取该页面的数据。为了方便讲解,我们假设目标网页的结构如下:

  • 网页URL:https://example.com/list
  • 页面内容通过JavaScript动态加载,数据来源是一个API接口。
  • 数据展示在页面的<div class="item">标签中,每个<div>包含标题、链接和描述。

三、逆向分析的步骤

1. 使用浏览器开发者工具分析网页

首先,我们需要使用浏览器的开发者工具(如Chrome DevTools)来分析网页的行为。

(1) 查看页面结构

打开开发者工具,进入“Elements”选项卡,查看页面的HTML结构。假设我们发现数据存储在<div class="item">中,每个<div>的结构如下:

<div class="item"><a href="https://example.com/detail/123" class="title">Item Title</a><p class="description">This is the description of the item.</p>
</div>
(2) 分析网络请求

切换到“Network”选项卡,刷新页面,观察浏览器发送的请求。我们发现页面加载时,发送了一个XHR(XMLHttpRequest)请求,请求URL为:

https://api.example.com/v1/items?page=1&size=10

这个请求返回了JSON格式的数据,其中包含了页面展示的内容。


2. 分析API请求的参数

通过开发者工具,我们可以进一步分析这个XHR请求的详细信息:

  • 请求方法:GET
  • 请求头(Headers):包含User-AgentReferer等信息。
  • 查询参数page=1size=10,表示分页参数。

JSON响应数据如下:

{"items": [{"id": 123,"title": "Item Title","description": "This is the description of the item.","url": "https://example.com/detail/123"},...],"total_pages": 5
}

3. 模拟API请求

既然我们找到了数据的来源,接下来就是模拟这个API请求,获取数据。需要注意的是,有些网站会设置反爬机制,比如检查User-Agent、限制请求频率,甚至设置Referer验证。因此,我们需要在请求中带上这些必要的信息。

(1) 构建请求头
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36","Referer": "https://example.com/list"
}
(2) 发送请求

使用requests库发送GET请求:

import requestsurl = "https://api.example.com/v1/items"
params = {"page": 1,"size": 10
}response = requests.get(url, params=params, headers=headers)
data = response.json()

4. 处理分页

通过观察API的返回数据,我们发现total_pages字段表示总页数。因此,我们需要循环遍历所有页数,获取所有数据。

total_pages = data["total_pages"]
all_items = []for page in range(1, total_pages + 1):params = {"page": page,"size": 10}response = requests.get(url, params=params, headers=headers)data = response.json()all_items.extend(data["items"])

5. 数据存储

最后,我们可以将抓取到的数据存储到本地文件中,或者进行进一步的处理。

import jsonwith open("items.json", "w", encoding="utf-8") as f:json.dump(all_items, f, ensure_ascii=False, indent=4)

四、完整代码实现

以下是完整的代码实现,包含了上述所有步骤:

import requests
import jsondef fetch_data():headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36","Referer": "https://example.com/list"}url = "https://api.example.com/v1/items"params = {"page": 1,"size": 10}response = requests.get(url, params=params, headers=headers)data = response.json()total_pages = data["total_pages"]all_items = []for page in range(1, total_pages + 1):params["page"] = pageresponse = requests.get(url, params=params, headers=headers)data = response.json()all_items.extend(data["items"])return all_itemsdef save_data(items):with open("items.json", "w", encoding="utf-8") as f:json.dump(items, f, ensure_ascii=False, indent=4)if __name__ == "__main__":items = fetch_data()save_data(items)print("Data has been saved to items.json.")

五、总结与扩展

通过这个案例,我们展示了如何通过逆向工程实现动态网页的数据抓取。关键步骤包括:

  1. 使用浏览器开发者工具分析网页行为。
  2. 找到数据的来源(API接口)。
  3. 模拟API请求,处理分页和反爬机制。
  4. 存储和处理抓取到的数据。

在实际应用中,可能会遇到更复杂的场景,例如:

  • 动态渲染:网页内容由JavaScript动态渲染,需要使用Selenium或Puppeteer模拟浏览器行为。
  • 加密请求:API请求可能使用加密参数,需要进一步分析加密逻辑。
  • 验证码和IP封禁:需要实现验证码识别或代理IP切换。

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

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

相关文章

使用 POI-TL 和 JFreeChart 动态生成 Word 报告

文章目录 前言一、需求背景二、方案分析三、 POI-TL JFreeChart 实现3.1 Maven 依赖3.3 word模板设置3.2 实现代码 踩坑 前言 在开发过程中&#xff0c;我们经常需要生成包含动态数据和图表的 Word 报告。本文将介绍如何结合 POI-TL 和 JFreeChart&#xff0c;实现动态生成 W…

Java网络编程学习(一)

网络相关概念 网络体系结构 OSI体系结构&#xff08;七层&#xff09; OSI&#xff08;Open Systems Interconnection&#xff0c;开放系统互联&#xff09;体系结构将整个计算机网络分为七层&#xff0c;从上到下依次为&#xff1a;应用层、表示层、会话层、传输层、网络层…

flutter ListView Item复用源码解析

Flutter 的 ListView 的 Item 复用机制是其高性能列表渲染的核心&#xff0c;底层实现依赖于 Flutter 的渲染管线、Element 树和 Widget 树的协调机制。以下是 ListView 复用机制的源码级解析&#xff0c;结合关键类和核心逻辑进行分析。 1. ListView 的底层结构 ListView 的复…

粒子群优化算法:像鸟群一样找到最优解

前言 在人工智能的浩瀚星空中,粒子群优化算法(PSO)如同一颗熠熠生辉的明星,吸引了无数科研人员的目光。它的名字听起来好像非常高大上,仿佛只有数学天才和算法大师才能理解。但实际上,PSO的原理并没有那么复杂。想象一下,一群聪明的小鸟在天空中自由飞翔,大家互相呼唤…

QT修仙之路2-2 对话框 尚欠火候

警告对话框 相关代码 错误对话框 相关代码 消息对话框 相关代码 询问对话框 相关代码 相关代码 警告对话框 QMessageBox::warning(this,"错误","账号密码不能为空",QMessageBox::Ok);错误对话框 QMessageBox msgBox(QMessageBox::Critical,"错误…

Python 字典(一个简单的字典)

在本章中&#xff0c;你将学习能够将相关信息关联起来的Python字典。你将学习如何访问和修改字典中的信息。鉴于字典可存储的信息量几乎不受限制&#xff0c;因此我们会演示如何遍 历字典中的数据。另外&#xff0c;你还将学习存储字典的列表、存储列表的字典和存储字典的字典。…

conda 修复 libstdc++.so.6: version `GLIBCXX_3.4.30‘ not found 简便方法

ImportError: /data/home/hum/anaconda3/envs/ipc/bin/../lib/libstdc.so.6: version GLIBCXX_3.4.30 not found (required by /home/hum/anaconda3/envs/ipc/lib/python3.11/site-packages/paddle/base/libpaddle.so) 1. 检查版本 strings /data/home/hum/anaconda3/envs/ipc/…

RTD2775QT/RTD2795QT瑞昱显示器芯片方案

RTD2775QT与RTD2795QT&#xff1a;高性能4K显示驱动芯片 RTD2775QT与RTD2795QT是瑞昱半导体公司推出的两款高性能显示驱动芯片&#xff0c;专为满足现代显示设备对高清、高分辨率的需求而设计。这两款芯片不仅支持4K分辨率&#xff0c;还具备丰富的功能和卓越的性能&#xff0…

Linux路径中的‘~‘

本文来自DeepSeek 在Linux中&#xff0c;~ 是用户主目录的简写。具体含义如下&#xff1a; 当前用户的主目录&#xff1a; ~ 代表当前登录用户的主目录。例如&#xff0c;用户 alice 的主目录通常是 /home/alice&#xff0c;~ 就指向 /home/alice。 其他用户的主目录&#xff…

【含开题报告+文档+PPT+源码】学术研究合作与科研项目管理应用的J2EE实施

开题报告 本研究构建了一套集注册登录、信息获取与科研项目管理于一体的综合型学术研究合作平台。系统用户通过注册登录后&#xff0c;能够便捷地接收到最新的系统公告和科研动态新闻&#xff0c;并能进一步点击查看详尽的新闻内容。在科研项目管理方面&#xff0c;系统提供强…

ES6 Proxy 用法总结以及 Object.defineProperty用法区别

Proxy 是 ES6 引入的一种强大的拦截机制&#xff0c;用于定义对象的基本操作&#xff08;如读取、赋值、删除等&#xff09;的自定义行为。相较于 Object.defineProperty&#xff0c;Proxy 提供了更灵活、全面的拦截能力。 1. Proxy 语法 const proxy new Proxy(target, hand…

力扣 单词拆分

动态规划&#xff0c;字符串截取&#xff0c;可重复用&#xff0c;集合类。 题目 单词可以重复使用&#xff0c;一个单词可用多次&#xff0c;应该是比较灵活的组合形式了&#xff0c;可以想到用dp&#xff0c;遍历完单词后的状态的返回值。而这里的wordDict给出的是list&…

Node.js 环境配置

什么是 Node.js Node.js 是一个基于 Chrome V8 JavaScript 引擎的 JavaScript 运行时环境&#xff0c;它允许你在服务器端运行 JavaScript。传统上&#xff0c;JavaScript 主要用于浏览器中的前端开发&#xff0c;而 Node.js 使得 JavaScript 也能够在服务器上执行&#xff0c;…

Redis企业开发实战(四)——点评项目之分布式锁

目录 一、分布式锁介绍 (一)分布式锁基本介绍 (二)分布式锁满足的条件 (三)常见的分布式锁 1.Mysql 2.Redis 3.Zookeeper 二、Redis分布式锁详解 (一)Redis分布式锁的实现核心思路 获取锁&#xff1a; 释放锁&#xff1a; (二)基于Redis实现分布式锁初级版本 1.…

kalilinu渗透测试全流程方案

1. 准备阶段 1.1 目标确认与风险评估 本方案旨在教育作用&#xff0c;请勿在没有授权的情况下使用 2. 信息收集 2.1 被动信息收集 2.1.1 DNS侦察 子域名枚举&#xff1a;# 使用Amass进行子域名枚举 amass enum -d example.com# 使用Subfinder进行子域名发现 subfinder -d…

【个人开发】cuda12.6安装vllm安装实践【内含踩坑经验】

1. 背景 vLLM是一个快速且易于使用的LLM推理和服务库。企业级应用比较普遍&#xff0c;尝试安装相关环境&#xff0c;尝试使用。 2. 环境 模块版本python3.10CUDA12.6torch2.5.1xformers0.0.28.post3flash_attn2.7.4vllm0.6.4.post1 2.1 安装flash_attn 具体选择什么版本&…

面试准备——Java理论高级【笔试,面试的核心重点】

集合框架 Java集合框架是面试中的重中之重&#xff0c;尤其是对List、Set、Map的实现类及其底层原理的考察。 1. List ArrayList&#xff1a; 底层是动态数组&#xff0c;支持随机访问&#xff08;通过索引&#xff09;&#xff0c;时间复杂度为O(1)。插入和删除元素时&#…

【鸿蒙开发】第二十四章 AI -Natural Language Kit(自然语言理解服务)

目录 1 简介 2 约束与限制 3. 分词 3.1 适用场景 3.2 约束与限制 3.3 开发步骤 3.4 开发实例 4 实体抽取 4.1 适用场景 4.2 约束与限制 4.3 开发步骤 4.4 开发实例 1 简介 Natural Language Kit&#xff08;自然语言理解服务&#xff09;提供了多项文本语义理解相…

系统思考—自我超越

“我不在乎你从哪里开始&#xff0c;我只在乎你能走到哪里。真正的超越在于敢于突破自己设定的框架。” —— 亚伯拉罕林肯 在今天这个快速变化的商业环境里&#xff0c;许多企业和团队都会遇到同样的挑战&#xff1a;如何突破现有的框架&#xff0c;实现真正的自我超越&#…

win11+mac键盘+PowerToys 重映射热键

在win11系统中&#xff0c;使用mac的蓝牙键盘&#xff0c;键盘本身没有PrintScreen键。这时可以借助PowerToys来将其他键映射到系统的PrintScreen. 1.下载安装PowerToys 地址https://learn.microsoft.com/zh-cn/windows/powertoys/ 2.打开PowerToys&#xff0c;选中【键盘管理器…