Playwright 爬虫:Python 爬取 JS 渲染的 JSP 网站

在传统爬虫开发中,针对 JSP 动态网页的爬取一直是开发者面临的核心难点。JSP 作为 Java 服务端页面技术,常结合 JavaScript 实现前端数据渲染、异步请求加载、表单交互等功能。传统的 Python 爬虫库(如 Requests + BeautifulSoup)只能获取网页原始 HTML,无法执行 JS 代码,最终只能抓取到空白页面或不完整数据。

Playwright 作为微软开源的新一代自动化测试与爬虫工具,完美解决了这一痛点。它支持模拟真实浏览器环境,完整执行 JavaScript 代码、处理异步加载、模拟用户交互,是爬取 JSP 动态网站的最优解决方案。本文将从环境搭建、核心原理、实战代码、反爬规避、性能优化五个维度,全面讲解基于 Python + Playwright 爬取 JS 渲染 JSP 网站的完整方案。

一、传统爬虫爬取 JSP 网站的痛点

JSP 网页的核心特征是服务端渲染 + 前端 JS 异步加载数据,大部分业务数据并非直接写在 HTML 中,而是通过 JS 脚本从后端接口获取并动态渲染到页面上。

传统爬虫的局限性:

  1. 仅能获取网页源代码,无法执行 JS 脚本,丢失核心业务数据;
  2. 无法处理 JSP 页面的登录验证、按钮点击、下拉加载等交互操作;
  3. 面对 JS 加密、动态接口、反爬机制时,几乎无法正常爬取数据。

而 Playwright 基于真实浏览器内核(Chromium、Firefox、WebKit)运行,能完全模拟用户的浏览器行为,让爬虫看到的页面内容与用户完全一致,彻底解决 JS 渲染 JSP 页面的爬取难题。

二、Playwright 环境搭建(Python 版)

Playwright 安装极简,仅需两步即可完成环境配置,支持 Windows、Mac、Linux 全平台。

1. 安装 Playwright 库

打开命令行工具,执行 pip 安装命令:

bash

运行

plain 复制代码
pip install playwright

2. 安装浏览器驱动

Playwright 需要下载对应浏览器内核,执行自动安装命令:

bash

运行

plain 复制代码
playwright install

该命令会自动安装 Chromium、Firefox、WebKit 三款浏览器驱动,无需手动配置环境变量。

三、Playwright 爬虫核心原理

  1. 浏览器模拟:启动无头 / 有头浏览器,加载 JSP 网页;
  2. JS 渲染执行:自动执行页面所有 JavaScript 代码,等待异步数据加载完成;
  3. 元素定位:支持 CSS 选择器、XPath、文本定位等多种方式提取数据;
  4. 交互模拟:模拟点击、输入、滚动、登录等操作,适配 JSP 页面交互逻辑;
  5. 数据提取:获取渲染后的完整 HTML 或直接提取页面元素文本、属性。

四、实战:爬取 JS 渲染的 JSP 网站

我们以典型 JSP 动态网站(列表数据通过 JS 异步加载、支持分页、需要等待页面渲染)为例,编写完整的爬虫代码,实现数据爬取、分页处理、数据保存功能。

完整实现代码

python

运行

plain 复制代码
from playwright.sync_api import sync_playwright
import time
import csv

def jsp_spider():
    # 1. 启动 Playwright
    with sync_playwright() as p:
        # 启动无头浏览器(生产环境使用,无界面)
        # 调试时可把 headless=False 显示浏览器界面
        browser = p.chromium.launch(headless=True)
        # 创建新页面
        page = browser.new_page()
        # 设置浏览器请求头,模拟真实用户
        page.set_extra_http_headers({
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
            "Accept-Language": "zh-CN,zh;q=0.9"
        })

        # 2. 访问 JSP 动态网页,等待页面完全加载
        # 替换为目标 JSP 网站地址
        page.goto(
            "http://xxx.com/list.jsp",
            wait_until="networkidle",  # 等待网络空闲,确保 JS 数据加载完成
            timeout=60000
        )
        # 强制等待 2 秒,确保动态渲染完成
        time.sleep(2)
        print("JSP 页面加载完成,开始爬取数据...")

        # 3. 创建 CSV 文件保存数据
        with open("jsp_data.csv", "w", newline="", encoding="utf-8-sig") as f:
            writer = csv.DictWriter(f, fieldnames=["标题", "内容", "时间", "链接"])
            writer.writeheader()

            # 4. 爬取多页数据(JSP 分页示例)
            for page_num in range(1, 4):
                print(f"正在爬取第 {page_num} 页数据...")

                # 5. 提取 JS 渲染后的页面数据(CSS 选择器定位元素)
                # 根据目标 JSP 页面的实际元素选择器修改
                items = page.query_selector_all("div.list-item")
                for item in items:
                    # 提取文本内容
                    title = item.query_selector("h3").inner_text().strip() if item.query_selector("h3") else "无标题"
                    content = item.query_selector("p.desc").inner_text().strip() if item.query_selector("p.desc") else "无内容"
                    time_str = item.query_selector("span.time").inner_text().strip() if item.query_selector("span.time") else "无时间"
                    link = item.query_selector("a").get_attribute("href") if item.query_selector("a") else "无链接"

                    # 补全相对链接
                    if link and not link.startswith("http"):
                        link = "http://xxx.com" + link

                    # 打印数据
                    print({"标题": title, "内容": content, "时间": time_str, "链接": link})
                    # 写入 CSV
                    writer.writerow({"标题": title, "内容": content, "时间": time_str, "链接": link})

                # 6. 模拟点击分页按钮(JSP 页面分页交互)
                try:
                    # 定位下一页按钮,点击并等待页面加载
                    page.click("a.next-page", timeout=5000)
                    time.sleep(2)
                except Exception as e:
                    print("已到达最后一页,爬取结束")
                    break

        # 7. 关闭浏览器
        browser.close()
        print("所有 JSP 页面数据爬取完成!")

