Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用puppeteer库编写的爬虫程序

使用puppeteer库编写的爬虫程序

原创
作者头像
华科云商小徐
发布于 2025-04-02 03:34:26
发布于 2025-04-02 03:34:26
18000
代码可运行
举报
文章被收录于专栏:小徐学爬虫小徐学爬虫
运行总次数:0
代码可运行

Embassy是基于aiohttp的异步库,适合处理普通的HTTP请求,而Puppeteer是控制Headless Chrome的,适合需要处理JavaScript渲染的页面。用户可能遇到了需要抓取动态生成内容的情况,或者之前的Embassy示例无法获取到完整的数据,所以转向Puppeteer。

以下是一个使用 Pyppeteer (Python 版本的 Puppeteer) 编写的网络爬虫示例,用于处理需要 JavaScript 渲染的页面:

先安装依赖

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install pyppeteer

示例代码:动态页面爬虫

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import asyncio
from urllib.parse import urljoin
from pyppeteer import launch
from pyppeteer.errors import TimeoutError
​
class PuppeteerCrawler:
    def __init__(self, headless=True, timeout=30):
        self.headless = headless  # 是否无头模式
        self.timeout = timeout    # 页面加载超时时间
        self.browser = None       # 浏览器实例
        self.visited = set()      # 已访问的URLasync def init_browser(self):
        """启动浏览器实例"""
        self.browser = await launch(
            headless=self.headless,
            args=['--no-sandbox', '--disable-setuid-sandbox']
        )async def crawl(self, start_url):
        """启动爬虫"""
        if not self.browser:
            await self.init_browser()
        
        page = await self.browser.newPage()
        await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36')
        
        try:
            await self.process_page(page, start_url)
        finally:
            await page.close()
            await self.browser.close()async def process_page(self, page, url):
        """处理单个页面"""
        if url in self.visited:
            return
        self.visited.add(url)try:
            # 导航到页面
            await page.goto(url, {'timeout': self.timeout * 1000})
            await page.waitForSelector('body', timeout=self.timeout*1000)  # 等待页面加载
​
            # 获取页面内容
            content = await page.content()
            
            # 示例:提取标题
            title = await page.title()
            print(f'Scraped: {url}')
            print(f'Title: {title}')
​
            # 提取链接
            links = await self.extract_links(page, url)
            for link in links:
                if link not in self.visited:
                    new_page = await self.browser.newPage()
                    await self.process_page(new_page, link)
                    await new_page.close()
​
        except TimeoutError:
            print(f'Timeout loading {url}')
        except Exception as e:
            print(f'Error processing {url}: {str(e)}')async def extract_links(self, page, base_url):
        """提取页面中的链接"""
        return await page.evaluate('''(base_url) => {
            return Array.from(document.querySelectorAll('a'))
                .map(a => new URL(a.href, base_url).href)
                .filter(href => href.startsWith('http'));
        }''', base_url)async def main():
    crawler = PuppeteerCrawler(headless=True)  # headless=False 可以显示浏览器
    await crawler.crawl('https://example.com')if __name__ == '__main__':
    asyncio.run(main())

