首页 > 编程语言 > python+playwright 学习-64 非无痕模式启动浏览器launch_persistent_context

python+playwright 学习-64 非无痕模式启动浏览器launch_persistent_context

时间:2023-05-24 10:34:13浏览次数:49  
标签:playwright 浏览器 launch python chrome context browser

前言

最近有一些爬虫用户在使用 playwright 的时候,提到 playwright 默认是用无痕模式打开的浏览器,很多网站会有反爬机制,使用无痕模式打开的时候功能无法正常使用。
playwright 提供了 launch_persistent_context 启动浏览器的方法,可以非无痕模式启动浏览器。

  • 无痕模式启动浏览器适合做自动化测试的人员
  • 非无痕模式启动浏览器适合一些爬虫用户人员

无痕模式启动浏览器

launch 方法是无痕模式启动浏览器

from playwright.sync_api import sync_playwright


with sync_playwright() as p:
    browser = p.chromium.launch(headless=False)
    context = browser.new_context()
    page = context.new_page()
    page.goto("https://www.cnblogs.com/yoyoketang")

    # do ....
    context.close()
    browser.close()

非无痕模式 launch_persistent_context

如果网站被识别无痕模式不能使用,那么可以用 launch_persistent_context 非无痕模式启动浏览器
相关参数说明:

  • user_data_dir : 用户数据目录,此参数是必须的,可以自定义一个目录
  • accept_downloads: 接收下载事件
  • headless: 是否设置无头模式
  • channel: 指定浏览器类型,默认chromium
from playwright.sync_api import sync_playwright


p = sync_playwright().start()
browser = p.chromium.launch_persistent_context(
    # 指定本机用户缓存地址
    user_data_dir=f"D:\chrome_userx\yoyo",
    # 接收下载事件
    accept_downloads=True,
    # 设置 GUI 模式
    headless=False,
    bypass_csp=True,
    slow_mo=1000,
    channel="chrome"
)
page = browser.new_page()
page.goto("https://www.cnblogs.com/yoyoketang/")

# do ...
browser.close()

问题1:以上代码执行时,会发现多一个空白页?

因为使用 launch_persistent_context 方法会自动打开一个 tab 标签页,后面代码 browser.new_page() 重新打开了一个新的page 对象。

解决办法很简单,去掉browser.new_page() 代码即可。直接用默认打开发tab 标签页对象。

from playwright.sync_api import sync_playwright


p = sync_playwright().start()
browser = p.chromium.launch_persistent_context(
    # 指定本机用户缓存地址
    user_data_dir=f"D:\chrome_userx\yoyo",
    # 接收下载事件
    accept_downloads=True,
    # 设置 GUI 模式
    headless=False,
    bypass_csp=True,
    slow_mo=1000,
    channel="chrome"
)
page = browser.pages[0]
page.goto("https://www.cnblogs.com/yoyoketang/")

# do ...

browser.close()

问题2:launch_persistent_context 创建的浏览器对象,无法使用browser.new_context() 创建上下文?

因为 launch_persistent_context 字面上意思就已经是一个context 上下文对象了,所以无法创建上下文,只能创建page对象。

问题3:user_data_dir 路径参数是干什么的?

user_data_dir 是指定浏览器启动的用户数据缓存目录,当指定一个新的目录时,启动浏览器会发现自动生成缓存文件

打开D:\chrome_userx\yoyo 目录会看到加载的浏览器缓存文件。

问题4:user_data_dir 能不能记住用户登录的状态?

user_data_dir 就是你自己定义的打开浏览器保存的用户数据,包含了用户的cookies,所以你只要登录过,就会自动保存。
所以你只要代码打开网站,如果不能通过代码自动登录(可能有一些验证码什么的),你可以断点后手工去登录一次,也会记住cookies。下次代码再打开就不需要登录了。

问题5:为什么按你的教程,我这个网站就无法保持登录?

能不能保持登录状态,主要看你网站的cookies 有效期,有些网站关闭浏览器后就失效了,比如一些银行的网站,你只要关闭浏览器窗口,下次就需要再次登录。
简单来说一句话:你手工去操作一次,关闭浏览器,再打开还要不要登录,如果关闭浏览器需要再次登录,那代码也没法做到保持登录。
有些博客网站,你登录一次,cookies 几个月都有效,这种就可以利用缓存的cookies 保持登录。

问题6: 为什么网上其他教程 user_data_dir 写chrome 的安装目录?

其实没必要非要写 chrome 的安装目录"C:\Users\{getpass.getuser()}\AppData\Local\Google\Chrome\User Data"。
如果你写的是系统默认安装目录的用户数据,那你本地浏览器打开后,执行代码就会报错。所以不推荐!

问题7: 默认启动的是 chromium 浏览器,能不能换成其他的?

可以通过 "channel" 参数指定浏览器,可以支持 chromium 系列:chromium、chrome、chrome-beta、msedge

问题8: 如何设置窗口最大化?

