pyppeteer(python版puppeteer)基本使用

本文介绍如何使用Pyppeteer,一个基于Puppeteer的Python版本,进行无头浏览器操作。解决常见问题如NetworkError,浏览器窗口大小调整及多页面卡死等,并提供实际项目示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、前言

以前使用selenium的无头浏览器,自从phantomjs2016后慢慢不更新了之后,selenium也开始找下家,这时候谷歌的chrome率先搞出来无头浏览器并开放了各种api,随后firefox也开始做。
现在selenium的测试也都支持这两个浏览器的无头模式了,只需要在引入的时候配置一下就可以了。之所以要采用谷歌chrome官方无头框架puppeteer的python版本pyppeteer,是因为有些网页是可以检测到是否是使用了selenium。并且selenium所谓的保护机制不允许跨域cookies保存以及登录的时候必须先打开网页然后后加载cookies再刷新的方式很不友好。

 

二、pyppeteer

github地址:https://miyakogi.github.io/pyppeteer/

pyppeteer这个项目是非官方的,是基于谷歌官方puppeteer的python版本。

注意:本来chrome就问题多多,puppeteer也是各种坑,加上pyppeteer是基于前者的改编python版本,也就是产生了只要前两个有一个有bug,那么pyppeteer就会原封不动的继承下来,本来这没什么,但是现在遇到的问题就是pyppeteer这个项目从18年9月份之后就没更新过了,前两者都在不断的更新迭代,而pyppeteer一直不更新,导致很多bug根本没人修复。

遇到的错误:

1)pyppeteer.errors.NetworkError: Protocol error Network.getCookies: Target close
控制访问指定url之后await page.goto(url),会遇到上面的错误,如果这时候使用了sleep之类的延时也会出现这个错误或者类似的time out。
这个问题是puppeteer的bug,但是对方已经修复了,而pyppeteer迟迟没更新,就只能靠自己了,搜了很多人的文章,例如:https://github.com/miyakogi/pyppeteer/issues/171 ,但是我按照这个并没有成功。
也有人增加一个函数,但调用这个参数依然没解决问题。

async def scroll_page(page):
    cur_dist = 0
    height = await page.evaluate("() => document.body.scrollHeight")
    while True:
        if cur_dist < height:
            await page.evaluate("window.scrollBy(0, 500);")
            await asyncio.sleep(0.1)
            cur_dist += 500
        else:
            break

可以把python第三方库websockets版本7.0改为6.0就可以了,亲测可用。

pip uninstall websockets #卸载websockets
pip install websockets==6.0 #指定安装6.0版本

 

2)chromium浏览器多开页面卡死问题
解决这个问题的方法就是浏览器初始化的时候添加’dumpio’:True。

 

 

3)浏览器窗口很大,内容显示很小
上面的问题是需要设置浏览器显示大小,默认就是无法正常显示。可以看到页面左侧右侧都是空白,网站内容并没有完整铺满chrome.

browser = await launch({'headless': False,'dumpio':True, 'autoClose':False,'args': ['--no-sandbox', '--window-size=1366,850']})
await page.setViewport({'width':1366,'height':768})

通过上面设置Windows-size和Viewport大小来实现网页完整显示。

但是对于那种向下无限加载的长网页这种情况如果浏览器是可见状态会显示不全,针对这种情况的解决方法就是复制当前网页新开一个标签页粘贴进去就正常了

 

三、实际项目示例 

 

import asyncio
from pyppeteer import launch
import time

async def main():exepath = 'C:/Users/tester02/AppData/Local/Google/Chrome/Application/chrome.exe'
    browser = await launch({'executablePath': exepath, 'headless': False, 'slowMo': 30})
    page = await browser.newPage()
    await page.setViewport({'width': 1366, 'height': 768})
    await page.goto('http://192.168.2.66')
    await page.type("#Login_Name_Input", "test02")
    await page.type("#Login_Password_Input", "12345678", )
    await page.waitFor(1000)
    await page.click("#Login_Login_Btn")
    await page.waitFor(3000)
    await browser.close()

asyncio.get_event_loop().run_until_complete(main())

 

import asyncio
import time
from pyppeteer import launch


async def gmailLogin(username, password, url):
    #'headless': False如果想要浏览器隐藏更改False为True
    # 127.0.0.1:1080为代理ip和端口,这个根据自己的本地代理进行更改,如果是vps里或者全局模式可以删除掉'--proxy-server=127.0.0.1:1080'
    browser = await launch({'headless': False, 'args': ['--no-sandbox', '--proxy-server=127.0.0.1:1080']})
    page = await browser.newPage()
    await page.setUserAgent(
        'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36')

    await page.goto(url)

    # 输入Gmail
    await page.type('#identifierId', username)
    # 点击下一步
    await page.click('#identifierNext > content')
    page.mouse  # 模拟真实点击
    time.sleep(10)
    # 输入password
    await page.type('#password input', password)
    # 点击下一步
    await page.click('#passwordNext > content > span')
    page.mouse  # 模拟真实点击
    time.sleep(10)
    # 点击安全检测页面的DONE
    # await page.click('div > content > span')#如果本机之前登录过,并且page.setUserAgent设置为之前登录成功的浏览器user-agent了,
    # 就不会出现安全检测页面,这里如果有需要的自己根据需求进行更改,但是还是推荐先用常用浏览器登录成功后再用python程序进行登录。

    # 登录成功截图
    await page.screenshot({'path': './gmail-login.png', 'quality': 100, 'fullPage': True})
    #打开谷歌全家桶跳转,以Youtube为例
    await page.goto('https://www.youtube.com')
    time.sleep(10)


