Loading [MathJax]/jax/output/CommonHTML/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 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
基于 qiankun 的微前端最佳实践(图文并茂) - 应用间通信篇
本文是基于 qiankun 的微前端最佳实践系列文章之 应用间通信篇,本文将分享在 qiankun 中如何进行应用间通信。
落落落洛克
2021/01/08
7.6K0
基于 qiankun 的微前端最佳实践(图文并茂) - 应用间通信篇
当企微侧边栏遇上微前端
同样地,为了不浪费大家的时候,如果你不知道 企微侧边栏 是什么,这篇文章可以关掉了。
写代码的海怪
2022/03/30
1.4K0
当企微侧边栏遇上微前端
微前端qiankun从搭建到部署的实践总结
最近负责的新项目用到了qiankun,写篇文章分享下实战中遇到的一些问题和思考。
coder_koala
2021/09/22
2.3K0
微前端qiankun从搭建到部署的实践总结
做个微前端demo
之前已经分享过微前端,至于落地还是不落地就看公司和项目了,今天基于微前端做了个小demo,分享一下。可以去qiankun官网看看,包括微前端核心设计理念、为什么不是ifram和快速上手及一些问题都很清楚。
wade
2020/09/04
1.1K0
用微前端 qiankun 接入十几个子应用后,我遇到了这些问题
我们先用 vue-cli快速创建一个项目,作为主应用,这里把他取名为 main-app
winty
2023/12/19
8.7K3
用微前端 qiankun 接入十几个子应用后,我遇到了这些问题
微前端从singleSpa到qiankun
微前端解决什么问题?近几年前端的工程化知识开发愈演愈烈,后端解耦,前端聚合,兴起微前端的技术主要是因为SPA项目工程,得到了长足的发展,所有的微前端都是为了解决工程与工程之间的粘合问题即是 从所有收集的部分组成并返回一个无缝的HTML页面
用户10106350
2022/10/28
1.3K0
微前端从singleSpa到qiankun
微前端框架 qiankun 项目实战(一)--本地开发篇
公司使用技术栈是vue,最近遇到了一个需求,要把原有后台管理系统的功能模块搬迁到新的后台管理系统上面去。原本这没有多复杂的事,直接复制粘贴改改就可以,但是有这么几个坑点,我瞬间陷入了沉思:
落落落洛克
2021/07/05
1K0
微前端框架 qiankun 项目实战(一)--本地开发篇
基于qiankun微前端实战 + 部署笔记
因业务需要,以下文字纯个人qiankun实战学习笔记,不谈原理只记操作过程,内容难免有纰漏部分,敬请不吝赐教批评指正。
同学小强
2022/08/24
1.4K0
基于qiankun微前端实战 + 部署笔记
2022年了你必须要学会搭建微前端项目及部署方式
一、微前端简介 微前端是一种类似于微服务的架构,它将微服务的理念应用于浏览器端,即将 Web 应用由单一的单体应用转变为多个小型前端应用聚合为一的应用。各个前端应用可以独立运行、独立开发、独立部署。 微前端的好处 应用自治。只需要遵循统一的接口规范或者框架,以便于系统集成到一起,相互之间是不存在依赖关系的。 单一职责。每个前端应用可以只关注于自己所需要完成的功能。 技术栈无关。你可以使用 Angular 的同时,又可以使用 React 和 Vue。 微前端的缺点 应用的拆分基础依赖于基础设施的构建
前端进阶之旅
2022/01/06
2.4K0
2022年了你必须要学会搭建微前端项目及部署方式
记一次 微前端 qiankun 项目 实践 !!! 防踩坑指南
最近在做微前端的项目 , 过程中真是踩了不少坑 , 在有限的资料中不断试错 , 默默无语两行泪 哈哈.  在此次将采坑部分都记录下来, 让更多的人少走点弯路 ,   此项目使用 蚂蚁金服qiankun 为基础作为开发 . 话不多说 开讲 !!!
王小婷
2020/11/02
3.5K0
微前端落地,乾坤小有乾坤
通俗易懂的来说,微前端是可以将一个大应用的不同部分进行独立的部署,各个部分之间相互独立,独立部署的能力允许他们构建孤立或松散耦合的服务。即将单页面前端应用由单一的单体应用转变为多个小型前端应用聚合为一的应用。
javascript艺术
2022/06/08
6620
微前端落地,乾坤小有乾坤
乾坤(qiankun)微前端初体验
通俗易懂的来说,微前端是可以将一个大应用的不同部分进行独立的部署,各个部分之间相互独立,独立部署的能力允许他们构建孤立或松散耦合的服务。即将单页面前端应用由单一的单体应用转变为多个小型前端应用聚合为一的应用。
javascript艺术
2021/05/28
3.9K0
乾坤(qiankun)微前端初体验
微前端x重构实践落地总结
大家好,我是海怪。最近换到了新部门,在做智能平台相关的内容。我接到的第一个任务就是把以前前端的项目重构一次。
写代码的海怪
2022/03/29
1.1K0
微前端x重构实践落地总结
微前端说明以及使用
·  原理是通过在主应用引入每个子应用的入口文件(main.js),进行解析,并指定渲染的容器
Dawnzhang
2022/05/10
1.2K0
微前端说明以及使用
【微前端】10分钟学会乾坤大挪移
今天刚刚学习了一个微前端框架——乾坤,正着热乎劲,写一篇入门博客。这篇文章不会讨论太多的原理和实现,只是一个入门写 Hello World 的教程。
童欧巴
2021/08/20
1.3K0
【微前端】10分钟学会乾坤大挪移
我们是怎么在项目中落地qiankun的
由于业务增长,团队拆分,我们需要将原有系统的一部分模块(Vue实现)迁移到另外一个系统(React)中。但两个系统技术栈不同,导致重构成本变大,但业务又希望在短期内看到效果,后面可以增量的重构。
GopalFeng
2022/08/01
1.5K0
我们是怎么在项目中落地qiankun的
微前端框架qiankun项目实战(二)--踩坑与部署篇
在上一篇《微前端框架qiankun项目实战(一)--本地开发篇》发布后,感谢有网友提出了微应用的缓存问题,的确基于第一篇使用的registerMicroApps方式很难做到缓存,要做到应用缓存的方式使用手动加载管理微应用的方式是最好的,我将再写一篇补充篇使用loadMicroApp手动管理微应用,本篇我会模拟部署一下主应用和微应用,并将揭开我上一篇所谓的巨坑是什么。
coder_koala
2021/07/08
1.9K0
微前端框架qiankun项目实战(二)--踩坑与部署篇
微前端乾坤
qiankun 是一个基于 single-spa 的微前端实现库,旨在帮助大家能更简单、无痛的构建一个生产可用微前端架构系统。qiankun 孵化自蚂蚁金融科技基于微前端架构的云产品统一接入平台。
leader755
2022/03/09
1.5K0
深入浅出微前端
在微前端出现之前,一个系统的前端开发模式基本都是单仓库,包含了所有的功能、代码...
Careteen
2022/02/14
3.4K0
深入浅出微前端
为了实践微前端,重构了自己的导航网站
笔者早期开发了一个导航网站,一直想要重构,因为懒拖了好几年,终于,在了解到微前端大法后下了决心,因为工作上一直没有机会实践,没办法,只能用自己的网站试试,思来想去,访问量最高的也就是这个破导航网站了,于是用最快的时间完成了基本功能的重构,然后准备通过微前端来扩展网站的功能,比如天气、待办、笔记、秒表计时等等,这些功能属于附加的功能,可能会越来越多,所以不能和导航本身强耦合在一起,需要做到能独立开发,独立上线,所以使用微前端再合适不过了。
街角小林
2022/03/21
5820
为了实践微前端,重构了自己的导航网站
推荐阅读
相关推荐
基于 qiankun 的微前端最佳实践(图文并茂) - 应用间通信篇
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验