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

使用BeautifulSoup爬取Twitter等重内容网站返回空列表问题求助

问题原因详解

1. 站点为客户端动态渲染模式

Twitter(现X)、Facebook这类站点属于*客户端渲染(CSR)*类型,页面初始加载只会返回一个几乎没有实际内容的HTML骨架,所有推文、用户信息等核心内容都是后续通过JavaScript异步请求接口、再渲染到页面上的。
你用requests.get()拿到的只是最原始的骨架HTML,根本不包含你在浏览器F12开发者工具里看到的推文相关DOM元素,自然匹配不到对应的span标签。你可以自行打印html_text变量查看内容,就能发现返回的内容和你浏览器看到的页面完全不同。

2. 基础反爬机制拦截

你当前的请求没有携带任何请求头,Twitter的反爬策略会直接识别出这是爬虫请求,要么返回403/404错误,要么返回无有效内容的拦截页面,进一步导致你拿到的HTML里没有目标内容。

3. 类名定位方式不稳定

你用来定位的css-901oao css-16my406 r-poiln3 r-bcqeeo r-qvutc0这类类名是前端框架自动生成的动态类,平台会随时更新迭代调整类名,就算你拿到了完整渲染后的DOM,也可能因为类名变更导致定位失败,这种定位方式本身就不具备长期可用性。


可行解决方案
  • 优先使用Selenium、Playwright这类浏览器自动化工具:这类工具会模拟真实浏览器运行,自动执行页面的JavaScript代码,能拿到和你浏览器里完全一致的完整DOM结构,之后再用对应选择器定位元素即可。
    简单示例(以Selenium为例):
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    import time
    
    driver = webdriver.Chrome()
    driver.get('https://twitter.com/elonmusk')
    # 等待页面加载完成
    time.sleep(5)
    # 定位对应元素
    elon_tweet = driver.find_elements(By.CSS_SELECTOR, 'span.css-901oao.css-16my406.r-poiln3.r-bcqeeo.r-qvutc0')
    for tweet in elon_tweet:
        print(tweet.text)
    driver.quit()
    
  • 更稳定的方案是调用X平台的官方开放API,或者第三方聚合接口,直接获取结构化的推文数据,不需要解析前端DOM,效率和稳定性都远高于页面爬取。
  • 如果坚持用requests库,需要先完善请求头(补充User-Agent、Cookie、Referer等字段)绕过基础反爬,再抓页面异步请求的接口直接拿JSON数据,不需要解析HTML。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 18:06:03