Puppeteer-Pyppeteer

本文最后更新于:2020年9月27日 晚上

信息

Puppeteer是一个Node 库,它提供了一个高级 API 来通过 DevTools 协议控制 ChromiumChrome
有开发者开源了支持Python的Puppeteer库,名为Pyppeteer

文档

内容 链接
Puppeteer Github地址 https://github.com/puppeteer/puppeteer
Pyppeteer Github地址 https://github.com/miyakogi/pyppeteer
https://github.com/pyppeteer/pyppeteer
Pyppeteer 官方文档 https://miyakogi.github.io/pyppeteer/ref……
Pyppeteer 网友中文文档 https://blog.zhangkunzhi.com/2019/0…..

安装

Puppeteer只能运行在python3.6+环境中

Puppeteer API 是分层次的,反映了浏览器结构

注意:在下面的图表中,浅色框体内容目前不在 Puppeteer 中体现

Puppeteer 使用 DevTools 协议 与浏览器进行通信。
Browser 实例可以拥有浏览器上下文。
BrowserContext 实例定义了一个浏览会话并可拥有多个页面。
Page 至少有一个框架:主框架。 可能还有其他框架由 iframe 或 框架标签 创建。
frame 至少有一个执行上下文 - 默认的执行上下文 - 框架的 JavaScript 被执行。 一个框架可能有额外的与 扩展 关联的执行上下文。
Worker 具有单一执行上下文,并且便于与 WebWorkers 进行交互。

部分官方文档 中文文档 实践

0_Hello World

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
30
31
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@File : 0_hello_world.py
@Time : 2020/08/22 19:01:03
@Author : Recluse Xu
@Version : 1.0
@Contact : 444640050@qq.com
@Desc : pyppeteer Hello world 在第一次运行这个程序的时候,pyppeteer会从网上自己下载Chromium
官方文档:https://miyakogi.github.io/pyppeteer/reference.html#pyppeteer.page.Page.target
'''

# here put the import lib
import asyncio
from pyppeteer import launch


async def main():
# 创建浏览器对象
browser = await launch({'headless': False})
# 打开一个页面
page = await browser.newPage()
# 页面访问一个连接
await page.goto('http://www.baidu.com')
# 给网页弄个截图
await page.screenshot({'path': 'example/0_Basic_usage_of_the_library/pyppeteer/baidu.png'})
# 关闭浏览器
await browser.close()

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

1_Launch_args

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@File : 1_launch_args.py
@Time : 2020/08/22 19:31:40
@Author : Recluse Xu
@Version : 1.0
@Contact : 444640050@qq.com
@Desc : None
官方文档:https://miyakogi.github.io/pyppeteer/reference.html#pyppeteer.page.Page.target
'''

# here put the import lib
import asyncio
from pyppeteer import launch


async def main():
# 创建浏览器对象
browser = await launch({
# 无头模式
'headless': False,
# 忽略https错误,默认false
'ignorehttpserrrors': True,
# 界面大小
'viewport': {'width': 1280, 'height': 800},
# 脚本执行完后是否自动关闭浏览器
'autoClose': True,
# Chromium 或者 Chrome 的路径,如果填入的话,就不用默认的 Chromium
# 'executablePath': ''
# 用户数据目录的路径
# 'userDataDir': 'example/0_Basic_usage_of_the_library/pyppeteer/',
# 打印日志的日志级别。默认与根记录器
# 'log level': ''
})

page = await browser.newPage()
await page.goto('http://www.baidu.com')
await page.screenshot({'path': 'example/0_Basic_usage_of_the_library/pyppeteer/baidu.png'})
await browser.close()

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