代码说明

  1. 核心功能
    • 使用 pyppeteer 控制 Chromium 浏览器
    • 支持 JavaScript 渲染的动态页面
    • 自动等待页面元素加载 (waitForSelector)
    • 支持递归爬取页面链接
  2. 关键配置: launch( headless=True, # 无头模式(不显示浏览器界面) args=[ '--no-sandbox', '--disable-setuid-sandbox' # Linux 系统需要 ] )
  3. 优势场景
    • 需要执行 JavaScript 的 SPA (单页应用)
    • 需要处理懒加载内容
    • 需要模拟用户交互(点击、滚动等)
    • 需要生成页面截图/PDF

高级功能扩展

1. 页面截图
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
await page.screenshot({'path': 'screenshot.png', 'fullPage': True})
2. 执行自定义 JavaScript
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dimensions = await page.evaluate('''() => {
    return {
        width: document.documentElement.clientWidth,
        height: document.documentElement.clientHeight
    }
}''')
3. 处理弹窗
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
page.on('dialog', lambda dialog: dialog.dismiss())
4. 设置代理
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
await page.authenticate({
    'username': 'proxy_user',
    'password': 'proxy_pass'
})

注意事项

  1. 性能优化
    • 复用浏览器实例 (browser.newPage() 而不是频繁启动)
    • 禁用图片加载: await page.setRequestInterception(True) page.on('request', lambda req: req.abort() if req.resourceType() == 'image' else req.continue_())
  2. 反反爬策略
    • 使用随机 User-Agent
    • 添加随机延迟 (await asyncio.sleep(random.uniform(1, 3)))
    • 使用代理池
  3. 资源管理
    • 及时关闭页面 (await page.close())
    • 处理内存泄漏
    • 监控浏览器进程

如果需要处理更复杂的场景(如登录验证、验证码识别),可以结合其他库(如 python-anticaptcha)使用。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python爬虫神器pyppeteer,对 js 加密降维打击
pyppeteer 是对无头浏览器 puppeteer的 Python 封装。无头浏览器广泛用于自动化测试,同时也是一种很好地爬虫思路。
一墨编程学习
2019/06/15
3.1K0
前端开发爬虫首选puppeteer
很多前端同学可能对于爬虫不是很感冒,觉得爬虫需要用偏后端的语言,诸如 python 、php 等。当然这是在 nodejs 前了,nodejs 的出现,使得 Javascript 也可以用来写爬虫了。但这是大数据时代,数据的需求是不分前端还是后端的,既然由于 nodejs 强大的异步特性,让我们可以轻松以异步高并发去爬取网站。
小白学大数据
2023/03/13
1.4K0
使用 Puppeteer 搭建统一海报渲染服务
有赞微商城包括了 PC 端、H5 端和小程序端,每个端都有绘制分享海报的需求。最早的时候我们是在每个端通过 canvas API 来绘制的,通过 canvas 绘制有很多痛点,与本文要讲的海报渲染服务做了一个对比:
有赞coder
2020/08/25
1.5K0
使用 Puppeteer 搭建统一海报渲染服务
Pyppeteer:比selenium更高效的爬虫界的新神器
随着互联网的发展,前端技术也在不断变化,数据的加载方式也不再是单纯的服务端渲染了。现在你可以看到很多网站的数据可能都是通过接口的形式传输的,或者即使不是接口那也是一些 JSON 的数据,然后经过 JavaScript 渲染得出来的。
IT大咖说
2020/04/21
2.7K0
Pyppeteer:比selenium更高效的爬虫界的新神器
Puppeteer已经取代PhantomJs
记得前几年,我们通常会用PhantomJs做一下自动化测试,或者为了SEO优化,会用它对SPA页面进行预渲染,现在有更好的Puppeteer来代替它的工作了,性能更好,使用起来也更加方便,Puppeteer 是 Chrome 开发团队在 2017 年发布的一个 Node.js 包,用来模拟 Chrome 浏览器的运行。
javascript.shop
2020/04/10
6.5K0
如何用Pyppeteer打造高并发无头浏览器采集方案
以下文章将从行业痛点出发,结合 Pyppeteer 高并发无头浏览器技术,讲解如何在 Python 中打造一个可配置代理的高效采集方案,以采集 Amazon 今日特价商品并分析优惠价格与评分。文章按照“行业问题 → 技术灵感 → 构思实现 → 验证实验 → 潜在价值”五大板块展开,代码示例中集成了爬虫代理,并附有详尽注释,帮助读者快速上手。
jackcode
2025/05/12
1161
如何用Pyppeteer打造高并发无头浏览器采集方案
手写 Puppeteer:远程控制 Chromium
上一集我们实现了 Chromium 的自动下载,这集把 Chromium 跑起来,实现远程控制。
神说要有光zxg
2022/11/11
1.4K0
手写 Puppeteer:远程控制 Chromium
使用Python和Puppeteer渲染框架进行数据可视化
在信息爆炸的时代,数据可视化成为了一种强大的工具,帮助我们更好地理解和分析数据。Python和Puppeteer渲染框架的结合,为我们实现数据可视化提供了一种简单而强大的方式,本文将介绍如何使用Python和Puppeteer渲染框架进行数据可视化,并提供了一些实用的代码示例。
小白学大数据
2023/08/10
5130
Puppeteer 入门指引
Puppeteer 是一个 Node library,提供了一套完整的通过 DevTools 协议操纵 Chrome 或 Chromium 的 API。Puppeteer 默认以 无头(headless) 的方式运行, 也可以使用 GUI 的方式运行 Chrome 和 Chromium。
MudOnTire
2022/03/22
1.8K0
Puppeteer 入门指引
使用Pyppeteer抓取渲染网页
GitHub地址是:https://miyakogi.github.io/pyppeteer
SeanCheney
2019/01/28
6.8K0
使用Pyppeteer抓取渲染网页
前端人的爬虫工具【Puppeteer】
Puppeteer 是 Chrome 开发团队在 2017 年发布的一个 Node.js 包,同时还有 Headless Chrome。用来模拟 Chrome 浏览器的运行。它提供了高级API来通过 DevTools 协议控制无头 Chrome 或 Chromium ,它也可以配置为使用完整(非无头)Chrome 或 Chromium。
Snine
2022/02/11
3.7K0
前端人的爬虫工具【Puppeteer】
自动化 Web 性能分析之 Puppeteer 爬虫实践
通过上篇文章《自动化 Web 性能优化分析方案》的分享想必大家对“百策系统”有了初步的了解。本文将向大家介绍自动化性能分析使用的核心库——Puppeteer,并结合页面登录场景,介绍 Puppeteer 在百策系统中的应用。
政采云前端团队
2019/12/20
3.6K0
自动化 Web 性能分析之 Puppeteer 爬虫实践
利用puppeteer 库采集豆瓣音频代码示例
今天要给大家分享的采集代码,主要是使用 puppeteer 库进行编写的,用于采集豆瓣网相关音频。这段代码也是非常地简单实用,一起来看看吧。
华科云商小彭
2023/10/24
2510
利用puppeteer 库采集豆瓣音频代码示例
别只用 Selenium,新神器 Pyppeteer 绕过淘宝更简单!
如果大家对 Python 爬虫有所了解的话,想必你应该听说过 Selenium 这个库,这实际上是一个自动化测试工具,现在已经被广泛用于网络爬虫中来应对 JavaScript 渲染的页面的抓取。
崔庆才
2019/05/06
5.9K0
别只用 Selenium,新神器 Pyppeteer 绕过淘宝更简单!
使用Embassy库编写异步爬虫
最近有个学员想用Embassy库写一个网络爬虫程序。首先,我需要确认Embassy是什么。Embassy是一个用于Python的异步HTTP客户端库,基于aiohttp和async/await语法,适合高性能的爬虫需求。
华科云商小徐
2025/04/02
1080
Pyppeteer Python加载扩展及示例
Pyppeteer 是一个 Python 库,可以控制无头 Chrome 或 Chromium 浏览器,并在网页加载过程中加载扩展来增强浏览器功能。Pyppeteer 提供了一个 API,让您可以与无头浏览器交互,完成网页抓取、自动化测试、网页截图或 PDF 生成等任务。加载扩展的功能可以让您在浏览器导航到网页时,运行自定义的 JavaScript 代码,从而改变浏览器的行为。您可以在页面加载之前对页面进行操作,例如修改 DOM(文档对象模型)、拦截网络请求、注入其他脚本等。一些常见的加载扩展的用例有:
jackcode
2023/06/13
5220
Pyppeteer Python加载扩展及示例
pyppeteer实现不加载image,css等大文件, 缩短页面加载时间
在很多时候, 写爬虫的过程中, 不得不使用一些自动化工具来完成抓取, pyppeteer就是一个很好的选择, 一般情况下, 会选择页面加载完成后, 点击按钮等等, 但是有时候, 我们只需要其中的一些数据, 比如a标签的href, 其它的都不重要, 等待其它文件加载, 反而会影响爬虫的效率, 这时候, 就可以选择过滤一些无用文件的加载, 在缩短页面加载时间
不止于python
2022/07/20
1.7K0
pyppeteer实现不加载image,css等大文件, 缩短页面加载时间
Puppeteer 初探
Puppeteer是一个Node库,它提供了一个高级API来通过DevTools协议控制无头 Chrome或Chromium ,它也可以配置为使用完整(非无头)Chrome或Chromium。
CloudCat
2022/06/15
2.9K0
Puppeteer 初探
使用puppeteer 进行批量网页截图
配置里的'--proxy-server=socks5://127.0.0.1:1080' 是用来走本地小飞机代理的
heasy3
2020/08/02
2.7K0
使用pyppeteer淘宝登录
现在淘宝的商品搜索页必须要登录才能见,所以必须要cookies才能进行下一步操作。本期介绍如何使用pyppeteer登录淘宝,获取Cookies。
小歪
2019/03/07
3K0
相关推荐
Python爬虫神器pyppeteer,对 js 加密降维打击
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档