网页优化与网站优电脑编程网站

张小明 2026/1/11 18:18:37
网页优化与网站优,电脑编程网站,地方网站还有得做吗,网页制作软件ps前言 无头浏览器是动态页面爬虫开发的核心工具#xff0c;相较于传统 Selenium#xff0c;基于 Chrome DevTools Protocol#xff08;CDP#xff09;的无头浏览器具备更轻量、更高效的特性。Pyppeteer 作为 Google Puppeteer 的 Python 实现#xff0c;无需额外配置浏览器…前言无头浏览器是动态页面爬虫开发的核心工具相较于传统 Selenium基于 Chrome DevTools ProtocolCDP的无头浏览器具备更轻量、更高效的特性。Pyppeteer 作为 Google Puppeteer 的 Python 实现无需额外配置浏览器驱动原生支持异步编程在处理 JS 渲染的动态页面时优势显著。本文将从 Pyppeteer 的核心原理出发系统讲解其环境搭建、核心 API 使用并通过实战案例实现动态页面数据爬取同时对比 Pyppeteer 与 Playwright、Selenium 的差异帮助开发者掌握这一轻量级无头浏览器爬虫开发技术。摘要本文聚焦 Pyppeteer 无头浏览器在爬虫开发中的应用深入解析其基于 CDP 协议的工作机制详细讲解环境搭建、异步编程模型、动态元素定位与提取、网络请求拦截等核心技术。通过实战案例爬取知乎热榜动态渲染的热榜数据完整展示从浏览器启动、页面加载、数据提取到文件存储的全流程并剖析 Pyppeteer 的性能优化与防反爬策略。本文提供的代码可直接落地帮助开发者高效实现动态页面爬虫开发同时对比主流无头浏览器工具的选型思路。一、Pyppeteer 核心概念与优势1.1 核心概念Chrome DevTools ProtocolCDPPyppeteer 的底层通信协议通过该协议可直接与 Chrome/Chromium 浏览器交互实现页面控制、元素操作、网络监控等功能无需依赖 WebDriver。异步编程Pyppeteer 基于 asyncio 实现异步操作相比同步爬虫可大幅提升并发爬取效率。无头模式默认以无头模式运行浏览器无界面化执行降低资源占用适合服务器部署。1.2 Pyppeteer vs Playwright vs Selenium 对比特性PyppeteerPlaywrightSelenium底层协议CDPCDP 自定义协议WebDriver浏览器支持仅 Chrome/ChromiumChrome、Firefox、Safari、Edge多浏览器需对应驱动异步支持原生 asyncio原生 async/await需第三方库适配安装复杂度自动下载 Chromium首次运行手动执行 install 命令下载驱动手动下载对应浏览器驱动资源占用极低低高学习成本低API 简洁中功能丰富API 较多低文档成熟社区生态中等Python 专属高微软维护多语言支持极高老牌工具文档丰富适用场景轻量级动态页面爬取复杂多浏览器爬取 / 测试传统自动化测试 / 爬虫二、Pyppeteer 环境搭建2.1 安装 PyppeteerPyppeteer 支持 Python 3.6 版本执行以下命令完成安装bash运行# 安装Pyppeteer pip install pyppeteer # 手动下载Chromium可选首次运行会自动下载 pyppeteer-install注意首次运行 Pyppeteer 时会自动下载对应系统的 Chromium 浏览器约 100MB若下载缓慢可配置国内镜像bash运行设置镜像源export PYPPETEER_DOWNLOAD_HOSThttps://npm.taobao.org/mirrorspyppeteer-install已生成代码2.2 验证安装创建test_pyppeteer.py文件执行以下代码验证环境python运行import asyncio from pyppeteer import launch async def test_pyppeteer(): # 启动浏览器无头模式 browser await launch(headlessTrue) # 创建新页面 page await browser.newPage() # 访问百度首页 await page.goto(https://www.baidu.com) # 获取页面标题 title await page.title() print(f页面标题{title}) # 关闭浏览器 await browser.close() if __name__ __main__: asyncio.get_event_loop().run_until_complete(test_pyppeteer())输出结果plaintext页面标题百度一下你就知道原理说明launch()启动 Chromium 浏览器返回浏览器实例headlessTrue为默认值无头模式。newPage()创建新的页面实例对应浏览器的一个标签页。page.goto()导航至指定 URLPyppeteer 会自动等待页面加载完成默认等待 DOMContentLoaded。asyncio.get_event_loop()创建异步事件循环执行异步函数这是 Pyppeteer 异步编程的核心。三、Pyppeteer 核心 API 详解3.1 浏览器与页面操作API 方法功能说明browser await launch()启动浏览器实例可配置 headless、args 等参数page await browser.newPage()创建新页面await page.goto(url, options)导航至 URLoptions 可设置 timeout、waitUntil 等await page.setViewport({width: 1920, height: 1080})设置页面视口大小await page.close()关闭页面await browser.close()关闭浏览器3.2 元素定位与操作Pyppeteer 支持多种元素定位方式核心方法为page.querySelector()/page.querySelectorAll()常用操作如下python运行async def element_operation(page): # 1. CSS选择器定位元素 search_box await page.querySelector(#kw) # 百度搜索框 # 输入文本 await page.type(#kw, Pyppeteer 爬虫, {delay: 100}) # delay模拟人工输入速度 # 2. 点击元素 search_btn await page.querySelector(#su) await search_btn.click() # 3. XPath定位 result_title await page.xpath(//h3[classt]/a) # 遍历元素 for title in result_title[:3]: text await page.evaluate((element) element.textContent, title) print(f搜索结果{text}) # 4. 等待元素加载 await page.waitForSelector(.result-op, {timeout: 5000}) # 超时5秒3.3 数据提取python运行async def extract_data(page): # 获取元素文本 text await page.evaluate(() document.querySelector(.title).textContent) # 获取元素属性 href await page.evaluate(() document.querySelector(a).href) # 获取页面HTML html await page.content() # 获取页面Cookies cookies await page.cookies() # 执行自定义JS代码 scroll_height await page.evaluate(() document.body.scrollHeight) print(f页面滚动高度{scroll_height}) return text, href, html, cookies3.4 网络请求拦截Pyppeteer 可拦截页面的网络请求实现请求过滤、响应修改等功能python运行async def intercept_request(page): # 启用请求拦截 await page.setRequestInterception(True) # 定义拦截逻辑 async def handle_request(request): # 过滤图片、视频请求提升爬取速度 if request.resourceType in [image, video, stylesheet]: await request.abort() else: await request.continue_() # 绑定拦截事件 page.on(request, handle_request)四、实战爬取知乎热榜动态页面4.1 需求分析知乎热榜https://www.zhihu.com/hot的热榜数据通过 JS 动态渲染需模拟浏览器加载页面提取热榜排名、标题、热度值、链接等信息并将数据保存至 JSON 文件。4.2 完整代码实现python运行import asyncio import json from pyppeteer import launch from pyppeteer.errors import TimeoutError class ZhihuHotSpider: def __init__(self): self.base_url https://www.zhihu.com/hot self.hot_data [] # 存储热榜数据 self.browser None self.page None async def init_browser(self): 初始化浏览器 self.browser await launch( headlessTrue, args[ --no-sandbox, # 禁用沙箱服务器环境必需 --disable-dev-shm-usage, # 解决内存不足问题 --disable-images, # 禁用图片加载 --user-agentMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 ], # 禁用JS日志输出减少干扰 dumpioFalse ) self.page await self.browser.newPage() # 设置视口大小 await self.page.setViewport({width: 1920, height: 1080}) # 启用请求拦截过滤非必要资源 await self.page.setRequestInterception(True) self.page.on(request, self.intercept_request) async def intercept_request(self, request): 拦截网络请求 # 过滤图片、视频、样式、字体请求 blocked_types [image, video, stylesheet, font] if request.resourceType in blocked_types: await request.abort() else: await request.continue_() async def crawl_hot_data(self): 爬取热榜数据 try: # 访问知乎热榜页面等待页面加载完成 await self.page.goto(self.base_url, {waitUntil: networkidle2, timeout: 15000}) # 等待热榜列表加载 await self.page.waitForSelector(.HotList-list, {timeout: 10000}) # 执行JS提取热榜数据 self.hot_data await self.page.evaluate(() { const hotList []; // 遍历热榜条目 document.querySelectorAll(.HotList-item).forEach((item, index) { // 提取排名 const rank index 1; // 提取标题 const title item.querySelector(.HotItem-title)?.textContent || ; // 提取热度值 const heat item.querySelector(.HotItem-metrics)?.textContent || ; // 提取链接 const link item.querySelector(.HotItem-title a)?.href || ; // 提取简介 const desc item.querySelector(.HotItem-excerpt)?.textContent || ; hotList.push({ rank: rank, title: title.trim(), heat: heat.trim(), link: link, desc: desc.trim() }); }); return hotList; }) print(f成功爬取{len(self.hot_data)}条知乎热榜数据) # 打印前5条数据验证 for i in range(5): print(f\n排名{i1}) print(f标题{self.hot_data[i][title]}) print(f热度{self.hot_data[i][heat]}) print(f链接{self.hot_data[i][link]}) except TimeoutError: print(页面加载超时请检查网络或重试) except Exception as e: print(f爬取过程出错{str(e)}) async def save_to_json(self): 保存数据到JSON文件 if not self.hot_data: print(无数据可保存) return with open(zhihu_hot.json, w, encodingutf-8) as f: json.dump(self.hot_data, f, ensure_asciiFalse, indent4) print(\n数据已保存至zhihu_hot.json) async def close_browser(self): 关闭浏览器 if self.browser: await self.browser.close() async def run(self): 执行爬虫主流程 # 初始化浏览器 await self.init_browser() # 爬取数据 await self.crawl_hot_data() # 保存数据 await self.save_to_json() # 关闭浏览器 await self.close_browser() if __name__ __main__: # 执行异步爬虫 spider ZhihuHotSpider() asyncio.get_event_loop().run_until_complete(spider.run())4.3 输出结果控制台输出部分plaintext成功爬取50条知乎热榜数据 排名1 标题为什么现在的年轻人越来越反感「专家」 热度102.3万 链接https://www.zhihu.com/question/6328xxxx 排名2 标题2025年一线城市房价会怎么走 热度98.7万 链接https://www.zhihu.com/question/6329xxxx 排名3 标题普通人如何通过副业月入5000 热度89.5万 链接https://www.zhihu.com/question/6330xxxx 数据已保存至zhihu_hot.jsonJSON 文件输出部分json[ { rank: 1, title: 为什么现在的年轻人越来越反感「专家」, heat: 102.3万, link: https://www.zhihu.com/question/6328xxxx, desc: 近期多个行业专家的言论引发网友热议年轻人对专家的信任度似乎在持续下降... }, { rank: 2, title: 2025年一线城市房价会怎么走, heat: 98.7万, link: https://www.zhihu.com/question/6329xxxx, desc: 2025年开年北上广深等一线城市房价出现小幅波动业内人士对此看法不一... } ]4.4 核心原理剖析请求拦截优化通过page.setRequestInterception(True)启用请求拦截过滤图片、视频等非必要资源减少网络请求数量提升页面加载速度相比未拦截加载速度提升 40% 以上。动态数据提取利用page.evaluate()执行自定义 JS 代码直接在浏览器上下文提取动态渲染的热榜数据。这种方式相比逐个定位元素效率更高尤其适合批量数据提取。异常处理捕获TimeoutError页面加载超时和通用异常确保爬虫不会因单次错误崩溃提升鲁棒性。浏览器配置优化--no-sandbox和--disable-dev-shm-usage解决 Linux 服务器环境下的运行问题--disable-images禁用图片加载进一步降低资源占用自定义 User-Agent模拟真实浏览器降低反爬识别概率。五、Pyppeteer 高级特性5.1 页面滚动与懒加载处理针对懒加载的页面滚动后加载更多数据可通过模拟滚动实现全量数据爬取python运行async def scroll_page(page): 模拟页面滚动 # 滚动到底部 await page.evaluate(async () { await new Promise((resolve) { let totalHeight 0; const distance 100; const timer setInterval(() { const scrollHeight document.body.scrollHeight; window.scrollBy(0, distance); totalHeight distance; // 滚动到底部或达到最大高度时停止 if (totalHeight scrollHeight - window.innerHeight) { clearInterval(timer); resolve(); } }, 100); }); })5.2 页面截图与 PDF 导出Pyppeteer 支持页面截图和 PDF 导出可用于数据留存或可视化python运行async def screenshot_and_pdf(page): # 页面截图全屏 await page.screenshot({path: zhihu_hot.png, fullPage: True}) # 导出PDF await page.pdf({path: zhihu_hot.pdf, format: A4}) print(截图和PDF已生成)5.3 多页面并发爬取利用 asyncio 实现多页面并发爬取提升爬取效率python运行async def crawl_multiple_pages(urls): 并发爬取多个页面 browser await launch(headlessTrue) async def crawl_single_url(url): 爬取单个URL page await browser.newPage() try: await page.goto(url, {waitUntil: networkidle2}) title await page.title() print(f爬取完成{url} - 标题{title}) return title finally: await page.close() # 并发执行爬取任务 tasks [crawl_single_url(url) for url in urls] results await asyncio.gather(*tasks) await browser.close() return results # 测试并发爬取 if __name__ __main__: urls [ https://www.zhihu.com/hot, https://www.zhihu.com/topic/19552832, https://www.zhihu.com/question/6328xxxx ] asyncio.get_event_loop().run_until_complete(crawl_multiple_pages(urls))原理说明asyncio.gather()并发执行多个异步任务等待所有任务完成并返回结果。多页面并发爬取相比串行爬取效率提升倍数约等于并发数需合理控制并发数避免触发反爬。六、防反爬策略与最佳实践6.1 核心防反爬策略添加随机延迟python运行import random # 在页面操作间添加随机延迟 await asyncio.sleep(random.uniform(1, 3))设置 Cookie 与 Sessionpython运行# 设置Cookie await page.setCookie({ name: zhihu_cookie, value: your_cookie_value, domain: .zhihu.com })避免自动化特征检测python运行# 隐藏webdriver标识 await page.evaluate(() { Object.defineProperty(navigator, webdriver, { get: () undefined }); })使用代理 IPpython运行# 配置代理支持HTTP/HTTPS/SOCKS browser await launch( headlessTrue, args[--proxy-serverhttp://127.0.0.1:7890] # 替换为实际代理地址 )6.2 最佳实践资源释放确保在爬虫结束时关闭页面和浏览器避免内存泄漏。日志记录添加日志模块如 logging记录爬取过程中的关键信息便于问题排查。数据校验爬取完成后校验数据完整性避免因页面结构变化导致数据缺失。调试技巧启动浏览器时设置headlessFalse可视化调试使用page.on(console, lambda msg: print(msg.text))捕获页面 JS 日志配置slowMo500慢动作执行观察页面操作流程。七、总结Pyppeteer 作为轻量级无头浏览器工具凭借异步编程、无需驱动、资源占用低等优势成为中小规模动态页面爬虫的理想选择。本文通过知乎热榜爬取案例完整展示了 Pyppeteer 的核心功能与实战技巧包括请求拦截、动态数据提取、并发爬取等关键技术。相较于 PlaywrightPyppeteer 更轻量、学习成本更低适合快速开发轻量级爬虫而 Playwright 则在多浏览器支持、功能丰富度上更具优势开发者可根据实际场景选择。在实际开发中需结合防反爬策略与性能优化技巧平衡爬取效率与稳定性。后续将讲解爬虫请求签名参数破解、JS 加密逆向等进阶技术帮助开发者应对更复杂的反爬场景。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

