
当目标网站通过 JavaScript 动态渲染链接时,传统 requests + BeautifulSoup 无法获取这些内容;需借助浏览器自动化工具(如 Selenium)执行 JS 后再解析 DOM。
当目标网站通过 javascript 动态渲染链接时,传统 `requests + beautifulsoup` 无法获取这些内容;需借助浏览器自动化工具(如 selenium)执行 js 后再解析 dom。
在现代 Web 开发中,大量网站采用单页应用(SPA)架构或异步加载(如 AJAX、React/Vue 渲染),导致关键链接不会出现在初始 HTML 源码中。此时仅靠 requests.get() 获取静态响应是无效的——它不执行 JavaScript,因此无法触发动态内容注入。
✅ 正确方案:Selenium + WebDriver
Selenium 是一个成熟的浏览器自动化框架,可启动真实浏览器(如 Chrome),完整加载页面、执行脚本、等待动态元素就绪,最终提取渲染后的 DOM。
创建 Flask + Vue.js 全栈项目,采用单端口架构、uv 依赖管理、结构化日志和生产级前端设计。当用户要求以下操作时触发:创建新的 Flask+Vue 项目、搭建 Web 应用、构建全栈 Python+Vue 应用、初始化 Flask Web 项目、设置单端口 Flask 前后端项目。触发词:新建项目、创建项目、搭建项目、Flask项目、Vue项目。
? 环境准备
- 安装 Selenium:
pip install selenium
- 下载匹配 Chrome 版本的 ChromeDriver,并确保其路径已加入系统
PATH;或使用webdriver-manager自动管理驱动(推荐):pip install webdriver-manager
? 完整可运行示例
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
url = "https://www.example.com/"
# 自动下载并配置 ChromeDriver
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)
try:
driver.get(url)
# 可选:显式等待关键链接区域加载完成(防白屏/未渲染)
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.TAG_NAME, "a"))
)
# 解析渲染后的页面源码
soup = BeautifulSoup(driver.page_source, "html.parser")
# 提取所有 <a> 标签的 href 属性(过滤 None 和空值)
urls = [
a.get("href")
for a in soup.find_all("a", href=True)
if a.get("href").strip()
]
print(f"共提取 {len(urls)} 个有效链接:")
for href in urls[:10]: # 仅打印前10条,避免刷屏
print(href)
finally:
driver.quit() # 必须关闭浏览器,释放资源</a>
⚠️ 注意事项与最佳实践
-
性能开销:Selenium 启动浏览器较慢,不适合高频、大规模抓取;如需高性能,可考虑无头模式(
options.add_argument("--headless"))。 -
反爬风险:部分网站检测 Selenium 特征(如
navigator.webdriver)。可通过添加规避配置降低被封概率(例如设置options.add_experimental_option("excludeSwitches", ["enable-automation"]))。 -
动态延迟处理:若链接由滚动、点击或 API 延迟加载,应结合
WebDriverWait+EC.element_to_be_clickable()或scroll_into_view()主动触发。 - 替代轻量方案:对纯 AJAX 加载的链接,可分析 Network 面板中的 XHR/Fetch 请求,直接调用对应 API(更高效,但需逆向分析)。
总之,面对 JavaScript 渲染内容,Selenium 是最通用、可靠的“所见即所得”解决方案。合理搭配显式等待与异常处理,即可稳健提取动态生成的链接。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










