Damn1t
for you I bleed myself dry
FRIENDS
baidu

Pyppeteer学习笔记

2019-06-21 Pyppeteer

Pyppeteer学习笔记

有的没的

浏览器处理过程中的每一个步骤:
1.处理HTML脚本,生成DOM树
2.处理CSS脚本,生成CSSOM树 (DOM和CSSOM是独立的数据结构)
3.将DOM树和CSSOM树合并为渲染树
4.对渲染树中的内容进行布局,计算每个节点的几何外观
5.将渲染树中的每个节点绘制到屏幕中

Headless Browser实际就是节约了第4,5步的时间。

安装

文档地址:https://miyakogi.github.io/pyppeteer/
要求的最佳适配环境:py3.6

安装方法:

  • pip install pyppeteer
  • 安装chromium:
    1. 因为国内的原因,源下载地址被屏蔽了,所以可以利用国内的镜像地址:https://npm.taobao.org/mirrors/chromium-browser-snapshots/.
    2. 由于每次运行时都要指定chromium的路径,我的办法是自己写了个简单的模块,然后每次import,也可以每次在launch中直接引入executablePath的绝对路径

实际应用

首先要说的是,puppeteer 是一个headless的浏览器,由于phantomJS已经被deprecated,Firefox和chrome都已经开发出了自己的headless浏览器,puppeteer是个很好用的东西

实例

官方给出了两个实例:

  1. 截屏
1
2
3
4
5
6
7
8
9
10
11
import asyncio
from pyppeteer import launch

async def main():
browser = await launch()
page = await browser.newPage()
await page.goto('http://example.com')
await page.screenshot({'path': 'example.png'})
await browser.close()

asyncio.get_event_loop().run_until_complete(main())
  1. 调用JS脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import asyncio
from pyppeteer import launch

async def main():
browser = await launch()
page = await browser.newPage()
await page.goto('http://example.com')
await page.screenshot({'path': 'example.png'})

dimensions = await page.evaluate('''() => {
return {
width: document.documentElement.clientWidth,
height: document.documentElement.clientHeight,
deviceScaleFactor: window.devicePixelRatio,
}
}''')

print(dimensions)
# >>> {'width': 800, 'height': 600, 'deviceScaleFactor': 1}
await browser.close()

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

```

### 参数 ###
有两种风格:

- 键值对形式

browser = await launch({‘headless’: True})

1
2

- 关键字形式

browser = await launch(headless=True)

1
2
3
4
5
6
7
8
9
10

### 元素选择器 ###
在python中,`$`不被用来命名方法,所以改为了`querySelector`

`Page.$()/Page.$$()/Page.$x()`都改为了`Page.querySelector()/Page.querySelectorAll()/Page.xpath()`,同样也有速记的方式:`Page.J(), Page.JJ(), and Page.Jx()`


### `Page.evaluate()`和`Page.querySelectorEval()`的参数 ###
`Puppeteer`版本采用了js的原生方法和表达式字符串,但`pyppeteer`采用了js的字符串。js的字符串有时能够被作为函数或表达式,`Pyppeteer `尝试自动监测该字符串是否为函数或表达式,但有时他会失败了,所以 当一个表达式无法被识别,你可以使用`force_expr=True`让它生效
例如:

content = await page.evaluate(‘document.body.textContent’, force_expr=True)

1
获取元素内部文本的示例:

element = await page.querySelector(‘h1’)
title = await page.evaluate(‘(element) => element.textContent’, element)
```

写在最后

快一年了,似乎已经停止更新了,orz

Author: damn1t

Link: http://microvorld.com/2019/06/21/python/Pyppeteer学习笔记/

Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.

< PreviousPost
selenium学习笔记
NextPost >
Bypass XSS filters using JavaScript global variables(笔记)
CATALOG
  1. 1. Pyppeteer学习笔记
    1. 1.1. 有的没的
    2. 1.2. 安装
    3. 1.3. 实际应用
      1. 1.3.1. 实例
    4. 1.4. 写在最后