重庆模板建站软件营销型企业网站建设流程

远程访问策略规划全解析 在当今数字化办公的时代,远程访问企业网络资源变得越来越普遍。为了确保远程访问的安全性、高效性和经济性,需要精心规划远程访问策略。本文将详细介绍远程访问策略规划的各个方面,包括日志记录、认证方法、虚拟专用网络(VPN)以及无线网络访问规划…

张小明 2026/1/10 12:03:26 网站建设

360任意看地图网站企业管理培训班哪个好

在 Spring Cloud 微服务架构中, 熔断(Circuit Breaker) 和 降级(Fallback / Degradation) 是保障系统高可用、防止雪崩的核心机制。 熔断:当下及服务不可用时,暂时不调用下级服务,并…

张小明 2026/1/2 9:39:38 网站建设

那个网站详情页做的好网站的维护和建设

在日常微信小程序开发中,数学公式的显示一直是个头疼的问题。特别是对于教育类、金融类应用,需要准确展示复杂的数学表达式。mp-html组件为解决这一难题提供了完整的LaTeX支持,让小程序也能轻松显示专业级数学公式。 【免费下载链接】mp-html…

张小明 2025/12/27 23:33:10 网站建设

和君网站建设uc下一页

作为项目管理领域的黄金认证,PMP的含金量很高。不过近几年随着报考人数增多,也出现了很多质疑声: “PMP考了没用,工作根本用不上”“花大几千考个证,还不如多做两个项目实在”。 可事实上,只要你参与过公…

张小明 2025/12/28 0:53:06 网站建设

网站三网合一设计logo免费网站

使用C#调用Python接口运行ACE-Step模型:跨语言集成方案 在音乐创作日益智能化的今天,越来越多开发者希望将前沿AI能力嵌入到成熟的桌面应用中。比如你正在开发一款面向普通用户的音乐辅助工具——用户只需输入“一段轻快的钢琴曲,用于早晨唤醒…

张小明 2025/12/28 0:53:02 网站建设

网站内的搜索是怎么做的吉安律师网站建设

LobeChat能否实现AI生成待办事项?GTD时间管理助手 在快节奏的工作环境中,你是否经常遇到这样的场景:刚开完一场头脑风暴会议,满脑子都是待办事项,却不知道从何下手整理?或是深夜灵光一现,“明天…

张小明 2026/1/3 7:37:40 网站建设