pyppeteer的使用方法总结

Pyppeteer 是一个基于 Chrome DevTools Protocol 的 Python 库,可以用于控制无头 Chrome 或 Chromium 浏览器,实现自动化测试、数据爬取、屏幕截图等功能。除了模拟鼠标操作和拖动元素外,Pyppeteer 还提供了许多其他的功能,包括:

页面操作:可以使用 page.goto() 方法打开网页,使用 page.click() 方法模拟鼠标点击,使用 page.type() 方法模拟键盘输入等。

元素操作:可以使用 page.querySelector() 方法和 page.querySelectorAll() 方法查找元素,使用 elementHandle.click() 方法模拟鼠标点击,使用 elementHandle.type() 方法模拟键盘输入等。

文件上传:可以使用 elementHandle.uploadFile() 方法上传文件,也可以使用 page.waitForFileChooser() 方法等待文件选择器出现,并使用 fileChooser.accept() 方法选择文件上传。

页面截图:可以使用 page.screenshot() 方法对页面进行截图,并可以指定截图区域、截图格式等参数。

网络请求:可以使用 page.setRequestInterception() 方法拦截网络请求,并可以使用 request.respond() 方法模拟请求的响应。

JavaScript 执行:可以使用 page.evaluate() 方法执行 JavaScript 代码,并可以在代码中访问页面的 DOM 元素和 JavaScript 对象。

PDF 生成:可以使用 page.pdf() 方法生成 PDF 文件,并可以指定页面大小、页面方向、页边距等参数。
以上是 Pyppeteer 的一些常用功能,Pyppeteer 还提供了许多其他的 API 和功能,可以根据具体需求进行使用。需要注意的是,Pyppeteer 的 API 和 Chrome DevTools Protocol 的 API 是一一对应的,因此可以参考 Chrome DevTools Protocol 的文档进行学习和使用。

pyppeteer的使用方法总结

Pyppeteer 是一个用 Python 操作 Headless Chrome 浏览器的工具,它提供了对 Chrome DevTools 协议的高级封装,可以方便地实现对浏览器的控制、页面的操作和数据的抓取。以下是 Pyppeteer 的使用方法总结:

1、安装 Pyppeteer

使用 pip 命令安装 Pyppeteer:

pip install pyppeteer

2、启动浏览器

通过 pyppeteer.launch 函数启动浏览器:


import asyncio
from pyppeteer import launch
async def main():
    browser = await launch(headless=False) # 设置headless为False以显示浏览器
    page = await browser.newPage()
    await page.goto('https://www.google.com')
    await browser.close()
asyncio.get_event_loop().run_until_complete(main())

在这个例子中,我们创建了一个asyncio的事件循环,并使用pyppeteer的launch()方法连接到Chrome浏览器。然后我们创建了一个新的页面,并使用goto()方法导航到Google的主页。最后,我们使用close()方法关闭浏览器。

3、控制页面

可以通过 page 对象控制页面,例如模拟键盘输入、鼠标点击等操作:

# 模拟键盘输入
await page.type('#kw', 'Hello, World!')
# 点击搜索按钮
await page.click('#su')
# 等待页面加载完成
await page.waitForNavigation()

4、获取页面内容

可以通过 page 对象获取页面内容,例如获取元素的文本、属性、截图等:

# 获取元素的文本
text = await page.querySelectorEval('#content_left h3', 'node => node.innerText')
print(text)
# 获取元素的属性
href = await page.querySelectorEval('#content_left h3 a', 'node => node.getAttribute("href")')
print(href)
# 截取页面截图
await page.screenshot({'path': 'example.png'})

可以通过 page 对象管理页面的 Cookie,例如设置、获取、清除 Cookie:

# 设置 Cookie
await page.setCookie({'name': 'name', 'value': 'value', 'domain': 'example.com'})
# 获取 Cookie
cookies = await page.cookies()
print(cookies)
# 清除 Cookie
await page.deleteCookie({'name': 'name'})
await page.deleteCookies()

