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

深入与浅出-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 requests

url = "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 json

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

四、完整代码实现

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

import requests
import json

def 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"] = page
        response = requests.get(url, params=params, headers=headers)
        data = response.json()
        all_items.extend(data["items"])

    return all_items

def 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.kler.cn/a/542285.html

相关文章:

  • 操作系统常见调度算法的详细介绍
  • 初识 Express
  • HalconDotNet 基础操作
  • 示例代码:C# MQTTS双向认证(客户端)(服务器EMQX)
  • 新站如何快速被搜索引擎收录?
  • 基于机器学习时序库pmdarima实现时序预测
  • CNN-BiLSTM卷积神经网络双向长短期记忆神经网络多变量多步预测,光伏功率预测
  • 河北某石油管廊自动化监测
  • 利用用个人PC搭建私有大模型(低成本、易实施的私有大模型部署方案,兼顾英语 5G协议学习与实践需求)
  • DeepSeek模型R1服务器繁忙,怎么解决?
  • 分层解耦-三层架构
  • 配置Mysql8读写分离(未完成)
  • 历史性突破!DeepSeek双模型GitHub热度超OpenAI,展现中国AI力量
  • 玩转观察者模式
  • C# 数据验证Regex
  • 【MySQL】我在广州学Mysql 系列—— 数据备份与还原
  • Python的那些事第十五篇:数据分析中的“三剑客”NumPy、Pandas与Matplotlib
  • 【Elasticsearch】 查询性能优化
  • win11 python opencv作图像匹配小结
  • idea插件开发,如何获取idea设置的系统语言
  • Render上后端部署Springboot + 前端Vue 问题及解决方案汇总
  • vscode关闭后如何恢复在远程服务器的终端程序运行界面
  • 无人机图像拼接数据的可视化与制图技术:以植被监测为例
  • MATLAB联动本地部署的DeepSeek模型
  • 关于FANUC机器人示教器型号的说明
  • 在Vue项目中Vuex和松花的作用和区别