if __name__ == '__main__':
    username = '你的gmail包含@gmail.com'
    password = r'你的gmail密码'
    url = 'https://gmail.com'
    loop = asyncio.get_event_loop()
    loop.run_until_complete(gmailLogin(username, password, url))
# 代码由三分醉编写,网址www.sanfenzui.com,参考如下文章:
# https://blog.youkuaiyun.com/Chen_chong__/article/details/82950968

 

转载于:https://www.cnblogs.com/baihuitestsoftware/p/10531462.html

<think>嗯,用户想在Python使用Puppeteer,但可能对相关库不太熟悉。首先,我需要确认Python中的Puppeteer对应库是什么。根据提供的引用,pyppeteerPythonPuppeteer,所以应该用这个库。 用户需要教程和示例代码,所以应该分步骤讲解安装和基本用法。引用4提到可能需要调整websockets的本,安装时需要注意这点。要确保用户安装正确的依赖,避免出现问题。 接下来,示例代码应该包括启动浏览器、打开页面、截图等基本操作。然后,用户可能还需要处理JavaScript渲染的页面,比如等待元素加载,模拟点击等。引用3中提到Puppeteer可以处理JS内容,所以需要展示如何等待元素和模拟交互。 另外,用户可能关心实际应用场景,比如数据抓取或自动化测试,所以示例应包括这些方面。例如,抓取动态生成的内容,或者填写表单并提交。 最后,常见问题部分需要涵盖无头模式、选择器使用和性能优化,这些都是用户可能遇到的困难。引用3提到无头模式的优势,应该强调这一点。同时,引用4中的本问题也要提醒用户注意。 需要确保回答结构清晰,步骤明确,代码示例正确,并且引用相关的参考资料来支持内容。这样用户就能按照步骤顺利使用pyppeteer进行开发了。</think>以下是关于在Python使用Puppeteer(通过Pyppeteer库)的详细指南: ### 一、环境准备 1. 安装Pyppeteer库: ```bash pip install pyppeteer ``` *注意:如遇websockets本冲突,需降级安装(引用[^4]): ```bash pip uninstall websockets pip install websockets==6.0 ``` ### 二、基础使用示例 ```python import asyncio from pyppeteer import launch async def main(): # 启动浏览器(无头模式) browser = await launch(headless=True) page = await browser.newPage() # 访问页面 await page.goto('https://example.com') # 截图操作 await page.screenshot({'path': 'example.png'}) # 获取页面标题 title = await page.title() print(f"页面标题: {title}") await browser.close() # 执行异步函数 asyncio.get_event_loop().run_until_complete(main()) ``` ### 三、核心功能演示 #### 1. 处理动态内容加载 ```python await page.goto('https://dynamic-website.com') # 等待特定元素加载 await page.waitForSelector('.loaded-content', {'timeout': 5000}) content = await page.querySelectorEval('.content', 'el => el.textContent') print(content) ``` #### 2. 表单自动化 ```python # 输入文本 await page.type('#username', 'testuser') await page.type('#password', 'testpass') # 勾选复选框 checkbox = await page.querySelector('#remember-me') await checkbox.click() # 提交表单 await page.click('#submit-btn') ``` #### 3. 网络请求监控 ```python async def intercept_request(req): if req.resourceType == 'image': await req.abort() else: await req.continue_() await page.setRequestInterception(True) page.on('request', lambda req: asyncio.ensure_future(intercept_request(req))) ``` ### 四、最佳实践 1. **无头模式配置**(引用[^3]): ```python browser = await launch( headless=True, args=['--no-sandbox', '--disable-setuid-sandbox'] ) ``` 2. **性能优化**: ```python # 禁用图片加载 await page.setRequestInterception(True) page.on('request', lambda req: req.abort() if req.resourceType == 'image' else req.continue_()) ``` 3. **异常处理**: ```python try: await page.waitForNavigation({'timeout': 3000}) except TimeoutError: print("页面加载超时") ``` ### 五、应用场景 1. **数据抓取**:爬取JavaScript渲染的SPA应用数据(引用[^1]) 2. **自动化测试**:执行端到端的网页功能测试(引用[^2]) 3. **网页监控**:定期检查网站可用性和内容更新 4. **PDF生成**:`await page.pdf({'path': 'report.pdf'})`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值