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

Python+BeautifulSoup爬取XHR驱动动态页面的10%数据难题求助

解决动态页面爬取中无法获取更新后HTML的问题

你的核心问题是requests库仅能获取HTTP响应内容,不会执行浏览器端的JavaScript——页面切换后的HTML更新是前端用XHR返回的JSON数据动态渲染生成的,所以直接解析POST请求的JSON响应自然拿不到最终的页面源码。以下是两种可行解决方案:

方案一:用Selenium模拟浏览器行为(省心首选)

Selenium会启动真实浏览器并执行JS,能直接获取渲染完成的完整页面源码,适配大多数动态页面场景。

操作步骤:

  1. 安装适配的依赖包(适配你的Python3.7.3和Mac系统):

    # 安装适配Python3.7的Selenium版本
    pip install selenium==4.9.0
    

    注:Selenium 4.9.0支持自动管理浏览器驱动,无需手动下载ChromeDriver。

  2. 示例代码:

    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    from bs4 import BeautifulSoup
    
    target_url = "http://www.example.com/abc"
    
    # 初始化Chrome浏览器(无头模式,不显示窗口)
    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_argument("--headless=new")
    driver = webdriver.Chrome(options=chrome_options)
    
    try:
        # 加载初始页面
        driver.get(target_url)
        # 等待页面初始加载完成(替换为页面中必现的元素定位)
        WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.ID, "page-container"))
        )
    
        # 执行页面切换操作(比如点击分页按钮,需根据实际页面交互调整)
        # next_page_btn = driver.find_element(By.XPATH, "//button[contains(text(), '下一页')]")
        # next_page_btn.click()
    
        # 等待页面更新完成(等待旧元素失效,或新元素出现)
        WebDriverWait(driver, 10).until(
            EC.staleness_of(driver.find_element(By.ID, "old-content"))
        )
    
        # 获取更新后的完整页面源码
        updated_html = driver.page_source
        soup = BeautifulSoup(updated_html, "html.parser")
        # 此时即可解析到100%的数据
    finally:
        # 关闭浏览器
        driver.quit()
    

方案二:分析前端渲染逻辑,手动拼接HTML(性能优先)

如果不想依赖浏览器,可以通过Chrome开发者工具分析前端如何用JSON数据渲染DOM,再手动将数据填充到初始页面模板中。

示例代码:

import requests
from bs4 import BeautifulSoup

url1 = "http://www.example.com/abc"
url2 = "http://www.example.com/abc-data"

with requests.Session() as s:
    # 获取初始页面模板
    resp = s.get(url1)
    soup_template = BeautifulSoup(resp.text, "html.parser")
    
    # 提取token并构造请求payload(保留你原有的逻辑)
    # YOUR TOKEN EXTRACTION CODE HERE
    payload = {"token": "extracted_token", ...}
    
    # 获取XHR的JSON响应
    resp = s.post(url2, data=payload)
    json_data = resp.json()

    # 找到页面中用来渲染动态内容的容器(需根据实际页面结构调整)
    content_container = soup_template.find("div", class_="dynamic-content")
    
    # 按照前端渲染逻辑,将JSON数据转为HTML元素插入容器
    # 示例:假设JSON中的items是列表项数据
    for item in json_data.get("items", []):
        item_tag = soup_template.new_tag("div", class_="item-card")
        item_tag.append(soup_template.new_tag("h3", string=item["title"]))
        item_tag.append(soup_template.new_tag("p", string=item["desc"]))
        content_container.append(item_tag)
    
    # 此时soup_template就是更新后的完整页面源码
    print(soup_template.prettify())

注:方案二需要你熟悉前端的DOM渲染逻辑,若页面更新频繁,维护成本较高;方案一无需关注前端细节,稳定性更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 09:20:38