讲师中心 微信公众号
AI工具推荐 视频效率加速

Python网络爬虫进阶:应对动态加载内容并获取结构化数据

阿墨同学_8838

阿墨同学_8838

发布时间:2025-11-15 12:32:01

|

969人浏览过

|

来源于php中文网

原创

Python网络爬虫进阶:应对动态加载内容并获取结构化数据

当使用beautifulsoup爬取如binance p2p等动态加载内容的网站时,常会遇到无法获取完整数据的困境,因为实际数据由javascript异步加载。解决之道是利用浏览器开发者工具识别并直接调用网站后台api接口。通过python的requests库模拟api请求,获取json格式的原始数据,再结合pandas库进行高效解析和结构化处理,从而绕过前端渲染,直接获取所需信息。

理解动态网页爬取挑战

现代网页为了提供更流畅的用户体验,普遍采用前端框架(如React, Vue, Angular)和异步JavaScript(AJAX)技术来动态加载内容。这意味着当用户首次访问一个页面时,服务器可能只返回一个包含基本结构和JavaScript代码的HTML骨架。实际的数据内容,如商品列表、价格信息等,会在页面加载完成后,由JavaScript执行一系列异步请求(API调用)从后端获取,再动态渲染到页面上。

传统的爬虫工具如BeautifulSoup,在默认情况下,只能解析 requests 库获取到的原始HTML文本。如果目标数据是通过JavaScript动态加载的,BeautifulSoup就无法“看到”这些内容,因为它不执行JavaScript。这就是为什么在尝试爬取Binance P2P页面时,我们可能只得到包含

传统BeautifulSoup爬取方法的局限性

考虑以下使用 requests 和 BeautifulSoup 尝试爬取Binance P2P数据的示例代码:

import requests
from bs4 import BeautifulSoup
from fake_useragent import UserAgent

# 初始化User-Agent
user_agent = UserAgent(verify_ssl=False)
headers = {'user-agent': user_agent.random}

url = 'https://p2p.binance.com/ru/trade/all-payments/USDT?fiat=RUB'
res = requests.get(url, headers=headers).text
soup = BeautifulSoup(res, 'lxml')

# 尝试查找特定div,期望获取交易列表
lst = soup.find('div', class_="css-186r813")
if lst:
    underlst = lst.find('div', class_="css-cjwhpx")
    print(underlst)
else:
    print("未找到目标div 'css-186r813' 或页面内容未加载")

当执行这段代码时,输出结果很可能是一堆

立即学习“Python免费学习笔记(深入)”;

识别并利用后端API

解决动态网页爬取问题的关键在于绕过前端渲染过程,直接与后端数据源交互。这通常意味着我们需要找到网页在后台调用的API接口。

前端设计引擎
前端设计引擎

使用此技能可创建独具特色、具备生产级质量的前端界面,设计品质高。当用户要求构建网页组件、页面、产物、海报或应用程序时(例如:网站、落地页、仪表盘、React 组件、HTML/CSS 布局,或对任意 Web UI 进行样式优化与视觉美化),请启用该能力。输出需为富有创意、精雕细琢的代码与 UI 设计,避免千篇一律的 AI 风格。

下载

