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

使用Python爬取网页源码遇JS禁用提示,求高效解决方案

解决动态网页爬取的非Selenium方案

原因分析

你遇到的是典型的客户端动态渲染场景:网页核心内容并非由服务端直接返回,而是浏览器加载基础HTML骨架后,通过执行JavaScript从后端接口拉取数据再渲染生成。所以requests拿到的只是带JS禁用提示的基础HTML,而F12的Elements面板是浏览器执行JS后的最终DOM结构,Ctrl+U查看的则是服务端原始返回内容,和requests结果一致。

替代方案(比Selenium更高效)

1. 抓包获取真实数据接口

直接通过浏览器开发者工具抓包,找到加载核心内容的XHR/Fetch接口,这类接口通常返回JSON格式数据,解析效率远高于HTML:

  • 操作步骤:
    • F12打开开发者工具,切换到Network标签
    • 刷新页面,筛选XHR/Fetch类型请求
    • 逐个查看请求响应,定位到包含目标数据的接口
    • 用requests直接请求该接口,解析JSON数据即可

示例代码:

import requests

# 替换为抓包得到的真实数据接口
api_url = "https://example.com/api/target-data"
headers = {
    # 复制浏览器请求头中的User-Agent、Referer等字段,避免被拦截
    "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://example.com/target-page"
}

response = requests.get(api_url, headers=headers)
data = response.json()
# 按需处理数据
print(data)

2. 使用Playwright无头模式(轻量替代Selenium)

如果抓包困难,Playwright的无头模式资源占用更低、运行速度更快:

  • 先安装依赖:pip install playwright,再执行playwright install chromium
  • 示例代码:
from playwright.sync_api import sync_playwright
from bs4 import BeautifulSoup

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)  # 无头模式,不显示浏览器窗口
    page = browser.new_page()
    page.goto("https://example.com/target-page")
    # 等待目标内容加载完成,可根据页面元素调整选择器
    page.wait_for_selector(".target-content-class")
    full_html = page.content()  # 获取执行JS后的完整HTML
    browser.close()

# 解析HTML
soup = BeautifulSoup(full_html, 'lxml').prettify()
print(soup)

3. 提取页面内嵌的JS数据

部分网页会把数据直接嵌在HTML的<script>标签中(比如window.__INITIAL_STATE__这类全局变量),可直接解析脚本内容:

  • 示例代码:
import requests
from bs4 import BeautifulSoup
import json

source = requests.get("https://example.com/target-page").text
soup = BeautifulSoup(source, 'lxml')

# 定位包含数据的script标签,根据实际内容调整匹配规则
script_tag = soup.find("script", text=lambda t: "__INITIAL_STATE__" in t if t else False)
if script_tag:
    # 提取JSON格式数据
    data_str = script_tag.text.split("window.__INITIAL_STATE__ = ")[1].split(";")[0]
    target_data = json.loads(data_str)
    print(target_data)

注意事项

  • 所有请求都需设置合理的请求头(尤其是User-Agent),避免触发网站反爬机制
  • 部分网站会对请求参数做签名验证,若遇到需分析页面JS逻辑,生成合法的请求参数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 23:10:54