2_BrowserClass

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@File : 2_BrowserClass.py
@Time : 2020-8-22 20:20:16
@Author : Recluse Xu
@Version : 1.0
@Contact : 444640050@qq.com
@Desc : 浏览器类相关
官方文档:https://miyakogi.github.io/pyppeteer/reference.html#pyppeteer.page.Page.target
'''

# here put the import lib
import asyncio
from pyppeteer import launch


async def main():
# 创建浏览器对象
browser = await launch({
'headless': False,
'ignorehttpserrrors': True,
'viewport': {'width': 1280, 'height': 800},
'autoClose': True,
})

# 创建一个新页面
page = await browser.newPage()

# 创建一个无痕模式浏览器内容, 以无痕模式内容浏览东西的话不会报错cookie之类的数据
# context = await browser.createIncognitoBrowserContext()
# page = await context.newPage()
# await page.goto('https://example.com')

await page.goto('http://www.baidu.com')

# 获取网页中的所有内容
c = browser.browserContexts
print(c)

# 返回浏览器进程
c = browser.process
print(c)

# 返回浏览器UerAgent
c = browser.userAgent
print(c)

# 断开连接
browser.disconnect()

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

3_BrowserContextClass

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@File : 3_BrowserContextClass.py
@Time : 2020-8-22 20:20:16
@Author : Recluse Xu
@Version : 1.0
@Contact : 444640050@qq.com
@Desc : 浏览器内容类相关 BrowserContext Class
官方文档:https://miyakogi.github.io/pyppeteer/reference.html#pyppeteer.page.Page.target
BrowserContext 类 提供了多个独立的浏览器会话
当浏览器启动,浏览器会创建一个默认的 BrowserContext实例,这个实例中包含了一个默认的page
如果一个 BrowserContext实例 通过window.open打开了新的BrowserContext实例,那么新实例会附属于旧实例
'''

# here put the import lib
import asyncio
from pyppeteer import launch


async def main():
browser = await launch({
'headless': False,
'ignorehttpserrrors': True,
'viewport': {'width': 1280, 'height': 800},
'autoClose': True,
})

page = await browser.newPage()
await page.goto('http://www.baidu.com')

context = browser.browserContexts[0]

# 返回BrowserContext实例的浏览器
c = context.browser
print(c)

# 返回BrowserContext中所有激活的target
c = context.targets()
print(c)

# 关闭BrowserContext实例,属于其下的子BrowserContext实例也会被一并关闭
context.close()


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

4_PageClass_Selector

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@File : 4_PageClass_Selector.py
@Time : 2020-8-22 20:20:16
@Author : Recluse Xu
@Version : 1.0
@Contact : 444640050@qq.com
@Desc : 页面类 Page Class
官方文档:https://miyakogi.github.io/pyppeteer/reference.html#pyppeteer.page.Page.target
Page类提供了与标签交互的方法,一个浏览器可以有多个Page对象

'''

# here put the import lib
import asyncio
from pyppeteer import launch


async def main():
browser = await launch({
'headless': False,
'ignorehttpserrrors': True,
'viewport': {'width': 1280, 'height': 800},
'autoClose': True,
})

page = await browser.newPage()
await page.goto('http://www.baidu.com')

# Page.J(selector: str) 或者 Page.uerySelector()
# 方法可以通过 选择器 获取一个元素
# 如果方法找到与选择器匹配的元素,则返回其ElementHandle实例。如果没有找到,返回None。
c = await page.J("#s_lg_img")
print(c)

# Page.JJ(selector: str) 或者 Page.querySelectorAll()
# 方法可以通过 选择器 获取一些元素
c = await page.JJ(".c-color-gray2")
print(c)

# Page.Jeval(selector: str, pageFunction: str, *args) 或者 Page.querySelectorEval()
# 方法可以通过 选择器 获取 一个元素 ,并且将元素作为参数,传入到pageFunction中执行一些代码
# 如果这个函数没有找到匹配的元素,会报错
# 参数:
# selector 选择器字符串
# pageFunction (str) javascript回调函数,在找到元素一些以后,元素会以数组的形式当做一个参数传入到定义的回调函数中
# args (Any) – 可以传给pageFunction的参数
c = await page.Jeval("#s_lg_img", "function zxc(a){return 'Found Element :' + a}")
print(c)

# Page.JJeval(selector: str, pageFunction: str, *args) 或者 Page.querySelectorAllEval()
# 方法可以通过 选择器 获取 一些元素 ,并且将元素作为参数,传入到pageFunction中执行一些代码
# 如果这个函数没有找到匹配的元素,会报错
# 参数同上
c = await page.JJeval(".c-color-gray2", "function zxc(a){return 'Found Element :' + a}")
print(c)

# Page.Jx(expression: str) 或者 xpath()
# 传入xpath表达式,返回结果为list
c = await page.xpath('//*[@id="s_lg_img"]')
print(c)


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

5_PageClass_Operations

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@File : 5_PageClass_Operations.py
@Time : 2020-8-22 23:03:54
@Author : Recluse Xu
@Version : 1.0
@Contact : 444640050@qq.com
@Desc : 页面类 Page Class
官方文档:https://miyakogi.github.io/pyppeteer/reference.html#pyppeteer.page.Page.target
Page类提供了与标签交互的方法,一个浏览器可以有多个Page对象

'''