添加args=['--start-maximized']no_viewport=True 两个参数设置窗口最大化

browser = p.chromium.launch_persistent_context(
    # 指定本机用户缓存地址
    user_data_dir=f"D:\chrome_userx\yoyo",
    # 接收下载事件
    accept_downloads=True,
    # 设置 GUI 模式
    headless=False,
    bypass_csp=True,
    slow_mo=1000,
    channel="chrome",
    args=['--start-maximized'],
    no_viewport=True
)

或者 使用viewport={'width': 1920, 'height': 1080} 设置屏幕分辨率

browser = p.chromium.launch_persistent_context(
    # 指定本机用户缓存地址
    user_data_dir=f"D:\chrome_userx\yoyo",
    # 接收下载事件
    accept_downloads=True,
    # 设置 GUI 模式
    headless=False,
    bypass_csp=True,
    slow_mo=1000,
    channel="chrome",
    viewport={'width': 1920, 'height': 1080}
)

问题9:如果我想同时打开多个浏览器,每个浏览器登录不同账号,多账号同时操作怎么办?

多账号同时执行,参考下一篇多线程https://www.cnblogs.com/yoyoketang/p/17426724.html

标签:playwright,浏览器,launch,python,chrome,context,browser
From: https://www.cnblogs.com/yoyoketang/p/17427192.html

相关文章

  • python+playwright 学习-62 日历控件操作
    前言遇到输入框是弹出日历控件,选一个日期的这种场景,可以直接在输入框输入内容。如果输入框是readonly的时候,可以用js改变输入框的属性日历控件如果输入框是日历控件先看能不能直接输入一个日期,如果能直接输入的情况,就不用点开了代码示例#上海悠悠wx:283340479#blog:ht......
  • python运行使用pywin32下载及安装问题
     1、python执行报错File"F:\XXX\XXX.py",line7,in<module> 运行python程序,提示错误如下:importwin32gui ModuleNotFoundError:Nomodulenamed'win32gui'该报错信息表示在F:\XXX\XXX.py中的第7行引入了win32gui,但是当前设备缺少pywin32的模块,需要安装安装方式一:直......
  • Centos7安装Python3.9
    1、 使用源码编译安装:您可以从Python官方网站下载Python3.9的源代码,并按照以下步骤进行编译和安装:安装编译所需的依赖项: sudoyuminstallgccopenssl-develbzip2-devellibffi-develzlib-develreadline-develsqlite-devel下载Python3.9的源代码包: wgethttp......
  • Python爬虫为什么需要库
    爬虫需要库是因为爬虫需要从网页中提取数据,并对数据进行处理和存储。库是一组已经封装好的工具,可以帮助爬虫快速地完成这些任务。这些库可以大大简化爬虫的开发过程,提高爬虫的效率和稳定性。Python爬虫常用的库有很多,以下是一些常用的库:1、requests:用于发送HTTP请求,获取网页内容。2......
  • Python如何自动生成文档,pdoc类库的使用
    pdoc是一个基于Python的自动文档生成工具,可以生成Python模块、类和函数的API文档。它可以将代码注释和文档字符串自动转换为HTML文档,使得开发者可以轻松地生成文档,并分享给其他人。本教程将介绍如何安装和使用pdoc生成PythonAPI文档。安装pdoc在安装pdoc之前,需要确保已经安装了Pyt......
  • python+playwright 学习-65多线程同时打开多个浏览器不同账号操作
    前言最近用小伙伴提到多线程同时操作多个浏览器,每个浏览器用不同账号登录的需求。多线程操作以下是2个账号同时打开2个浏览器操作的示例fromplaywright.sync_apiimportsync_playwrightfromthreadingimportThreaddefdo_some_thing(username,password):playwri......
  • python 清除字符串中的 emoji 表情
    https://pypi.org/project/emoji/pipinstallemoji复制字符串中间有emoji表情,替换掉。text="......
  • Python中对列表list去重
    保留原顺序。old_list=[2,3,4,5,1,2,3]new_list=[]foriinold_list:ifinotinnew_list:new_list.append(i)print(new_list)#[2,3,4,5,1]用字典dict去重使用list项作为键创建dict,这将自动删除任何重复项,因为dict不能有重复的键,保留原......
  • python内置库--shutil
    1简单介绍shutil提供了一系列函数来对文件或目录进行高级操作,如复制压缩移动删除等,功能和os模块功能的很类似,但shutil更加易用shutil没有提供对单个文件的删除操作,单个文件的复制移动解压缩是支持的2相关函数shutil.make_archive()shutil.make_archive(base_name,forma......
  • PlayWright(一)
    1、如何安装?安装playwright只需要一条命令,就是pip安装命令,命令如下:pipinstallplaywright注:playwright需要Python3.7或更新的版本 2、然后安装所需要的浏览器,和selenium不同,我们不再是安装对应的浏览器驱动,所以不需要再头疼浏览器驱动版本的问题了。安装命令如下playw......