如何使用BeautifulSoup与Requests抓取网页Network标签中的信息?
如何使用BeautifulSoup与Requests抓取网页Network标签中的信息?
嘿,我来帮你理清楚这个问题~
你现在遇到的核心问题是:requests只能获取网页的初始静态HTML,而Network标签里的内容大多是页面加载后通过AJAX动态请求获取的,这些数据根本不会包含在初始HTML里,所以BeautifulSoup自然抓不到这些内容。
就拿你爬的Discord私信页面来说,https://discord.com/channels/@me的聊天内容、私信列表都是通过Discord的官方API动态加载的,初始HTML只是一个空的框架而已。
下面给你两种可行的解决方案:
方案一:直接调用目标网站的API(推荐,效率更高)
大部分现代网站的动态内容都是通过API接口获取的,你可以直接用requests去调用这些接口,跳过页面渲染的步骤:
- 先在浏览器的Network标签里找到你需要的API请求(比如Discord获取私信列表的请求),记下它的URL、请求头(尤其是
Authorization令牌,这是Discord的登录凭证); - 用
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
相关产品推荐
相关产品推荐

