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

Python/Beautiful Soup抓取Discord元数据内容不符,求解决方案

问题分析与解决方案

为什么抓取到的元数据和浏览器显示不一致?

是的,Discord邀请页面的元数据是通过客户端JavaScript动态修改的:

  • 你用requests发送的是纯HTTP请求,只会获取服务器返回的初始静态HTML,其中的og:description是通用模板内容,不包含成员数这类动态数据。
  • 浏览器会自动执行页面中的JavaScript代码,动态拉取服务器实时数据(比如成员数)并替换元内容;同时Discord可能会根据请求头(如User-Agent)区分访问来源,对非浏览器请求返回简化版内容。

如何获取真实的目标数据?

有两种可靠的方式:

方式一:使用支持JavaScript渲染的爬虫工具(以Selenium为例)

通过模拟真实浏览器加载页面,等待JavaScript执行完成后再抓取内容:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup

# 配置Chrome无头模式(可选,也可以去掉用可视化浏览器)
chrome_options = Options()
chrome_options.add_argument("--headless=new")
chrome_options.add_argument("--disable-gpu")

driver = webdriver.Chrome(options=chrome_options)
url = "https://discord.com/invite/midjourney"
driver.get(url)

# 隐式等待5秒确保页面渲染完成(生产环境建议用显式等待特定元素)
driver.implicitly_wait(5)

# 获取渲染后的页面源码
page_source = driver.page_source
soup = BeautifulSoup(page_source, 'html5lib')

target = soup.find("meta", property="og:description")
print(target)

driver.quit()

方式二:直接调用Discord公开API(更高效稳定)

Discord提供了公开的邀请信息API,可以直接获取包含成员数在内的详细数据,无需处理页面渲染:

import requests

invite_code = "midjourney"
api_url = f"https://discord.com/api/v9/invites/{invite_code}?with_counts=true"

# 设置浏览器UA,避免被API拦截
headers = {
    "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"
}

response = requests.get(api_url, headers=headers)
data = response.json()

# 拼接出和页面一致的描述内容
server_desc = data["guild"]["description"]
member_count = data["approximate_member_count"]
full_description = f"{server_desc} | {member_count:,} members"

print(full_description)

内容的提问来源于stack exchange,提问作者GreenDilly

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 15:05:33