# here put the import lib
import asyncio
from pyppeteer import launch


async def main():
browser = await launch({
'headless': False,
'ignorehttpserrrors': True,
'viewport': {'width': 1280, 'height': 800},
'autoClose': True,
})

page = await browser.newPage()
await page.goto('http://www.baidu.com')

# Page.url
# 返回页面url
c = page.url
print(c)

# Page.viewport
# 得到页面viewport信息
c = page.viewport
print(c)

# Page.title()
# 返回页面标题
c = await page.title()
print(c)

# Page.touchscreen
# 返回页面Touchscreen对象
c = page.touchscreen
print(c)

# Page.tracing
# 返回页面追踪对象
c = page.tracing
print(c)

# Page.mouse
# 得到页面的 Mouse 对象
c = page.mouse
print(c)

# isClosed() → bool[source]
# 页面是否已经关闭
c = page.isClosed()
print(c)

# keyboard
# 得到页面的 keyboard 对象
c = page.keyboard
print(c)

# mainFrame
# 得到页面的 Frame 对象
c = page.mainFrame
print(c)

# Page.content() → str
# 返回页面html
c = await page.content()
print(c)


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

6_PageClass_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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@File : 6_PageClass_JS.py
@Time : 2020-8-23 01:11:00
@Author : Recluse Xu
@Version : 1.0
@Contact : 444640050@qq.com
@Desc : 页面类 Page Class
官方文档:https://miyakogi.github.io/pyppeteer/reference.html#pyppeteer.page.Page.target
Page类提供了与标签交互的方法,一个浏览器可以有多个Page对象

'''

# here put the import lib
import asyncio
from pyppeteer import launch


async def main():
browser = await launch({
'headless': False,
'ignorehttpserrrors': True,
'viewport': {'width': 1280, 'height': 800},
'autoClose': True,
})

page = await browser.newPage()
await page.goto('http://www.baidu.com')

# Page.evaluate(pageFunction: str, *args, force_expr: bool = False) → Any
# 执行js代码,并返回结果
# 参数
# pageFunction (str) – js代码
# force_expr (bool) – If True, evaluate pageFunction as expression. If False (default), try to automatically detect function or expression.
c = await page.evaluate('function a(){return {"Hello":"Page.evaluate"};}')
print(c)

# Page.evaluateHandle(pageFunction: str, *args) → pyppeteer.execution_context.JSHandle
# 在页面上执行一个js代码,返回一个JSHandle对象
c = await page.evaluateHandle('document.getElementById("bottom_layer");')
print(c)


asyncio.get_event_loop().run_until_complete(main())
python
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@File : 7_PageClass_Cookie.py
@Time : 2020-8-23 01:33:25
@Author : Recluse Xu
@Version : 1.0
@Contact : 444640050@qq.com
@Desc : 页面类 Page Class
官方文档:https://miyakogi.github.io/pyppeteer/reference.html#pyppeteer.page.Page.target
Page类提供了与标签交互的方法,一个浏览器可以有多个Page对象

'''

# here put the import lib
import asyncio
from pyppeteer import launch


async def main():
browser = await launch({
'headless': False,
'ignorehttpserrrors': True,
'viewport': {'width': 1280, 'height': 800},
'autoClose': True,
})

page = await browser.newPage()
await page.goto('http://www.baidu.com')

# Page.cookies(*urls) → dict
# 获取Cookie
# 如果指定url那就返回那个url的Cookie,没指定就返回当前页面Cookie
c = await page.cookies()
print(c)

# Page.deleteCookie(*cookies)
# 删除Cookie
# cookies可以填入的参数
# name (str): 必须传入
# url (str)
# domain (str)
# path (str)
# secure (bool)
await page.deleteCookie({'name': 'BAIDUID'})

# Page.setCookie(*cookies) → None[source]
# 设置Cookie
# 可选Cookie的参数:
# name (str): required
# value (str): required
# url (str)
# domain (str)
# path (str)
# expires (number): Unix time in seconds
# httpOnly (bool)
# secure (bool)
# sameSite (str): 'Strict' or 'Lax'


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

8_PageClass_Wait

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@File : 8_PageClass_Wait.py
@Time : 2020-8-24 12:38:10
@Author : Recluse Xu
@Version : 1.0
@Contact : 444640050@qq.com
@Desc : 页面类 Page Class
官方文档:https://miyakogi.github.io/pyppeteer/reference.html#pyppeteer.page.Page.target
Page类提供了与标签交互的方法,一个浏览器可以有多个Page对象

'''

# here put the import lib
import asyncio
from pyppeteer import launch


async def main():
browser = await launch({
'headless': False,
'ignorehttpserrrors': True,
'viewport': {'width': 1280, 'height': 800},
'autoClose': True,
})

page = await browser.newPage()
await page.goto('http://www.baidu.com')

# Page.waitFor(selectorOrFunctionOrTimeout: Union[str, int, float], options: dict = None, *args, **kwargs) → Awaitable[T_co]
# 等待函数执行,超时,元素出现。
# 这个函数的作用会因为第一个参数传入不同的内容而不同
# 如果selectorOrFunctionOrTimeout是number (int或float),那么它将被视为超时(以毫秒为单位),并返回在超时后执行的future。
# 如果selectorOrFunctionOrTimeout是一个JavaScript函数字符串,那么这个方法是waitForFunction()的快捷方式。
# 如果selectorOrFunctionOrTimeout是选择器字符串或xpath字符串,则此方法是waitForSelector()或waitForXPath()的快捷方式。 如果字符串以//开头,则将该字符串视为xpath。
# Pyppeteer尝试自动检测功能或选择器,但有时会漏检。
# 如果不能按预期工作,请直接使用waitForFunction()或waitForSelector()。
# 参数:
# selectorOrFunctionOrTimeout – 选择器, xpath, 函数名 或者时间数字(毫秒).
# args (Any) – 传递给函数的参数
# 返回值:
# Return awaitable object which resolves to a JSHandle of the success value.


# Page.waitForFunction(pageFunction: str, options: dict = None, *args, **kwargs) → Awaitable[T_co]
# 等待,直到函数完成并返回一个值
# Parameters: args (Any) – 传递给 pageFunction 的参数.
# Returns: Return awaitable object which resolves when the pageFunction returns a truthy value. It resolves to a JSHandle of the truthy value.
# 可选参数:
# polling (str|number): pageFunction 执行间隔, 默认是 raf. 如果参数传入一个数字,那么它将被视为函数执行的毫秒间隔
# raf: 不断执行requestAnimationFrame回调中的pageFunction. This is the tightest polling mode which is suitable to observe styling changes.
# mutation: 在每次DOM更变的时候执行 pageFunction
# timeout (int|float): 最大等待时间 毫秒. 默认为 30000 (30 seconds). 传入0可以禁用此项.

# Page.waitForNavigation(options: dict = None, **kwargs) → Optional[pyppeteer.network_manager.Response]
# 等待 导航navigation
# 参数和goto()相同
# 当页面导航到新URL或重新加载时,这将返回Response
# 运行将间接导致页面导航的代码时,它很有用
navigationPromise = page.waitForNavigation()
await page.click('#bottom_layer > div.s-bottom-layer-left > p:nth-child(5) > a')
await navigationPromise # 等待,直到导航结束

# Page.waitForRequest(urlOrPredicate: Union[str, Callable[[pyppeteer.network_manager.Request], bool]], options: Dict[KT, VT] = None, **kwargs) → pyppeteer.network_manager.Request
# 等待Request
# 参数:
# urlOrPredicate – 等待的url
# 选项:
# timeout (int|float): 最大等待时间, 默认为 30 秒, 传入0禁用此项.
await page.waitForRequest('http://www.baidu.com')
await page.waitForRequest(lambda req: req.url == 'http://www.baidu.com' and req.method == 'GET')

# Page.waitForResponse(urlOrPredicate: Union[str, Callable[[pyppeteer.network_manager.Response], bool]], options: Dict[KT, VT] = None, **kwargs) → pyppeteer.network_manager.Response
# 等待Response
# 参数同Page.waitForRequest

# Page.waitForSelector(selector: str, options: dict = None, **kwargs) → Awaitable[T_co]
# 等待与选择器匹配的元素出现,要是页面已经有了匹配的元素,那么会立即返回
# Returns: Return awaitable object which resolves when element specified by selector string is added to DOM.
# 参数:
# selector (str) – 选择器
# 可选项:
# visible (bool):等待元素在DOM中出现,并且可见; i.e. to not have display: none or visibility: hidden CSS properties. Defaults to False.
# hidden (bool): 等待元素在DOM中出现,隐藏的都算, i.e. have display: none or visibility: hidden CSS properties. Defaults to False.
# timeout (int|float): 最大等待时间(毫秒).默认为30000 (30 秒). 传递0禁用此项.

# Page.waitForXPath(xpath: str, options: dict = None, **kwargs) → Awaitable[T_co]
# 等待与xpath匹配的元素出现,要是页面已经有了匹配的元素,那么会立即返回
# 参数同 Page.waitForSelector

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

9_PageClass_Other

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@File : 9_PageClass_Other.py
@Time : 2020-8-22 23:03:54
@Author : Recluse Xu
@Version : 1.0
@Contact : 444640050@qq.com
@Desc : 页面类 Page Class
官方文档:https://miyakogi.github.io/pyppeteer/reference.html#pyppeteer.page.Page.target
Page类提供了与标签交互的方法,一个浏览器可以有多个Page对象

'''

# here put the import lib
import asyncio
from pyppeteer import launch


async def main():
browser = await launch({
'headless': False,
'ignorehttpserrrors': True,
'viewport': {'width': 1280, 'height': 800},
'autoClose': True,
})

page = await browser.newPage()
await page.goto('http://www.baidu.com')

# Page.addScriptTag(options: Dict[KT, VT] = None, **kwargs) → pyppeteer.element_handle.ElementHandle
# 给页面添加一个script标签,可以写入一些东西
# url, path, content三个参数中必须选一个填入
# 会返回已经被添加好的 ElementHandle 实例
# 参数:
# url (string): URL of a script to add.
# path (string): Path to the local JavaScript file to add.
# content (string): JavaScript string to add.
# type (string): Script type. Use module in order to load a JavaScript ES6 module
await page.addScriptTag({
"content": "console.log('Hello addScriptTag')"
})

# Page.addStyleTag(options: Dict[KT, VT] = None, **kwargs) → pyppeteer.element_handle.ElementHandle
# 给页面添加一个style标签,可以写入一些东西
# url, path, content三个参数中必须选一个填入
# 参数:
# url (string): URL of the link tag to add.
# path (string): Path to the local CSS file to add.
# content (string): CSS string to add.
await page.addScriptTag({
"url": "https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/5.0.0-alpha1/css/bootstrap.css"
})

# Page.bringToFront 将页面置于最前(激活选项卡)
await page.bringToFront()

# Page.click(selector: str, options: dict = None, **kwargs)
# 此方法使用选择器获取元素,如果需要,将其滚动到视图中,然后使用鼠标在元素的中心单击
# 如果没有元素匹配选择器,该方法将引发PageError
# 参数
# button (str): left, right, or middle, defaults to left.
# clickCount (int): defaults to 1.
# delay (int|float): Time to wait between mousedown and mouseup in milliseconds. defaults to 0.
await page.click('#su')


# Page.setUserAgent(userAgent: str)
# 设置UserAgent
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36')

# Page.setViewport(viewport: dict)
# 设置Viewport
# 可填入选项:
# width (int): page width in pixel.
# height (int): page height in pixel.
# deviceScaleFactor (float): Default to 1.0.
# isMobile (bool): Default to False.
# hasTouch (bool): Default to False.
# isLandscape (bool): Default to False.
await page.setViewport({
'width': 1024,
'height': 1024,
})

# Page.emulateMedia(mediaType: str = None)
# 设置CSS media type
# 你可以填入 'screen', 'print', None 中的一个
await page.emulateMedia('screen')


# Page.exposeFunction(name: str, pyppeteerFunction: Callable[[…], Any])
# 将一个Python函数绑定到浏览器window对象中,可以在使用过程中调用
# 参数:
# name (string) – Name of the function on the window object.
# pyppeteerFunction (Callable) – Function which will be called on python process. This function should not be asynchronous function.

# Page.focus(selector: str)
# 为选择器匹配的元素设置焦点
# 若没有元素被匹配,则报错
await page.focus('#kw')


# Page.goBack(options: dict = None, **kwargs) → Optional[pyppeteer.network_manager.Response]
# 页面回退,基于Page访问记录,如果不能回退,则会返回None
# 参数与goto()一致
await page.goBack()

