You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用BeautifulSoup与Requests抓取网页Network标签中的信息?

如何使用BeautifulSoup与Requests抓取网页Network标签中的信息?

嘿,我来帮你理清楚这个问题~

你现在遇到的核心问题是:requests只能获取网页的初始静态HTML,而Network标签里的内容大多是页面加载后通过AJAX动态请求获取的,这些数据根本不会包含在初始HTML里,所以BeautifulSoup自然抓不到这些内容。

就拿你爬的Discord私信页面来说,https://discord.com/channels/@me的聊天内容、私信列表都是通过Discord的官方API动态加载的,初始HTML只是一个空的框架而已。

下面给你两种可行的解决方案:

方案一:直接调用目标网站的API(推荐,效率更高)

大部分现代网站的动态内容都是通过API接口获取的,你可以直接用requests去调用这些接口,跳过页面渲染的步骤:

  1. 先在浏览器的Network标签里找到你需要的API请求(比如Discord获取私信列表的请求),记下它的URL、请求头(尤其是Authorization令牌,这是Discord的登录凭证);
  2. 用requests模拟这个请求,直接拿到JSON格式的响应数据。

举个针对Discord的示例代码:

import requests

# 替换成你自己的Discord令牌(从浏览器的请求头里找,绝对不要分享给别人!)
DISCORD_TOKEN = "你的Discord令牌"
headers = {
    "Authorization": DISCORD_TOKEN,
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
}

# 获取私信频道列表的API接口(从Network标签里复制的)
api_url = "https://discord.com/api/v9/users/@me/channels"
response = requests.get(api_url, headers=headers)

if response.status_code == 200:
    # 响应是JSON格式,直接解析即可
    dm_channels = response.json()
    for channel in dm_channels:
        print(f"私信频道ID: {channel['id']}, 对方用户名: {channel['recipients'][0]['username']}")
else:
    print(f"请求失败,状态码: {response.status_code}")

要注意的是:

  • Discord的令牌是你的登录凭证,一旦泄露别人就能登录你的账号,一定要保管好;
  • 如果API请求失败,检查请求头是否完整,比如User-Agent要模拟真实浏览器的标识。

方案二:使用浏览器自动化工具(更贴近真实用户操作)

如果不想折腾API,你可以用Selenium、Playwright这类工具模拟真实浏览器加载页面,它们能完整捕获所有动态加载的内容,包括Network标签里的请求和响应:

以Selenium为例,示例代码如下:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import json

# 配置Chrome浏览器选项
options = Options()
options.add_argument("--headless=new")  # 无头模式,不弹出浏览器窗口
# 开启Performance日志,用来捕获Network请求
options.set_capability("goog:loggingPrefs", {"performance": "ALL"})

# 启动浏览器
driver = webdriver.Chrome(options=options)

# 加载Discord私信页面(第一次需要手动登录,之后可以保存cookie跳过登录)
driver.get("https://discord.com/channels/@me")
# 等待页面加载完成(这里用隐式等待,也可以用显式等待更精准)
driver.implicitly_wait(10)

# 提取Network中的API请求日志
logs = driver.get_log("performance")
for log in logs:
    log_data = json.loads(log["message"])["message"]
    # 筛选出Discord的API请求
    if log_data["method"] == "Network.responseReceived" and "api/v9" in log_data["params"]["response"]["url"]:
        request_id = log_data["params"]["requestId"]
        # 获取请求的响应内容
        response_body = driver.execute_cdp_cmd("Network.getResponseBody", {"requestId": request_id})
        print("API响应内容:", response_body["body"])

# 关闭浏览器
driver.quit()

这种方法的好处是不需要自己找API接口,完全模拟用户操作,但缺点是速度较慢,还要处理登录会话的问题。

总结一下:BeautifulSoup+requests只适合静态页面,动态内容要么直接调用API,要么用浏览器自动化工具,针对Discord的场景,直接调用API是更高效的选择。

备注:内容来源于stack exchange,提问作者Seán Moran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 10:19:34