6、处理 JavaScript

可以通过 page 对象执行页面上的 JavaScript 代码:

# 执行 JavaScript 代码
result = await page.evaluate('1 + 2')
print(result)
# 注入 JavaScript 代码
await page.evaluate('console.log("Hello, World!")')

7、延迟加载

可以通过 page.waitFor 系列函数实现延迟加载,例如等待元素出现、等待元素隐藏、等待 XPath 表达式等:

# 等待元素出现
await page.waitFor('#element')
# 等待元素隐藏
await page.waitFor('#element', hidden=True)
# 等待 XPath 表达式
await page.waitForXPath('//div[@class="example"]')

8、页面事件

可以通过 page 对象模拟页面事件,例如触发表单提交、触发键盘事件、触发鼠标事件等

# 提交表单
await page.evaluate('document.forms[0].submit()')
# 触发键盘事件
await page.keyboard.press('Enter')
# 触发鼠标事件
await page.mouse.click(10, 10)

9、通过调试模式操作浏览器

async def main():
    # 连接到已经打开的浏览器   data_dic["webSocketDebuggerUrl"]为调试的编号,可以通过 http://localhost:9222/json/version获取
    browser = await connect({'browserWSEndpoint': '%s'%data_dic["webSocketDebuggerUrl"]})
    page = await browser.newPage()
    await page.setViewport({'width': 1200, 'height': 800})
    await page.goto('https://baidu.com')
    await page.screenshot({'path': 'example.png'})
    time.sleep(3)
    await page.type('#kw',"您好")
    await page.click('#su')

    # await browser.close()
asyncio.get_event_loop().run_until_complete(main())

10、设置浏览器窗口大小和位置

可以通过 pyppeteer.launch 函数的 args 参数来设置浏览器窗口的大小和位置:

import asyncio
from pyppeteer import launch
async def main():
    browser = await launch(args=['--window-size=1366,768', '--window-position=0,0'])
    page = await browser.newPage()
    await page.goto('https://www.baidu.com')
    await browser.close()
asyncio.run(main())

11、使用代理服务器

可以通过 pyppeteer.launch 函数的 args 参数来使用代理服务器访问网站:

import asyncio
from pyppeteer import launch
async def main():
    browser = await launch(args=['--proxy-server=127.0.0.1:8080'])
    page = await browser.newPage()
    await page.goto('https://www.baidu.com')
    await browser.close()
asyncio.run(main())

12、禁止加载图片和 CSS

可以通过 pyppeteer.launch 函数的 args 参数来禁止加载图片和 CSS:

import asyncio
from pyppeteer import launch
async def main():
    browser = await launch(args=['--blink-settings=imagesEnabled=false'])
    page = await browser.newPage()
    await page.goto('https://www.baidu.com')
    await browser.close()
asyncio.run(main())

13、处理弹出窗口

可以通过监听 page 对象的 dialog 事件来处理弹出窗口:

import asyncio
from pyppeteer import launch
async def main():
    browser = await launch()
    page = await browser.newPage()
    await page.goto('https://www.baidu.com')
    # 监听弹出窗口事件
    def dialog_handler(dialog):
        print(dialog.type, dialog.message)
        asyncio.ensure_future(dialog.dismiss())
    page.on('dialog', dialog_handler)
    # 点击页面上的按钮,会弹出一个提示框
    await page.evaluate('alert("Hello, World!")')
    await browser.close()
asyncio.run(main())

14、使用 Chrome 插件

可以通过 pyppeteer.launch 函数的 args 参数来使用 Chrome 插件,例如使用 AdBlock Plus 插件屏蔽广告:

import asyncio
from pyppeteer import launch
async def main():
    browser = await launch(args=[
        '--disable-extensions-except=./adblock.crx',
        '--load-extension=./adblock.crx',
    ])
    page = await browser.newPage()
    await page.goto('https://www.baidu.com')
    await browser.close()
asyncio.run(main())

15、使用自定义的 User-Agent

