实战破解前端渲染:当 Requests 无法获取数据时(Selenium/Playwright 入门)

很多刚接触 Python 爬虫的朋友,都会从requests库开始 ------ 发送请求、获取 HTML、解析数据,一套流程下来顺风顺水。但突然某天爬某个网站时,会发现requests拿到的 HTML 里空空如也,目标数据(比如商品价格、排行榜名次)完全找不到。这时候别慌,不是你代码写错了,而是遇到了「前端渲染」的 "拦路虎"。

一、为什么 Requests 会 "失灵"?先搞懂前端渲染

要解决问题,得先明白问题根源。我们先分清两种网页渲染方式:

1. 传统服务端渲染:Requests 的 "舒适区"

早期网站大多是「服务端渲染」------ 你访问网址时,服务器直接把完整的 HTML(包含所有文字、数据)生成好,打包发给浏览器。这时候requests发送请求,拿到的就是最终展示的 HTML,直接解析就能拿到数据,比如爬静态博客、纯文字新闻页。

2. 现代前端渲染:Requests 的 "盲区"

现在很多网站(尤其是电商、社交、数据平台)用「前端渲染」------ 服务器只发一个 "空架子" HTML,里面只有基本结构,没有实际数据。真正的数据要等浏览器加载完 JavaScript(JS)后,由 JS 动态从服务器拉取数据,再渲染到页面上。

requests的短板就在这:它只能模拟 "发送请求 - 拿 HTML" 的过程,不会执行 JS 代码。所以它拿到的永远是 "空架子",自然找不到动态加载的数据。这时候就需要工具帮我们 "模拟浏览器行为"------ 不仅发请求,还能执行 JS、等待渲染完成,这就是 Selenium 和 Playwright 的用武之地。

二、入门 Selenium:用 "模拟浏览器" 破解渲染

Selenium 是老牌自动化测试工具,核心能力是 "操控浏览器"------ 打开浏览器、输入文字、点击按钮,就像人手动操作一样。因为它能让浏览器执行 JS,所以能拿到前端渲染后的完整数据。

1. 环境搭建:两步走

Selenium 需要 "库 + 浏览器驱动" 配合,以 Chrome 浏览器为例:

第一步:安装 Selenium 库

用 pip 直接装:

bash

复制代码
pip install selenium
第二步:下载 Chrome 驱动(关键!)

Chrome 驱动是 Selenium 操控 Chrome 的 "桥梁",必须和你的 Chrome 版本对应

  1. 打开 Chrome,在地址栏输入chrome://settings/help,查看 Chrome 版本(比如 "128.0.6613.137");
  2. Chrome 驱动官网下载对应版本的驱动(如果官网进不去,可搜 "ChromeDriver 国内镜像");
  3. 把下载的驱动文件(比如chromedriver.exe)放到 Python 安装目录,或在代码里指定驱动路径。

2. 第一个 Selenium 脚本:打开网页验证

先写个简单脚本,确认环境没问题:

python

复制代码
from selenium import webdriver

# 1. 初始化Chrome浏览器(如果驱动在环境变量里,不用写executable_path)
driver = webdriver.Chrome(executable_path="C:/chromedriver.exe")

# 2. 打开目标网页(比如豆瓣电影榜,动态加载数据)
driver.get("https://movie.douban.com/chart")

# 3. 打印页面标题,验证是否打开成功
print("页面标题:", driver.title)

# 4. 关闭浏览器(一定要关,否则会残留进程)
driver.quit()

运行后会自动打开 Chrome,跳转到豆瓣电影榜,控制台打印标题 ------ 这说明 Selenium 已经能操控浏览器了。

3. 实战:爬取豆瓣电影榜动态数据

豆瓣电影榜的电影名称、评分是 JS 动态加载的,用requests拿不到,用 Selenium 就能解决。核心是 "等待元素加载完成"(避免 JS 还没渲染完就去查元素):

python

复制代码
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  # 等待条件

# 初始化浏览器
driver = webdriver.Chrome(executable_path="C:/chromedriver.exe")
try:
    # 打开豆瓣电影榜
    driver.get("https://movie.douban.com/chart")
    
    # 关键:显式等待------等待电影列表元素加载,最多等10秒
    # 这里用CSS选择器定位"电影条目"(可通过浏览器F12查看元素)
    wait = WebDriverWait(driver, 10)
    movie_list = wait.until(
        EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".item"))
    )
    
    # 提取数据
    for movie in movie_list:
        # 定位电影名称(CSS选择器:.title a)
        title = movie.find_element(By.CSS_SELECTOR, ".title a").text
        # 定位评分(CSS选择器:.rating_nums)
        score = movie.find_element(By.CSS_SELECTOR, ".rating_nums").text
        print(f"电影:{title} | 评分:{score}")
finally:
    # 不管成功失败,都关闭浏览器
    driver.quit()

运行后,你会看到 Chrome 自动打开页面,等待几秒后,控制台输出所有电影的名称和评分 ------ 这就是前端渲染后的数据!

4. Selenium 避坑指南

  • 驱动版本不匹配:最常见错误!如果报错 "session not created",先检查 Chrome 版本和驱动版本是否一致;
  • 等待时间不够 :不要用time.sleep()(固定等几秒,不稳定),一定要用WebDriverWait显式等待,等元素出现再操作;
  • 浏览器残留 :每次脚本结束必须调用driver.quit(),否则任务管理器里会有很多 Chrome 进程。

三、入门 Playwright:更省心的 "新一代工具"

Selenium 虽然好用,但 "手动装驱动""手动处理等待" 对新手不够友好。微软推出的 Playwright 解决了这些痛点 ------ 自动管理驱动、自动等待元素,API 更简洁,新手入门更快。

1. 环境搭建:一步到位

