使用Python库playwright前,需要先在命令行中用命令playwright install来安装浏览器
默认会很慢。
在windows 命令行中先执行
1
set HTTPS_PROXY = http://127.0.0.1:1091
然后再在其中执行
之前有写过一篇selenium打开指定浏览器进行自动化操作的文章(链接见后文),但那篇需要自己通过bat文件去启动浏览器。而且还要下载对应的驱动。
playwright就不需要下载驱动,它自己有,你浏览器版本可以不用管了,而且这个时候,你可以通过launch_persistent_context方法直接在代码中添加已有缓存的谷歌浏览器,并且指定端口打开,你以后全部由代码来跑就可以了。
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
# -*- coding: utf-8 -*-
'''
@Time : 2023/4/28 12:29
@Author : Vincent.xiaozai
@Email : Lvan826199@163.com
@File : playwright_demo1.py
'''
__author__ = "梦无矶小仔"
import time
from playwright.sync_api import Playwright , sync_playwright
# C:\Users\xiaozai\AppData\Local\ms-playwright
with sync_playwright () as playwright :
browser = playwright . chromium . launch_persistent_context (
# 指定本机用户缓存地址
user_data_dir = r "C:\Users\xiaozai\AppData\Local\Google\Chrome\User Data" ,
# 指定本机google客户端exe的路径
executable_path = r "C:\Users\xiaozai\AppData\Local\Google\Chrome\Application\chrome.exe" ,
# 要想通过这个下载文件这个必然要开 默认是False
accept_downloads = True ,
# 设置不是无头模式
headless = False ,
bypass_csp = True ,
slow_mo = 10 ,
# 跳过检测
args = [ '--disable-blink-features=AutomationControlled' , '--remote-debugging-port=9222' ]
)
page = browser . new_page ()
page . goto ( "https://www.baidu.com/" )
print ( page . title ())
time . sleep ( 200 )
browser . close ()
user_data_dir:此文件夹就是你电脑本地所在的缓存文件夹,可以是系统默认的,也可以是你自己新建的
args处可以填的参数介绍如下
List of Chromium Command Line Switches « Peter Beverloo
中文版:Chrome浏览器启动参数大全(命令行参数) - 故人与猫 -
args处常用参数请参考下表。
序号
参数
说明
1
–allow-outdated-plugins
不停用过期的插件。
2
–allow-running-insecure-content
默认情况下,https 页面不允许从 http 链接引用 javascript/css/plug-ins。添加这一参数会放行这些内容。
3
–allow-scripting-gallery
允许拓展脚本在官方应用中心生效。默认情况下,出于安全因素考虑这些脚本都会被阻止。
4
–disable-desktop-notifications
禁用桌面通知,在 Windows 中桌面通知默认是启用的。
5
–disable-file-system
停用 FileSystem API。
6
–disable-preconnect
停用 TCP/IP 预连接。
7
–disable-remote-fonts
关闭远程字体支持。SVG 中字体不受此参数影响。
8
–disable-web-security
不遵守同源策略。
9
–disk-cache-dir
将缓存设置在给定的路径。
10
–disk-cache-size
设置缓存大小上限,以字节为单位。
11
–dns-prefetch-disable
停用DNS预读。
12
–enable-print-preview
启用打印预览。
13
–extensions-update-frequency
设定拓展自动更新频率,以秒为单位。
14
–incognito
让浏览器直接以隐身模式启动。
15
–keep-alive-for-test
最后一个标签关闭后仍保持浏览器进程。(某种意义上可以提高热启动速度,不过你最好得有充足的内存)
16
–kiosk
启用kiosk模式。(一种类似于全屏的浏览模式)
17
–lang
使用指定的语言。
18
–no-displaying-insecure-content
默认情况下,https 页面允许从 http 链接引用图片/字体/框架。添加这一参数会阻止这些内容。
19
–no-referrers
不发送 Http-Referer 头。
20
–no-startup-window
启动时不建立窗口。
21
–proxy-server
使用给定的代理服务器,这个参数只对 http 和 https 有效。
22
–start-maximized
启动时最大化。
23
–single-process
以单进程模式运行 Chromium。(启动时浏览器会给出不安全警告)。
24
–user-agent
使用给定的 User-Agent 字符串。
25
–process-per-tab
每个分页使用单独进程。
26
–process-per-site
每个站点使用单独进程。
27
–in-process-plugins
插件不启用单独进程。
28
–disable-popup-blocking
禁用弹出拦截。
29
–disable-javascript
禁用JavaScript。
30
–disable-java
禁用Java。
31
–disable-plugins
禁用插件。
32
–disable-images
禁用图像。
33
–remote-debugging-port
在指定端口上启用HTTP远程调试
launch\_persistent\_context可填参数可以查看源码,playwright -> sync_api -> _generated.py
请添加图片描述
运行效果展示(莫名其妙,一张百度的首页图片都说我违规,大家自己运行下代码就能看到效果):
看到右上角了吗?是登陆状态的,说明加载了我的用户信息,你可以打开一个新的标签页,你还会发现里面有你的标签。
就字面意思,emmmm,貌似目前我还没有遇到需要用这个的场景。还是用前面那个方法结合着用好。
1
2
3
4
5
6
7
8
9
10
from playwright.sync_api import sync_playwright
playwright = sync_playwright () . start ()
# 指定端口打开浏览器
browser = playwright . chromium . launch ( headless = False , args = [ '--remote-debugging-port=9001' ])
time . sleep ( 10 )
page = browser . new_page ()
page . goto ( "https://www.baidu.com/" )
print ( page . title ())
time . sleep ( 10 )
browser . close ()
这个方案就是不使用launch_persistent_context方法,需要自己手动启动一个浏览器(或者使用命令),之后让playwright连接上这个浏览器进行自动化操作。
前置操作
需要通过命令启动一个特定的浏览器,这里我做了一个bat文件,详细方法参考之前的公众号文章: Python+selenium定位已打开的谷歌浏览器
1
2
@ echo off
chrome.exe --remote-debugging-port=9222 --user-data-dir="C:\selenium\AutomationProfile"
我们先通过该命令快捷启动浏览器,之后就可以通过代码连接上该浏览器了。
1
2
3
4
5
6
7
8
9
10
11
12
# 可以使用bat手动打开该浏览器,也可以通过如下命令打开
command = r "C:\Users\xiaozai\AppData\Local\Google\Chrome\Application\chrome.exe --remote-debugging-port=9222 --user-data-dir=C:\selenium\AutomationProfile"
subprocess . Popen ( command )
time . sleep ( 5 )
playwright = sync_playwright () . start ()
# 连接已打开浏览器,找好端口
browser = playwright . chromium . connect_over_cdp ( "http://127.0.0.1:9222" )
default_context = browser . contexts [ 0 ] # 注意这里不是browser.new_page()了
page = default_context . pages [ 0 ]
page . goto ( "https://www.baidu.com/" )
print ( page . title ()) #百度一下,你就知道
Go中使用"github.com/playwright-community/playwright-go"前,需要先在命令行中用命令go run github.com/playwright-community/playwright-go/cmd/playwright install --with-deps来安装浏览器。
默认会很慢。
在windows 命令行中先执行
1
2
set HTTP_PROXY = http://127.0.0.1:1091
set HTTPS_PROXY = http://127.0.0.1:1091
Launch 方法启动一个新的浏览器实例,该实例不会持久化用户数据(如 cookies、浏览历史、本地存储等)。
在每次运行脚本时,都会产生一个全新的浏览器实例,与之前的会话完全隔离。
这种方法通常用于需要 “干净” 的浏览环境的自动化测试场景。
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
package main
import (
"fmt"
"log"
"github.com/playwright-community/playwright-go"
)
func main () {
pw , err := playwright . Run ()
if err != nil {
log . Fatalf ( "could not start Playwright: %v" , err )
}
defer pw . Stop ()
// 指定已安装浏览器的路径
executablePath := "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe"
browser , err := pw . Chromium . Launch ( playwright . BrowserTypeLaunchOptions {
ExecutablePath : & executablePath ,
Headless : playwright . Bool ( true ),
})
if err != nil {
log . Fatalf ( "could not launch browser: %v" , err )
}
defer browser . Close ()
page , err := browser . NewPage ()
if err != nil {
log . Fatalf ( "could not create page: %v" , err )
}
if _ , err := page . Goto ( "https://www.baidu.com" ); err != nil {
log . Fatalf ( "could not goto: %v" , err )
}
title , err := page . Title ()
if err != nil {
log . Fatalf ( "could not get title: %v" , err )
}
fmt . Println ( "Page Title:" , title )
}
LaunchPersistentContext 方法启动一个新的浏览器实例,该实例使用指定的 userDataDir 作为用户数据目录。
它允许持久化用户数据,所以在连续的运行中,浏览器会保留之前的状态(如登录信息、cookies、本地存储等)。
这种方法适用于需要保持浏览器状态或者模拟长期用户行为的场景。
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
package main
import (
"log"
"github.com/playwright-community/playwright-go"
)
func main () {
pw , err := playwright . Run ()
if err != nil {
log . Fatalf ( "could not start Playwright: %v" , err )
}
executablePath := "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe"
browser , err := pw . Chromium . LaunchPersistentContext ( "path/to/userDataDir" , playwright . BrowserTypeLaunchPersistentContextOptions {
ExecutablePath : & executablePath ,
Headless : playwright . Bool ( true ),
})
if err != nil {
log . Fatalf ( "could not launch browser: %v" , err )
}
defer browser . Close ()
page , err := browser . NewPage ()
if err != nil {
log . Fatalf ( "could not create page: %v" , err )
}
if _ , err := page . Goto ( "https://www.baidu.com" ); err != nil {
log . Fatalf ( "could not goto: %v" , err )
}
title , err := page . Title ()
if err != nil {
log . Fatalf ( "could not get title: %v" , err )
}
fmt . Println ( "Page Title:" , title )
}