可以通过 page.setUserAgent 方法设置自定义的 User-Agent:

import asyncio
from pyppeteer import launch
async def main():
    browser = await launch()
    page = await browser.newPage()
    # 设置自定义的 User-Agent
    await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36')
    await page.goto('https://www.baidu.com')
    await browser.close()
asyncio.run(main())

16、使用无头模式

可以通过 pyppeteer.launch 函数的 headless 参数来设置是否使用无头模式,默认为 True:


import asyncio
from pyppeteer import launch
async def main():
    browser = await launch(headless=False)
    page = await browser.newPage()
    await page.goto('https://www.baidu.com')
    await browser.close()
asyncio.run(main())

17、控制页面加载超时时间

可以通过 page.setDefaultNavigationTimeout 方法设置页面加载超时时间:

import asyncio
from pyppeteer import launch
async def main():
    browser = await launch()
    page = await browser.newPage()
    # 设置页面加载超时时间为 10 秒
    await page.setDefaultNavigationTimeout(10000)
    await page.goto('https://www.baidu.com')
    await browser.close()
asyncio.run(main())

18、使用 XPath 表达式

可以通过 page.xpath 方法使用 XPath 表达式选择元素

import asyncio
from pyppeteer import launch
async def main():
    browser = await launch()
    page = await browser.newPage()
    await page.goto('https://www.baidu.com')
    # 使用 XPath 表达式选择元素
    element = await page.xpath('//div[@id="wrapper"]')
    print(element)
    await browser.close()
asyncio.run(main())

19、获取元素坐标,模拟人工拖动 随机延时

方法未人工完全验证,需要测试后具体调整细节
首先,我们可以通过 JavaScript 的 getBoundingClientRect() 方法获取元素的位置和大小信息。该方法返回的是一个包含 top、right、bottom、left、width 和 height 属性的对象,分别表示元素的上边界、右边界、下边界、左边界、宽度和高度。然后,可以通过 Pyppeteer 的 page.mouse 对象来模拟鼠标拖动操作,包括按下鼠标、拖动鼠标和释放鼠标。其中,按下鼠标和释放鼠标的方法分别是 down 和 up,拖动鼠标的方法是 move。延时可以使用 Python 的 time.sleep() 方法进行实现,可以使用 random 模块生成随机的延时时间。
下面是一个示例代码,演示如何使用 Pyppeteer 模拟人工拖动元素:

import asyncio
import random
import time
from pyppeteer import launch
async def drag_element(page, selector):
    # 获取元素的位置和大小信息
    elem = await page.querySelector(selector)
    box = await elem.boundingBox()
    x = box['x']
    y = box['y']
    width = box['width']
    height = box['height']
    # 鼠标按下
    await page.mouse.down(x + width / 2, y + height / 2)
    # 随机延时
    await asyncio.sleep(random.uniform(0.1, 0.3))
    # 鼠标拖动
    await page.mouse.move(x + width / 2 + 50, y + height / 2 + 50, options={'steps': 10})
    # 随机延时
    await asyncio.sleep(random.uniform(0.1, 0.3))
    # 鼠标释放
    await page.mouse.up()
async def main():
    browser = await launch()
    page = await browser.newPage()
    await page.goto('https://www.baidu.com')
    await drag_element(page, '#su')
    # 关闭浏览器
    await browser.close()
asyncio.run(main())

在上面的示例中,我们首先打开百度搜索页面,然后通过 drag_element 函数模拟人工拖动搜索按钮。该函数接受两个参数:page 表示页面对象,selector 表示要拖动的元素的 CSS 选择器。在函数内部,我们先获取元素的位置和大小信息,然后按下鼠标、拖动鼠标和释放鼠标,期间使用 asyncio.sleep() 方法随机延时,模拟人工拖动快慢速度。最后,我们调用 drag_element 函数对搜索按钮进行拖动。

20、禁用js

# 禁用JavaScript
await page.setJavaScriptEnabled(False)

