使用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
相关产品推荐
相关产品推荐