如何识别API接口:

  1. 使用浏览器开发者工具:
    • 打开目标网页(例如 https://p2p.binance.com/ru/trade/all-payments/USDT?fiat=RUB)。
    • 按 F12 打开开发者工具,切换到 Network (网络) 标签页。
    • 刷新页面,观察网络请求。
    • 筛选请求类型,例如 XHR (XMLHttpRequest) 或 Fetch,这些通常是异步数据请求。
    • 检查请求的URL、请求方法(GET/POST)、请求头(Headers)和响应预览(Preview/Response)。寻找那些返回JSON格式数据且包含我们所需信息的请求。
  2. 分析请求特征:
    • 在Binance P2P的案例中,通过观察发现有一个POST请求发送到 https://p2p.binance.com/bapi/c2c/v2/friendly/c2c/adv/search。
    • 这个请求的响应是一个JSON对象,其中包含一个 data 字段,该字段是一个列表,包含了所有我们想要获取的交易广告信息(如价格、数量、商家信息等)。
    • 请求的 Payload (请求体) 也是JSON格式,包含了筛选条件,例如 asset (USDT), fiat (RUB), tradeType (BUY) 等。

通过API获取数据

一旦我们识别出正确的API接口及其请求参数,就可以使用 requests 库来模拟这个请求,直接获取JSON数据。

import requests
import pandas as pd
import json # 导入json库,用于处理payload

# 创建一个会话对象,可以保持cookies和headers
s = requests.Session()

# 定义请求头,模拟浏览器行为
headers = {
    'content-type': 'application/json', # 声明请求体是JSON格式
    'accept-language': 'en-US,en;q=0.9',
    'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"
}

# 定义API请求的payload(请求体),这是Python字典
# 注意:这里我们假设要获取“购买”USDT,法币为RUB的广告
payload_data = {
    "proMerchantAds": False,
    "page": 1,
    "rows": 10, # 每页显示10条数据
    "payTypes": [],
    "countries": [],
    "publisherType": None,
    "asset": "USDT",
    "fiat": "RUB",
    "tradeType": "BUY" # 交易类型:购买
}
payload = json.dumps(payload_data) # 将Python字典转换为JSON字符串

# API接口URL
url = 'https://p2p.binance.com/bapi/c2c/v2/friendly/c2c/adv/search'

# 更新会话的请求头
s.headers.update(headers)

# 发送POST请求,data参数用于发送JSON字符串作为请求体
r = s.post(url, data=payload)

# 检查请求是否成功
if r.status_code == 200:
    # 将JSON响应转换为DataFrame
    # r.json() 会自动解析JSON响应
    df = pd.json_normalize(r.json()['data'])
    print(df.head()) # 打印前几行数据
else:
    print(f"请求失败,状态码:{r.status_code}")
    print(r.text)

代码解析:

  • requests.Session(): 创建一个会话对象,可以跨请求保持某些参数,如cookies和headers,对于连续的API调用很有用。
  • headers: 模拟浏览器的 User-Agent 和 Content-Type,这是API服务器识别请求合法性的重要依据。特别是 content-type: application/json 告诉服务器请求体是JSON格式。
  • payload_data: 这是一个Python字典,包含了我们向API发送的查询参数。例如,我们指定了要查找 USDT 资产、RUB 法币、BUY 交易类型的广告。
  • json.dumps(payload_data): 将Python字典转换为JSON字符串,因为 requests.post 的 data 参数通常期望字符串或字节。
  • s.post(url, data=payload): 发送POST请求。data 参数用于发送请求体,对于JSON数据,通常需要先序列化为字符串。
  • r.json()['data']: r.json() 将响应体解析为Python字典。我们知道实际数据在响应的 data 键下,所以直接访问它。
  • pd.json_normalize(): Pandas库的一个强大函数,用于将嵌套的JSON数据展平为二维表格(DataFrame),非常适合处理复杂的JSON结构。

结果分析与数据处理

上述代码执行后,将直接获得一个结构化的Pandas DataFrame,其中包含了Binance P2P的交易广告数据。DataFrame的每一行代表一个广告,每一列则对应广告的不同属性,例如:

  • adv.price: 交易价格
  • adv.surplusAmount: 剩余可交易数量
  • adv.minSingleTransAmount: 单笔最小交易金额
  • advertiser.nickName: 商家昵称
  • advertiser.monthOrderCount: 商家月订单量
  • advertiser.monthFinishRate: 商家月完成率

通过DataFrame,你可以方便地进行数据筛选、排序、分析和存储。例如,你可以根据价格筛选出最低的报价,或者分析不同商家的交易表现。

注意事项与最佳实践

  1. User-Agent和Headers的重要性: 许多网站会检查请求头,特别是 User-Agent,以识别请求来源。模拟一个真实的浏览器 User-Agent 可以有效避免被服务器拒绝。Content-Type 在发送JSON请求时也至关重要。
  2. 请求频率与反爬机制: 频繁的API请求可能触发网站的反爬机制,导致IP被封禁。建议设置合理的请求间隔(time.sleep()),并考虑使用代理IP池。
  3. API参数探索: 仔细研究API的 payload 结构,可以发现更多可用的筛选和排序参数,从而更精确地获取所需数据。例如,可以修改 page 和 rows 参数来翻页和调整每页数据量。
  4. 错误处理: 总是检查 response.status_code 以确保请求成功。对于可能出现的网络问题、API限流等情况,应加入 try-except 块进行异常处理。
  5. Session管理: 使用 requests.Session 可以自动处理cookies,这对于需要登录或维持会话状态的API非常有用。
  6. 数据清洗与存储: 获取到DataFrame后,可能需要进一步的数据清洗(如类型转换、缺失值处理)和存储(如CSV、数据库)。

总结

当面对动态加载内容的网页时,直接使用BeautifulSoup解析HTML往往效率低下或无法奏效。通过深入分析浏览器开发者工具,识别并直接调用网站后端API是更专业、高效且稳定的爬取策略。这种方法不仅能获取到更干净、结构化的原始数据,还能有效规避前端渲染带来的复杂性。掌握API爬取技术是现代网络爬虫工程师必备的技能。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2235

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3582

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1196

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

4119

2025.09.10

ajax教程
ajax教程

php中文网为大家带来ajax教程合集,Ajax是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。php中文网还为大家带来ajax的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

3220

2023.06.14

ajax中文乱码解决方法
ajax中文乱码解决方法

ajax中文乱码解决方法有设置请求头部的字符编码、在服务器端设置响应头部的字符编码和使用encodeURIComponent对中文进行编码。本专题为大家提供ajax中文乱码相关的文章、下载、课程内容,供大家免费下载体验。

360

2023.08.31

ajax传递中文乱码怎么办
ajax传递中文乱码怎么办

ajax传递中文乱码的解决办法:1、设置统一的编码方式;2、服务器端编码;3、客户端解码;4、设置HTTP响应头;5、使用JSON格式。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3033

2023.11.15

ajax网站有哪些
ajax网站有哪些

使用ajax的网站有谷歌、维基百科、脸书、纽约时报、亚马逊、stackoverflow、twitter、hacker news、shopify和basecamp等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1161

2024.09.24

Uvicorn 报错与问题解决教程
Uvicorn 报错与问题解决教程

本专题汇总了Uvicorn服务器常见问题与报错解决的教程合集,涵盖启动失败、端口占用、模块导入错误、事件循环冲突及热重载失效等典型故障的排查思路。同时整理了多进程与Worker配置、SSL/HTTPS证书报错、跨域与代理配置等实战解决方案,助你快速定位并解决Uvicorn运行中的各类问题。

0

2026.11.02

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 1.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn