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

为何使用BeautifulSoup获取DB网站源码与浏览器显示不一致?

为什么BeautifulSoup获取的源码和浏览器显示不一致?

这个问题我帮不少开发者排查过,核心原因基本逃不出这几个方向,咱们挨个拆解:

  • 动态内容渲染是最常见的元凶
    现在很多网站用JS框架(React、Vue)或者纯JavaScript动态生成页面内容。BeautifulSoup依赖的requests这类库只会抓取服务器返回的初始HTML,而浏览器会自动执行页面里的JS,把动态生成的DOM渲染出来。你看到浏览器里的内容,很多是JS跑出来的,初始HTML里根本没有。
    解决办法:用浏览器自动化工具模拟真实浏览场景,比如Selenium、Playwright或者Pyppeteer。举个Selenium的简单例子:

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from bs4 import BeautifulSoup
    
    driver = webdriver.Chrome()
    driver.get("你的目标DB网站URL")
    # 等关键元素加载完成,确保JS渲染完毕
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, "目标内容的类名")))
    html = driver.page_source
    soup = BeautifulSoup(html, "html.parser")
    driver.quit()
    
  • 请求头不匹配被服务器识别为爬虫
    服务器会通过请求头里的User-Agent、Referer等字段判断请求来源。requests默认的请求头很“朴素”,容易被判定为非浏览器请求,服务器就会返回简化版或者不同的内容。
    解决办法:给请求加模拟浏览器的请求头,比如:

    import requests
    from bs4 import BeautifulSoup
    
    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",
        "Referer": "https://www.目标DB网站.com/"
    }
    response = requests.get("你的目标URL", headers=headers)
    soup = BeautifulSoup(response.text, "html.parser")
    
  • Cookie/会话状态不一致
    有些网站需要登录后才能查看完整内容,或者会用Cookie记录你的浏览状态。浏览器里保存着登录后的Cookie,而requests默认不带这些Cookie,所以返回的是未登录状态的页面内容,自然和浏览器里的不一样。
    解决办法:要么手动复制浏览器里的Cookie到请求头,要么用requests.Session()维持会话,先模拟登录请求,再访问目标页面。

  • IP被限制或触发反爬机制
    如果你频繁请求目标网站,服务器可能会给你返回异常内容(比如空白页、错误页),甚至临时封禁你的IP。这种情况下,你用浏览器访问正常,但爬虫请求就会拿到不一样的结果。
    解决办法:降低请求频率(比如加time.sleep(2)),或者使用代理IP分散请求来源,同时遵守网站的robots.txt规则。

  • 内容需要交互才加载
    比如滚动加载更多内容、点击按钮展开详情,这类内容在初始HTML里是没有的,只有触发交互后才会通过AJAX请求加载。requests抓不到这些后续加载的内容,而浏览器里你操作后会显示出来。
    解决办法:用浏览器自动化工具模拟交互,比如Selenium的driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")模拟滚动,或者点击按钮后再抓取源码。

你可以先从检查请求头开始排查,这是最容易快速验证的点,如果不行再考虑动态渲染的情况,一步步缩小范围。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:48:10