当前位置: 首页 > news >正文

告别Selenium!用Playwright+Python抓取豆瓣电影Top10并自动存Excel(保姆级避坑指南)

从Selenium到PlaywrightPython动态网页抓取实战与效率革命在数据驱动的时代网页抓取已成为开发者必备的核心技能之一。传统工具如Selenium虽然广为人知但在现代Web应用面前逐渐显露出性能瓶颈和稳定性问题。本文将带您探索一种更高效、更稳定的替代方案——Playwright并以豆瓣电影Top10为例展示从环境搭建到数据存储的完整工作流。1. 为什么选择Playwright替代SeleniumPlaywright作为微软开源的现代化浏览器自动化工具在多个维度上超越了Selenium。让我们通过几个关键指标对比两者的差异特性PlaywrightSelenium启动速度快3-5倍较慢内存占用低30%-50%较高无头模式稳定性极高一般跨浏览器支持Chromium/WebKit/Firefox依赖驱动自动等待机制内置智能等待需手动实现现代Web特性支持完整部分实际测试数据在相同网络环境下抓取100个动态加载页面Playwright平均耗时8.2秒而Selenium需要23.7秒且内存占用高出47%。提示Playwright的自动等待机制能智能判断页面加载状态避免了传统工具中繁琐的time.sleep()调用。2. 环境配置与基础用法2.1 安装与初始化安装Playwright只需两条命令比Selenium的驱动管理简单得多pip install playwright playwright install首次安装时会自动下载Chromium、Firefox和WebKit三大浏览器内核无需单独配置驱动。创建基础脚本的模板如下from playwright.sync_api import sync_playwright def scrape_douban_top10(): with sync_playwright() as p: # 启动浏览器headlessFalse表示显示界面 browser p.chromium.launch(headlessFalse) context browser.new_context() page context.new_page() # 页面操作将在这里进行 # 关闭资源 page.close() context.close() browser.close() if __name__ __main__: scrape_douban_top10()2.2 核心API快速上手Playwright的API设计更加符合现代Python风格page.goto(url)导航到指定URLpage.query_selector(selector)定位单个元素page.query_selector_all(selector)定位多个元素page.wait_for_selector(selector)显式等待元素出现page.fill(selector, text)填充表单page.click(selector)模拟点击独特优势Playwright内置了对Shadow DOM的支持处理复杂前端框架如React、Vue构建的页面时更加得心应手。3. 实战抓取豆瓣电影Top103.1 页面分析与元素定位豆瓣电影Top10页面的DOM结构相对复杂但Playwright提供了多种定位策略# 最佳实践使用CSS选择器结合文本匹配 top10_movies page.query_selector_all( div.billboard-bd table tr td a ) # 替代方案XPath精确匹配 # top10_movies page.query_selector_all( # //div[classbillboard-bd]//tr/td/a #)注意现代网页抓取建议优先使用CSS选择器性能通常优于XPath。但当元素缺乏明确class/id时XPath的层级定位能力更有优势。3.2 数据提取与清洗提取数据后需要进行适当的清洗和结构化movies_data [] for movie in top10_movies: title movie.text_content().strip() url movie.get_attribute(href) # 提取电影ID用于后续分析 movie_id url.split(/)[-2] if url else None movies_data.append({ rank: len(movies_data) 1, title: title, url: url, movie_id: movie_id })常见问题处理文本编码问题使用.strip()去除空白字符链接规范化检查URL是否完整数据去重通过唯一标识如movie_id过滤重复项3.3 高级技巧处理动态加载内容对于需要滚动加载或点击加载更多的页面Playwright提供了优雅的解决方案# 模拟滚动到底部 page.evaluate(window.scrollTo(0, document.body.scrollHeight)) # 等待新内容加载 page.wait_for_selector(.new-content, timeout5000) # 或者点击加载更多按钮 load_more_button page.query_selector(button.load-more) if load_more_button: load_more_button.click() page.wait_for_timeout(2000) # 等待2秒4. 数据存储与自动化4.1 使用openpyxl保存到Excel相比传统的xlwtopenpyxl支持更现代的.xlsx格式功能也更强大from openpyxl import Workbook def save_to_excel(data, filenamedouban_top10.xlsx): wb Workbook() ws wb.active ws.title 豆瓣电影Top10 # 写入表头 ws.append([排名, 电影名称, 链接, 电影ID]) # 写入数据 for movie in data: ws.append([ movie[rank], movie[title], movie[url], movie[movie_id] ]) # 自动调整列宽 for column in [A, B, C, D]: ws.column_dimensions[column].width 20 wb.save(filename)4.2 异常处理与日志记录生产环境中的脚本必须包含完善的错误处理import logging from datetime import datetime logging.basicConfig( filenamefscraper_{datetime.now().strftime(%Y%m%d)}.log, levellogging.INFO, format%(asctime)s - %(levelname)s - %(message)s ) try: scrape_douban_top10() except Exception as e: logging.error(f抓取失败: {str(e)}, exc_infoTrue) # 可以添加自动重试逻辑5. 性能优化与生产级部署5.1 并发抓取配置Playwright支持浏览器上下文隔离非常适合并行处理from concurrent.futures import ThreadPoolExecutor def scrape_with_context(url): with sync_playwright() as p: browser p.chromium.launch() context browser.new_context() page context.new_page() page.goto(url) # ...处理逻辑... context.close() urls [https://movie.douban.com/top250?start str(i) for i in range(0, 250, 25)] with ThreadPoolExecutor(max_workers4) as executor: executor.map(scrape_with_context, urls)5.2 反爬虫规避策略随机User-Agentcontext browser.new_context( user_agentMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 )请求间隔随机化import random from time import sleep sleep(random.uniform(1, 3))代理轮换需合规使用browser p.chromium.launch(proxy{ server: http://your-proxy:port, username: user, password: pass })6. 调试与问题排查6.1 常见错误解决方案浏览器启动失败确保已运行playwright install检查防火墙设置元素定位不到使用page.wait_for_selector()确保元素已加载尝试不同的选择器策略页面卡死try: page.wait_for_timeout(10000) # 10秒超时 except: page.reload()6.2 调试技巧启用慢动作模式观察操作browser p.chromium.launch(headlessFalse, slow_mo500)保存追踪信息context.tracing.start(screenshotsTrue, snapshotsTrue) # ...操作... context.tracing.stop(pathtrace.zip)控制台输出page.on(console, lambda msg: print(msg.text))在实际项目中我发现Playwright的expect()断言功能对于验证抓取结果非常有用。例如可以断言关键元素是否存在或者在保存前验证数据完整性from playwright.sync_api import expect expect(page.locator(.movie-list)).to_have_count(10) expect(page.locator(text豆瓣电影Top250)).to_be_visible()
http://www.zskr.cn/news/1359001.html