# goForward(options: dict = None, **kwargs) → Optional[pyppeteer.network_manager.Response]
# 页面前进,基于Page访问记录,如果不能回退,则会返回None
# 参数与goto()一致
await page.goForward()


# goto(url: str, options: dict = None, **kwargs) → Optional[pyppeteer.network_manager.Response]
# 页面访问url
# 参数:
# timeout (int): 最大请求时间,默认为 30 秒, 传入0可以禁用此项. 此默认值可以通过 setDefaultNavigationTimeout()方法 来设置.
# waitUntil (str|List[str]): 什么时候认为请求已经成功了, 默认是load项. 可选项目:
# load: 当 load 事件被触发
# domcontentloaded: 当 DOMContentLoaded 事件被触发
# networkidle0: 500ms内没有正在连接的网络请求
# networkidle2: 500ms内正在连接的网络请求不超过两个
# 可能引发的错误
# url无效
# 请求超时
# 资源读取失败
await page.goto('https://www.baidu.com/')

# hover(selector: str)
# 鼠标悬停在选择器匹配的元素上
# 若没有元素被匹配,则报错
await page.hover('#su')



# metrics() → Dict[str, Any]
# 返回页面 metrics 信息
# 信息批注
# Timestamp (number): The timestamp when the metrics sample was taken.
# Documents (int): Number of documents in the page.
# Frames (int): Number of frames in the page.
# JSEventListeners (int): Number of events in the page.
# Nodes (int): Number of DOM nodes in the page.
# LayoutCount (int): Total number of full partial page layout.
# RecalcStyleCount (int): Total number of page style recalculations.
# LayoutDuration (int): Combined duration of page duration.
# RecalcStyleDuration (int): Combined duration of all page style recalculations.
# ScriptDuration (int): Combined duration of JavaScript execution.
# TaskDuration (int): Combined duration of all tasks performed by the browser.
# JSHeapUsedSize (float): Used JavaScript heap size.
# JSHeapTotalSize (float): Total JavaScript heap size.
c = await page.metrics()
print(c)

# Page.reload(options: dict = None, **kwargs) → Optional[pyppeteer.network_manager.Response]
# 刷新这个页面
# 参数与goto()一致
await page.reload()

# Page.screenshot(options: dict = None, **kwargs) → Union[bytes, str]
# 给网页弄一张截图
# 参数:
# path (str): The file path to save the image to. The screenshot type will be inferred from the file extension.
# type (str): Specify screenshot type, can be either jpeg or png. Defaults to png.
# quality (int): The quality of the image, between 0-100. Not applicable to png image.
# fullPage (bool): When true, take a screenshot of the full scrollable page. Defaults to False.
# clip (dict): An object which specifies clipping region of the page. This option should have the following fields:
# x (int): x-coordinate of top-left corner of clip area.
# y (int): y-coordinate of top-left corner of clip area.
# width (int): width of clipping area.
# height (int): height of clipping area.
# omitBackground (bool): Hide default white background and allow capturing screenshot with transparency.
# encoding (str): The encoding of the image, can be either 'base64' or 'binary'. Defaults to 'binary'.
await page.screenshot({'path': 'example/0_Basic_usage_of_the_library/pyppeteer/baidu.png'})

# Page.select(selector: str, *values) → List[str]
# 选择 options 并返回被选的值
# 若没有元素被匹配,则报错

# Page.setBypassCSP(enabled: bool) → None
# 设置Content-Security-Policy

# Page.setCacheEnabled(enabled: bool = True) → None
# 是否启用Cache

# Page.setContent(html: str) → None
# 设置网页HTML内容

# Page.setJavaScriptEnabled(enabled: bool)
# 设置js是否启用

# Page.setOfflineMode(enabled: bool)
# 设置是否启用离线模式


# Page.setRequestInterception(value: bool)
# 启用/禁用请求拦截。
# 激活请求拦截可以启用请求类的abort(),continue_()和response()方法。 这提供了修改页面发出的网络请求的功能。

# Page.tap(selector: str)
# Tap选择器匹配的元素
# 若没有元素被匹配,则报错

# Page.xpath(expression: str) → List[pyppeteer.element_handle.ElementHandle][source]
# 返回匹配xpath的元素 list
# 要是没有匹配项则返回空的list


# Page.type(selector: str, text: str, options: dict = None, **kwargs)
# 在指定元素中输入内容
# 若没有元素被匹配,则报错




# Page.close()
# 关闭page
await page.close()


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


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!