if __name__ == "__main__":
    jsp_spider()

代码核心解析

  1. 浏览器启动配置
    • <font style="color:rgb(0, 0, 0);background-color:rgba(0, 0, 0, 0);">headless=True</font>:无头模式,无界面运行,适合服务器部署;
    • <font style="color:rgb(0, 0, 0);background-color:rgba(0, 0, 0, 0);">wait_until="networkidle"</font>:等待网络请求完成,确保 JS 异步数据全部加载。
  2. 页面元素定位
    • <font style="color:rgb(0, 0, 0);background-color:rgba(0, 0, 0, 0);">query_selector_all</font>:批量获取匹配的元素;
    • <font style="color:rgb(0, 0, 0);background-color:rgba(0, 0, 0, 0);">inner_text()</font>:提取元素文本;
    • <font style="color:rgb(0, 0, 0);background-color:rgba(0, 0, 0, 0);">get_attribute()</font>:提取元素属性(如链接、图片地址)。
  3. 分页交互模拟
    • 通过 <font style="color:rgb(0, 0, 0);background-color:rgba(0, 0, 0, 0);">page.click()</font> 模拟点击下一页按钮,自动切换分页;
    • 异常捕获:当无下一页按钮时,自动结束爬取。
  4. 数据持久化
    • 将爬取的数据保存为 CSV 格式,支持 Excel 直接打开,方便后续数据分析。

五、进阶:处理 JSP 网站登录验证

大部分 JSP 后台系统需要登录才能访问数据,Playwright 可轻松模拟登录操作:

python

运行

plain 复制代码
# 模拟登录 JSP 系统
page.goto("http://xxx.com/login.jsp")
# 输入账号
page.fill("input[name='username']", "你的账号")
# 输入密码
page.fill("input[name='password']", "你的密码")
# 点击登录按钮
page.click("button#login-btn")
# 等待登录跳转完成
time.sleep(3)

六、JSP 网站反爬机制与规避方案

JSP 网站常用反爬手段,Playwright 都能完美应对:

  1. User-Agent 检测:代码中已设置请求头,模拟真实浏览器;
  2. 频繁请求限制 :添加 <font style="color:rgb(0, 0, 0);background-color:rgba(0, 0, 0, 0);">time.sleep()</font> 延时,降低请求频率;
  3. 浏览器特征检测:Playwright 原生浏览器指纹,比 Selenium 更难被识别;
  4. 验证码拦截:可结合第三方验证码识别接口,自动识别验证码。

七、性能优化:提升爬取效率

  1. 异步模式 :使用 <font style="color:rgb(0, 0, 0);background-color:rgba(0, 0, 0, 0);">async_playwright</font> 实现异步爬取,支持并发请求;
  2. 关闭图片加载:减少资源加载时间: python运行
plain 复制代码
page.route("**/*.{png,jpg,jpeg,gif}", lambda route: route.abort())
  1. 复用浏览器:无需每页都重启浏览器,提升运行速度。

八、Playwright 对比其他爬虫工具

表格

工具 支持 JS 渲染 模拟交互 易用性 反爬规避
Requests 不支持 不支持
Selenium 支持 支持
Playwright 完美支持 完美支持

对比可知,Playwright 在爬取 JS 渲染的 JSP 网站时,具备性能更强、配置更简单、反爬规避能力更强的绝对优势。

九、总结

在 JSP 动态网站成为主流的今天,传统爬虫已无法满足 JS 渲染页面的数据爬取需求。Python + Playwright 组合凭借真实浏览器模拟、完整 JS 渲染、极简 API 设计、强大反爬规避能力,成为爬取 JSP 网站的首选方案。

本文提供的代码可直接适配绝大多数 JSP 动态网站,仅需修改页面元素选择器、网站地址即可快速复用。无论是企业级数据采集、数据分析,还是日常爬虫开发,Playwright 都能高效、稳定地完成 JS 渲染 JSP 页面的爬取任务。

对于开发者而言,掌握 Playwright 爬虫技术,不仅能解决 JSP 网站的爬取难题,更能应对所有前端 JS 渲染的动态网页,全面提升爬虫开发能力。

相关推荐
宇宙realman_9996 小时前
420B污染度等级查询代码
java·开发语言·算法
折哥的程序人生 · 物流技术专研6 小时前
《Java 100 天进阶之路》第35篇:Java异常处理最佳实践
java·开发语言·后端·面试·求职招聘
用户8356290780516 小时前
使用 Python 创建 PowerPoint SmartArt 图形
后端·python
AI玫瑰助手6 小时前
Python函数:位置参数与关键字参数的使用
开发语言·python·信息可视化
jay神6 小时前
深度学习模型优化:P2PNet模型MAE下降17.30%
人工智能·python·深度学习·计算机视觉·毕业设计
前端Hardy6 小时前
这个前端动画库,火了!
前端·javascript
如竟没有火炬6 小时前
乘法表中第K小的数——二分
开发语言·数据结构·python·算法·leetcode·职场和发展·动态规划
凯瑟琳.奥古斯特6 小时前
选择题专练数据库原理精选30题
开发语言·数据库·职场和发展·数据库开发
axinawang6 小时前
第7课:数据类型和类型转换
python