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

