Pyppeteer的使用


Pyppeteer

介绍

Puppeteer是基于Node.js的一个开发工具,Pyppeteer是其民间的Python版本.和Selenium类似,其也需要一个浏览器的内核,Pyppeteer使用的是Chromium浏览器.
其支持async,能实现异步爬虫,效率更高.

使用

启动浏览器

使用 launch 方法能启动浏览器,通过改变该方法的参数,实现对浏览器的控制,示例代码如下:

import async
from pyppeteer import launch

browser = await launch()

参数列表:

  • ignoreHTTPSError(bool):是否忽略HTTPS的错误,默认为 false
  • headless(bool):是否启用无头模式,默认为 false
  • executablePath(str):可执行文件的路径.指定该参数之后就能使用已有的Chrome或者Chromium
  • slowMo(int|float):通过传入参数,控制Pyppeteer的模拟操作的间隔时间
  • args(List[str]):在执行过程中传入的额外参数,该参数在模拟之前执行,所以可以用来伪装
  • ignoreDefaultArgs(bool):是否忽略Pyppeteer的默认参数,慎用
  • handleSIGINT(bool):是否响应Ctrl+C终止浏览器的信号,默认为true
  • handleSIGTERM(bool):是否响应kill命令,默认为true
  • handlerSIGHUP(bool):是否响应挂起信号,,默认为true
  • dumpio(bool):是否将Pyppeteer的输出内容传给stdout和stdin,默认为false
  • userDataDir(str):用户数据文件夹,用于保留一些个性化配置和操作记录
  • env(dict):环境变量,传入字典形式数据
  • devtools(bool):是否为每一个页面开启调试工具,默认为false
  • logLevel(int|str):日志级别,默认和 root logger 对象级别相同
  • autoClose(bool):当命令执行完之后是否自动关闭浏览器,默认为true
  • loop:事件循环对象

禁用提示条

browser = await launch(args=['--disable-infobars'])

这样就能关闭Chrome的Chrom正受到自动测试软件的控制

但是这样并不能修改webdriver的属性

browser = await launch(args=['--disable-infobars']) 
page = await browser.newPage()
await page.evaluateOnNewDocument("Object.defineProperty(navigator,"webdriver",{get:()=>undefined})") 这样就能隐藏webdriver的属性

页面大小设置

width = 100
height = 100
browser = await launch(args=['--disable-infobars',f"--window-size={width},{height}"]) ##这是修改页面大小的参数,这里用了format,方便page自定义 
page = await browser.newPage()
await page.setViewport({'widht':width,"height":height})
await page.evaluateOnNewDocument("Object.defineProperty(navigator,"webdriver",{get:()=>undefined})") 这样就能隐藏webdriver的属性

无痕模式

咳咳,懂得都懂

width = 100
height = 100
browser = await launch(args=['--disable-infobars',f"--window-size={width},{height}"]) 
context = await browser.createIncognitoBrowserContext()
page = await browser.newPage()
await page.setViewport({'widht':width,"height":height})
await page.evaluateOnNewDocument("Object.defineProperty(navigator,"webdriver",{get:()=>undefined})") ##这样就能隐藏webdriver的属性

page对象

page 对象就是我们操作的浏览器选项卡,通过 newPage 方法创建

选择器

Pyppeteer 的选择器函数很有意思:

  • querySelector 返回匹配的第一个节点,J 和其等价,支持 CSS 选择器
  • querySelectorAll 返回匹配的所有节点.JJ 和其等价,支持 CSS 选择器
  • xpath 返回匹配的所有节点.Jx和其等价,支持XPATH
  • querySelectorEval 对匹配的节点使用提供的 js 脚本, 和Jeval等价
  • querySelectorAllEval 对匹配的节点使用提供的 js 脚本, 和JJeval等价

在使用选择器之前,建议调用对应的 waitFor 函数,防止对应节点没有出现.

对于 CSS 选择器,函数为:waitForSelector()

对于 XPATH 选择器,函数为:waitForXPath()

选项卡操作

使用 newPage 就能新建一个选项卡,接下来介绍如何对这些选项卡操作.

  • pages: 该方法可以得到所有打开的选项卡,可以以类似数组的方法进行访问
  • bringToFront: 选中这个选项卡
  • goBack: 回退
  • goForward:前进
  • reload:刷新
  • pdf:保存为pdf
  • screenshot:截屏
  • setContent:截图
  • setContext:设置网页 HTML
  • setUserAgent:设置 User-Agent
  • setExtraHTTPHeaders: 设置 Headers
  • close:关闭

点击

click(selector,options={})

selector 输入节点的 css 选择器, options是一个字典参数,如下:

options = {
    button:"", ##鼠标按钮,取值为 left, middle, right
    clickCount:"", ##点击次数
    delay:"" ##点击延迟
}

输入文本

type(selector,input)

获取信息

获取源代码通过:
content()

获取 cookie 通过:
cookies(

执行 js

通过 evaluate 方法执行 js 脚本.

也可使用之前选择器一节提供的选择器执行 js.

延时等待

  • WaitFor: 通用等待方法
  • waitForFunction: 等待某个 JS 方法执行完毕或返回结果
  • waitForNavigation: 等待页面跳转
  • WaitForRequest: 等待请求发出
  • WaitForResponse: 等待响应
  • WaitForXPath: 等待XPath 选择器
  • WaitForSelector: 等待选择器

Author: Dovahkiin
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source Dovahkiin !
  TOC