Playwright 不需要手动下载驱动,安装时会自动搞定:

第一步:安装 Playwright 库

bash

复制代码
pip install playwright
第二步:自动安装浏览器和驱动

运行这条命令,Playwright 会自动下载 Chrome、Firefox、Safari 的驱动(第一次运行有点慢,耐心等):

bash

复制代码
playwright install

如果下载慢,可换国内源(先设置环境变量,再执行playwright install):

bash

复制代码
# Windows命令行
set PLAYWRIGHT_DOWNLOAD_HOST=https://playwright-assets.dp.tech
# Mac/Linux终端
export PLAYWRIGHT_DOWNLOAD_HOST=https://playwright-assets.dp.tech

2. 第一个 Playwright 脚本:页面截图

Playwright 支持 "同步" 和 "异步" 两种写法,新手先学同步(更简单):

python

复制代码
from playwright.sync_api import sync_playwright

# 用with语句管理Playwright,自动释放资源(不用手动关浏览器)
with sync_playwright() as p:
    # 启动Chrome浏览器(headless=False:显示浏览器窗口,方便调试)
    browser = p.chromium.launch(headless=False)
    # 新建一个标签页
    page = browser.new_page()
    # 打开知乎首页
    page.goto("https://www.zhihu.com")
    # 截图保存(验证页面是否加载成功)
    page.screenshot(path="zhihu.png")
    # 关闭浏览器
    browser.close()

运行后会打开 Chrome,跳转到知乎,自动截图保存为zhihu.png------ 整个过程不用管驱动,非常省心。

3. 实战:爬取电商动态商品价格

以某电商平台的 "热销商品" 为例(数据动态加载),用 Playwright 爬取商品名和价格:

python

复制代码
from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    # 启动Chrome,无头模式(headless=True:不显示浏览器窗口,更节省资源)
    browser = p.chromium.launch(headless=True)
    page = browser.new_page()
    
    # 打开目标页面(这里用示例链接,实际替换为真实电商页)
    page.goto("https://example.com/hot-products")
    
    # 关键:Playwright会自动等待元素加载,也可显式等(更稳妥)
    # 等待商品列表元素出现,最多等8秒
    page.wait_for_selector(".hot-product-item", timeout=8000)
    
    # 提取数据:用query_selector_all定位所有商品
    products = page.query_selector_all(".hot-product-item")
    for product in products:
        # 提取商品名(text_content():获取元素文本)
        name = product.query_selector(".product-name").text_content().strip()
        # 提取价格
        price = product.query_selector(".product-price").text_content().strip()
        print(f"商品:{name} | 价格:{price}")
    
    browser.close()

运行后,控制台会直接输出商品数据 ------ 没有手动装驱动,没有复杂的等待配置,比 Selenium 更简洁!

4. Playwright 的核心优势

  • 自动管理驱动:不用手动下载、匹配驱动,安装时一步搞定;
  • 智能等待:默认会等待元素可操作(比如按钮能点击、文本能读取),不用手动写等待逻辑;
  • 多浏览器支持:一行代码切换 Chrome、Firefox、Safari,不用改其他逻辑;
  • 无头模式稳定:相比 Selenium,Playwright 的无头模式更流畅,不易报错。

四、Selenium vs Playwright:新手该选谁?

对比维度 Selenium Playwright
驱动管理 手动下载、匹配版本 自动安装、维护
等待机制 需手动写显式等待 智能自动等待
API 简洁度 较繁琐(多导入模块) 简洁(单模块搞定)
学习成本 较高(需记等待、定位细节) 较低(新手易上手)
生态资料 丰富(老牌工具) 较新(但官方文档很全)

新手推荐优先学 Playwright:不用踩 "驱动匹配" 的坑,API 简单,能快速解决 "爬不到动态数据" 的问题;如果需要对接旧项目(很多公司用 Selenium 做自动化测试),再补充学习 Selenium。

五、总结与进阶方向

requests拿不到数据时,记住核心思路:用工具模拟浏览器行为,执行 JS 并等待前端渲染完成。Selenium 和 Playwright 都是实现这个思路的入门工具,掌握后能解决 80% 的前端渲染爬取需求。

后续可以往这些方向进阶:

  1. 反反爬优化:设置浏览器 User-Agent、添加代理 IP,避免被网站封禁;
  2. 页面交互:模拟点击按钮、输入搜索关键词(比如爬 "点击加载更多" 的数据);
  3. 效率提升:用多线程 / 多进程同时操控多个浏览器,加快爬取速度;
  4. 无头模式优化:生产环境用无头模式(不显示浏览器),节省服务器资源。

从 "爬不到数据" 到 "轻松获取动态数据",只差一个 "模拟浏览器" 的工具 ------ 动手试试上面的代码,你会发现前端渲染的 "坑" 其实很好填!

相关推荐
卓码软件测评12 小时前
第三方软件验收测试:【AutoIt与Selenium结合测试文件上传/下载等Windows对话框】
windows·功能测试·selenium·测试工具·性能优化·可用性测试
bestcxx13 小时前
(二十七)、k8s 部署前端项目
前端·容器·kubernetes
鲸落落丶13 小时前
webpack学习
前端·学习·webpack
程序边界13 小时前
AI时代如何高效学习Python:从零基础到项目实战de封神之路(2025升级版)
人工智能·python·学习
excel13 小时前
深入理解 3D 火焰着色器:从 Shadertoy 到 Three.js 的完整实现解析
前端
光影少年14 小时前
vue打包优化方案都有哪些?
前端·javascript·vue.js
硅谷工具人14 小时前
vue3边学边做系列(3)-路由缓存接口封装
前端·缓存·前端框架·vue
TTGGGFF14 小时前
云端服务器使用指南:利用Python操作mysql数据库
服务器·数据库·python