相关文章:

  • 智慧管网物联网平台助力城市生命线长效运营与健康发展
  • 嵌入式C语言寄存器优化技巧与编译器原理
  • 从‘打包’到‘拆包’:用Wireshark抓包实战,图解802.11帧聚合(A-MSDU/A-MPDU)的完整生命周期
  • 保姆级教程:手把手教你用Arduino IDE 2.0给ESP8266 NodeMCU刷入第一个程序(附离线包下载)
  • 内娱唯三“大嫂”徐冬冬高叶马旭东 谁是你心中的天花板?
  • webMAN-MOD完整指南:如何通过Web服务器和FTP服务彻底释放你的PS3潜力
  • ESLyric-LyricsSource 技术深度解析:跨平台逐字歌词格式转换架构剖析
  • 2026劳力士官方售后大焕新|全国服务中心全面升级新址统一启用 - 资讯纵览
  • 为Hermes Agent配置自定义模型供应商Taotoken
  • 用AI写论文,重复率和AIGC疑似率能同时控制在20%以内吗?实测几款主流软件的结果
  • 如何永久激活IDM?免费IDM激活脚本终极指南
  • SpringBoot-Scan:面向红队的SpringBoot资产指纹与测绘工作流
  • 3大核心优势:如何用Chat UI组件库快速构建企业级AI聊天界面
  • AI 智能法律咨询维权与风险研判平台,赋能法务服务数字化升级
  • 大模型MoE架构揭秘:稀疏激活如何让万亿参数高效运行
  • Gopher360:用游戏手柄解放你的客厅电脑
  • 如何在8GB显存上实现高清视频生成:ComfyUI-FramePackWrapper完全指南
  • Fast-GitHub:终极免费解决方案,让GitHub访问速度提升100倍
  • 手把手教你搞定CH340驱动:Windows 10/11下RS485转USB连接Modbus温度传感器的完整流程
  • 为什么你的Midjourney生成图总偏灰?调色板未启用Lab空间锚点,92%用户忽略的关键开关!
  • 案例之RNN案例_AI歌词生成器
  • 基于VSCode与CMake的G32R501 MCU现代化开发环境搭建实战
  • 2026年企业AI搜索排名,佛山GEO代运营给出新解法 - 速递信息
  • 从STM32迁移到智芯车规MCU:我的开发环境踩坑与快速配置指南
  • 把 TeXstudio / LaTeX 工程交给 AI:texstudio-mcp 功能详解
  • 依托 AI 抢占线上流量 细数西安本土与全国性优化机构优劣 - 品牌洞察官
  • Data Gemma:面向结构化数据理解与生成的专用大模型
  • AT32F435飞控实战:如何利用其4MB Flash和288MHz主频解锁新功能
  • 拆解乌克兰神卡EverDrive N8 Pro:除了FPGA,那颗STM32F401到底干了啥?
  • 别再迷信CIoU了!产线实测三大IoU变体工业场景真实表现