21、pyppeteer中 几种等待的区别waitForNavigation(),waitForNavigation(),waitForSelector(),waitForXPath()的区别

waitForNavigation():等待页面的主要导航完成,即页面URL的变化。主要用于等待页面的跳转和刷新等操作完成。如果页面中使用了 AJAX 或者其他异步加载的方式,可能会导致页面URL不会变化,此时 waitForNavigation() 方法会一直等待,直到超时报错。

waitForSelector():等待页面中指定的元素出现。主要用于等待页面异步加载的元素出现,例如在使用 AJAX 加载数据时,页面中的某些元素需要等待异步加载完成才会出现。

waitForXPath():等待页面中指定的 XPath 表达式所匹配的元素出现。与 waitForSelector() 类似,但是可以使用更复杂的 XPath 表达式来选择元素。

waitFor():等待指定的时间或者指定的条件。可以用于等待页面的加载、元素的出现、特定条件的满足等。
以上方法都是 Puppeteer 库中的等待方法,用于等待页面或者元素加载完成。具体使用哪个方法,取决于具体需要等待的内容。

js pyppeteer子元素获取

    '''可以使用querySelectorAll()方法获取'#primaryInfo > div > div.overview'下的所有子元素,然后使用evaluate()方法获取每个子元素的innerText属性,最后打印出来。'''
    elements = await target_page.querySelectorAll('#primaryInfo > div > div.overview > *')
    for element in elements:
        content = await target_page.evaluate('(element) => element.innerText', element)
        print(content)

querySelector 判断元素是否存在,不存在返回None

is_element = await page.querySelector('''
        #sd-body > section > section > main > section > main > div > div.ant-card.sd-has-table > div > div > div.ant-table-wrapper > div > div > div > div > div > table > tbody
        ''')
    if is_element is None:
        print('没有检测到需要下载的数据')
        win32api.MessageBox(0, '没有需要下载的文件,点击确认后退出程序', '提醒', win32com.MB_OK)
        exit()

pyppeteer是一个基于asyncio和Chrome DevTools Protocol(CDP)的Python库,可以通过CDP连接到Chrome浏览器实例,并通过Python代码控制浏览器。与playwright类似,pyppeteer也是使用WebSocket连接来与浏览器进行通信的。
在使用pyppeteer连接浏览器时,需要使用webSocketDebuggerUrl参数来指定WebSocket连接的URL。这个URL通常是以ws://或wss://开头,后面跟着浏览器的地址和端口号。例如:

import asyncio
from pyppeteer import launch
async def main():
    browser = await launch(
        headless=False,
        args=['--disable-infobars'],
        executablePath='C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe',
        userDataDir='C:\\Users\\UserName\\AppData\\Local\\Google\\Chrome\\User Data',
        timeout=0,
        ignoreHTTPSErrors=True,
        dumpio=True,
        logLevel='INFO',
        devtools=False,
        autoClose=False,
        handleSIGINT=True,
        handleSIGTERM=True,
        handleSIGHUP=True,
        env={},
        slowMo=0,
        ignoreDefaultArgs=False,
        appMode=False,
        remoteDebuggingPort=9222, # 用于连接浏览器的端口号
        )
    page = await browser.newPage()
    await page.goto("https://www.baidu.com")
    await asyncio.sleep(5)
    await browser.close()
asyncio.get_event_loop().run_until_complete(main())

在上述代码中,我们通过launch()方法来启动一个Chrome浏览器实例,并指定了一个remoteDebuggingPort参数来指定连接浏览器时使用的端口号。在launch()方法执行后,我们可以通过browser.newPage()方法来创建一个新的浏览器页面,并通过page.goto()方法来导航到指定的URL。在这里,我们并没有使用webSocketDebuggerUrl参数来连接浏览器,而是使用了remoteDebuggingPort参数来指定连接端口号。这是因为pyppeteer库会自动使用指定的端口号来构造WebSocket连接的URL,因此我们不需要手动指定webSocketDebuggerUrl参数。


  目录