使用 BeautifulSoup 抓取动态加载的 HTML 内容
在网络爬虫开发中,我们经常会遇到动态加载的网页内容。这类内容并非直接包含在初始请求的 HTML 源码中,而是通过 JavaScript 在页面加载完成后异步请求数据再渲染到页面上的。BeautifulSoup 本身是 HTML/XML 解析工具,无法直接执行 JavaScript,因此单独使用它无法获取动态加载的内容。本文将介绍结合浏览器自动化工具获取动态渲染后的页面源码,再使用 BeautifulSoup 进行解析的完整方案。
核心思路
抓取动态加载内容的整体流程可以分为三步:
使用支持 JavaScript 执行的工具(如 Selenium、Playwright)模拟浏览器访问目标页面,等待动态内容加载完成
获取渲染完成后的完整页面源码
将源码传入 BeautifulSoup 进行解析,提取所需数据
环境准备
首先需要安装所需的依赖库,本文以 Selenium 为例,执行以下命令安装:
pip install beautifulsoup4 selenium webdriver-manager
其中 webdriver-manager 可以自动管理浏览器驱动,避免手动配置驱动的繁琐步骤。
示例:抓取动态加载的新闻列表
假设目标页面 https://www.ipipp.com/dynamic-news 的新闻列表是通过 JavaScript 动态加载的,初始 HTML 中仅包含占位容器,新闻数据在页面加载完成后通过接口请求渲染。以下是完整的抓取代码:
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
from webdriver_manager.chrome import ChromeDriverManager
# 初始化 Chrome 浏览器选项
options = webdriver.ChromeOptions()
# 可选:无头模式,不弹出浏览器窗口
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
# 启动浏览器
driver = webdriver.Chrome(ChromeDriverManager().install(), options=options)
try:
# 访问目标页面
target_url = "https://www.ipipp.com/dynamic-news"
driver.get(target_url)
# 等待动态内容加载完成,这里等待新闻列表容器出现,最多等待10秒
wait = WebDriverWait(driver, 10)
news_container = wait.until(
EC.presence_of_element_located((By.CLASS_NAME, "news-list"))
)
# 获取渲染后的完整页面源码
page_source = driver.page_source
# 使用 BeautifulSoup 解析源码
soup = BeautifulSoup(page_source, 'html.parser')
# 提取新闻列表
news_list = soup.find_all('div', class_='news-item')
# 遍历提取每条新闻的标题和链接
for news in news_list:
title_tag = news.find('h3', class_='news-title')
link_tag = news.find('a', class_='news-link')
if title_tag and link_tag:
title = title_tag.get_text(strip=True)
link = link_tag.get('href')
# 补全相对链接为完整链接
if link and not link.startswith('http'):
link = "https://www.ipipp.com" + link
print(f"标题:{title}")
print(f"链接:{link}")
print("-" * 50)
finally:
# 关闭浏览器
driver.quit()关键步骤说明
1. 浏览器初始化与配置
通过 ChromeOptions 可以配置浏览器的运行参数,无头模式适合服务器环境运行,避免弹出浏览器窗口占用资源。使用 webdriver-manager 会自动下载匹配当前浏览器版本的驱动,减少环境配置问题。
2. 等待动态内容加载
动态内容加载需要时间,直接使用 driver.page_source 可能获取到未渲染完成的源码。通过 WebDriverWait 结合预期条件,等待目标元素出现在 DOM 中,确保动态内容已经加载完成,这是抓取成功的关键。
3. BeautifulSoup 解析
获取到完整源码后,使用 BeautifulSoup 的 find_all、find 等方法定位目标元素,提取文本或属性。注意处理相对链接,避免提取的链接无法直接访问。
注意事项
动态加载的等待时间需要根据目标页面的实际加载速度调整,避免等待过短导致内容未加载,或等待过长浪费时间
部分网站有反爬机制,可能需要添加请求头、使用代理等方式规避,避免 IP 被封禁
如果目标页面动态加载的内容是通过接口返回的 JSON 数据,也可以直接抓取接口地址,用 requests 库请求接口获取结构化数据,效率比浏览器自动化更高
使用完浏览器后一定要调用
quit()方法关闭浏览器,避免资源泄漏