playwright介绍

  • playwright是由微软开发的新一代web自动测试工具,相比selenium它的特点:

    • 不需要安装webdriver
    • 不需要手动设置等待
    • playwright支持异步
    • selenium底层是http(单向通信),而playwright则基于websocket(双向通信)
    • 重点:自带录制功能,根据录制过程中的操作,自带生成代码
      • playwright codegen www.xxx.com
      • playwright codegen -o script.py
  • playwright环境搭建:
    • 版本需求:Python >= 3.7
    • 安装所需的模块:pip install playwright
    • 安装自带浏览器和ffmpeg:playwright install
      • 自带浏览器包括:

        • chromium
        • firefox
        • webKit
  • 官方文档:https://playwright.bootcss.com/docs/why-playwright

playwright基本使用

  • 导入模块:

    • from playwright.sync_api import sync_playwright
  • 显示浏览器:
    • browser = 浏览器.launch(headless=False)

      • 启用不同的有头浏览器

        • 浏览器:chromium、firefox、webKit
  • 浏览器页面:
    • page = browser.new_page()

      • new_page():创建一个page页面
    • context = browser.new_context()
      • new_context():设置可启用多个page页面
      • page_num = context.new_page()
        • new_page():创建一个新的page页面
  • 设置加载超时延迟:
    • page.wait_for_timeout(5000)
  • 返回渲染后的源码:
    • page.content()
  • 入门案例:
from playwright.sync_api import sync_playwrightwith sync_playwright() as pw:# 设为有头浏览器browser = pw.chromium.launch(headless=False)# 创建一个page页面page = browser.new_page()# 访问百度page.goto('https://www.baidu.com')# 输出百度的标题print(page.title())page.wait_for_timeout(3000)browser.close()

playwright选择元素

  • 常用的元素选择器:

    • 节点选择器:

      • page.query_selector_all('xxx')

        • 获取页面所有xxx节点
      • page.query_selector('xxx')
        • 获取页面xxx节点,多个时返回第一个
    • 文本选择器:
      • page.locator("text=文本内容")

        • 文本内容支持正则
    • css选择器:
      • page.locator("标签名称")

        • 存在多个时默认选择第一个

          • 可直接使用标签的名称:button
          • 可通过id、class选择器:#x .y
          • 还有特定节点属性:"[xxx=yyy]"
    • xpath选择器:
      • page.locator("xpath=xxx")
    • 下标选择器:
      • page.locator("button >> nth=x")

        • 选取第x个button标签
  • 案例:
from playwright.sync_api import sync_playwrightwith sync_playwright() as pw:browser = pw.chromium.launch(headless=False)page = browser.new_page()page.goto('https://www.lagou.com/jobs/list_爬虫')# 获取存放所有lijobs_data_list = page.query_selector_all('//*[@id="s_position_list"]/ul/li')# 遍历得到每个li中的内容for jobs_data in jobs_data_list:job_title = jobs_data.query_selector('xpath=./div[1]/div[1]/div[1]/a/h3').text_content()print(job_title)browser.close()
  • 选择元素后常用的操作:

    • .text_content()

      • 返回元素的文本内容
    • .fill('内容')
      • 输入文本,一次性输完
    • .type('内容')
      • 输入文本,单个字符输入
    • .get_attribute('属性名')
      • 返回标签的属性值
    • .press('Shift+A')
      • 对元素按下快捷键
    • .wait_for()
      • 等待元素加载完毕
    • .鼠标单次事件()
      • 直接对选择的元素进行鼠标操作
  • 案例:
from playwright.sync_api import sync_playwrightwith sync_playwright() as pw:browser = pw.chromium.launch(headless=False)page = browser.new_page()page.goto('https://www.baidu.com')"""像这类的方法都有两种使用方法:1. page.locator('xpath=xxx').fill('test')2. page.fill('xpath=xxx', 'test')两种方法作用相同,选择适合自己的就好"""browser.close()

playwright鼠标操作

  • 鼠标单次事件:

    • 单击鼠标左键

      • page.click('元素位置')
    • 双击鼠标左键
      • page.dblclick('元素位置')
    • 鼠标悬停:
      • page.hover('元素位置')
    • 单击鼠标右键
      • page.click('元素位置', button='right')
    • shift + 单击鼠标:
      • page.click('元素位置', modifiers=['Shift'])
    • 鼠标点击元素的指定位置:
      • page.click('元素位置', position={'x': 0, 'y': 0})
  • 鼠标保持事件:
    • 按下鼠标不放

      • page.mouse.down()
    • 移动鼠标到指定位置:
      • page.mouse.move(x轴, y轴, steps=10)

        • steps:可选,设置单次移动的比例,值越大越慢
    • 松开鼠标:
      • page.mouse.up()
  • 案例:
from playwright.sync_api import sync_playwrightwith sync_playwright() as pw:browser = pw.chromium.launch(headless=False)page = browser.new_page()page.goto('https://www.baidu.com')"""这类也是是有两种使用方法:1. page.locator('xpath=xxx').click()2. page.click('xpath=xxx')两种方法作用相同,选择适合自己的就好"""browser.close()

playwright异步并发

import asyncio
from playwright.async_api import async_playwrightasync def main():async with async_playwright() as pw:browser = await pw.chromium.launch()page = await browser.new_page()await page.goto('https://www.baidu.com')print(await page.title())await browser.close()asyncio.run(main())

playwright其他操作

同时启用多个页面:

from playwright.sync_api import sync_playwrightwith sync_playwright() as p:browser_type = p.chromiumbrowser = browser_type.launch(headless=False)context = browser.new_context()page1 = context.new_page()page1.goto('https://mail.163.com/')page2 = context.new_page()page2.goto("https://www.baidu.com/")context.close()browser.close()

截取浏览器页面:

from playwright.sync_api import sync_playwrightwith sync_playwright() as pw:browser = pw.webkit.launch()page = browser.new_page()page.goto('https://www.baidu.com')# 截取当前页面的截图page.screenshot(path="baidu.png")# 整页截图,从上滚到最低page.screenshot(path="screenshot.png", full_page=True)# 截取某个元素的截屏page.locator('元素位置').screenshot(path="test.png")browser.close()

进入生成的frame标签:

from playwright.sync_api import sync_playwrightwith sync_playwright() as pw:browser = pw.chromium.launch(headless=False)page = browser.new_page()page.goto('https://www.baidu.com')"""进入frame标签,有四种方式:1. 通过url定位frame:page.frame(url='www.title.com')2. 通过name定位frame:page.frame('title')3. 通过特定元素定位frame:page.query_selector('.title').content_frame()4. 通过page.frames查看全部的frame标签,然后使用:page.frames[元素下标]"""frame = page.query_selector('.title').content_frame()browser.close()

打开页面时不加载图片(网络劫持):

from playwright.sync_api import sync_playwright
import rewith sync_playwright() as pw:browser = pw.chromium.launch(headless=False)page = browser.new_page()# 执行拦截操作def cancel_request(route, request):route.abort()# 拦截以'.png'、'.jpg'结尾的请求page.route(re.compile(r"(\.png)|(\.jpg)"), cancel_request)page.goto("https://movie.douban.com/")page.wait_for_load_state('networkidle')# 保存截图查看效果page.screenshot(path='move_douban.png')browser.close()

事件监听,可以拦截获取Ajax加载的数据:

from playwright.sync_api import sync_playwrightdef on_response(response):if '/api/movie/' in response.url and response.status == 200:print(response.json())with sync_playwright() as pw:browser = pw.chromium.launch(headless=False)page = browser.new_page()page.on('response', on_response)page.goto('https://spa6.scrape.center/')page.wait_for_load_state('networkidle')browser.close()

防止playwright被检测为webdriver:

from playwright.sync_api import sync_playwrightwith sync_playwright() as pw:browser = pw.webkit.launch(headless=False)page = browser.new_page()page.add_init_script("""Object.defineProperties(navigator, {webdriver:{get:()=>undefined}});""")page.goto('https://www.baidu.com')page.wait_for_timeout(100000)browser.close()

模拟移动设备打开浏览器:

with sync_playwright() as pw:# 设置手机型号mobile_type = pw.devices['iPhone 12']browser = pw.webkit.launch(headless=False)context = browser.new_context(**mobile_type,# 设置地区语言locale='zh-CN',# 设置位置经纬度geolocation={'longitude': 115.725177, 'latitude': 34.404329},permissions=['geolocation'])page = context.new_page()page.goto('https://amap.com')page.wait_for_load_state(state='networkidle')page.screenshot(path='mobile_web.png')browser.close()

获取元素相对于浏览器的坐标:

from playwright.sync_api import sync_playwrightwith sync_playwright() as pw:browser = pw.chromium.launch(headless=False)page = browser.new_page()page.goto('https://www.baidu.com')# 获取滑块位置s = save_img_frame.locator('xpath=xxx')"""xxx.bounding_box()获取元素相对于浏览器的坐标和元素自身的大小,返回一个字典:{'x': 837.5375366210938, 'y': 190.31250762939453, 'width': 56, 'height': 56}"""box = s.bounding_box()# 获取元素的中心点:x = int(box["x"] + box["width"] / 2)y = int(box["y"] + box["height"] / 2)browser.close()

Playwright-新一代自动化工具 > 酱紫写爬虫?相关推荐

  1. 微软“最强自动化工具”playwright实战项目

    微软"最强自动化工具"playwright实战项目 近期微软推出了一款号称"最强"的自动化测试工具,网上便出现了大批讲解文章,一看全是github上的reade ...

  2. python3淘宝商品目录_Python3中级玩家:淘宝天猫商品搜索爬虫自动化工具(第一篇)...

    一.前言 大家好,今天我要来讲讲一个比较实用的爬虫工具,抓取淘宝的关键字商品信息,即是: 输入关键字,按照价格等排序,抓取列出的商品信息以及下载图片,并且支持导出为Excel. 如果如下: 看完下面的 ...

  3. Python3中级玩家:淘宝天猫商品搜索爬虫自动化工具(第三篇)

    查看Github 欢迎回看第一篇和第二篇. Python3中级玩家:Python3中级玩家:淘宝天猫商品搜索爬虫自动化工具(第一篇 Python3中级玩家:Python3中级玩家:淘宝天猫商品搜索爬虫 ...

  4. 当你写爬虫抓不到APP请求包的时候该怎么办?【高级篇-混淆导致通用Hook工具失效】...

    提示:因为高级篇以后的APP将无法使用很通用的方式处理,每种类型甚至是每个APP的反抓包处理方式都会有差别,所以这个系列以后会以[高级篇-具体类型]的形式来写. 这篇文章的主要内容是解决在遇到APP没 ...

  5. 微软开源的浏览器自动化工具-Playwright

    软开源了一个 Python 项目:Playwright,从此又多了一个浏览器自动化工具.之前一直用 selenium 或 splinter. Playwright 可通过单个 API 自动执行 Chr ...

  6. 基于python Flak谷歌自动化工具的爬虫(爬取疫情数据)

    开发环境简介: Python 3.7.3. Flask (pip install flask),BeautifulSoup(pip install BeautifulSoup)等. 谷歌自动化工具–& ...

  7. 红队信息收集自动化工具-水泽(ShuiZe)

    红队信息收集自动化工具-水泽(ShuiZe) 文章目录 红队信息收集自动化工具-水泽(ShuiZe) 0x01 介绍 0x02 安装 0x03 效果展示 0x04 POC编写 0x05 使用方法 0x ...

  8. 前端自动化工具 grunt 插件 uglify 的简单使用(一)

    Grunt 的简介: Grunt 是一套前端自动化工具,是一个基于 node.js 的命令行工具,它一般用于: 1.压缩文件: 2.合并文件: 3.简单的语法检测: 4.监听文件变动: 5.less ...

  9. 在 CentOS 7 中安装并使用自动化工具 Ansible

    Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具.它用Python写成,类似于Chef和Puppet,但是有一个不同和优点是我们不需要在节点中安装任何客户端.它使用SSH来和节点进 ...

  10. python 网页自动处理_推荐一款 10 行 Python 代码实现网页自动化工具

    各种各样的网站在我们日常工作和学习中占据着举足轻重的地位,学习.影音娱乐.查询资料.协同办公,越来越多的任务都被迁移到浏览器 因此,网页也蕴含着很多有价值.我们能够用得到的资源 例如,数据.歌曲.影视 ...

最新文章

  1. Java Bean Validation 最佳实践
  2. 三、界面介绍(IVX快速手册)
  3. cve20190708补丁的kb名称_微软KB4495667补丁(CVE 2019-0708补丁)V1.1 官方版
  4. 插个队 leetcode 142. 环形链表 II
  5. html设置回到顶部按钮,给网站添加回到顶部按钮
  6. 股票量化交易有哪些潜在的风险?如何去避免?
  7. oracle市场份额情况怎样,Oracle 2013年数据库市场份额47.4 - 再居第一
  8. 虚拟化性能计数器需要至少一个可正常使用的计数器。 模块“VPMC”启动失败。 未能启动虚拟机。
  9. (三)JVM成神路之全面详解执行引擎子系统与JIT即时编译原理
  10. 图片拼图微信小程序源码_支持多模板制作和流量主
  11. 微型计算机硬件系统中PROM是,1微型计算机硬件系统中最核心的部件是CPU.doc
  12. Python开HTTP服务器
  13. 19、会员中心 - 小程序端开发 - 微擎小程序模块应用开发
  14. 武汉二手房价分析(原创分析,数据现势性2018年6月)
  15. 外部数据导入qiime2软件内部
  16. [量子客]3月全球量子计算发展内参
  17. 世界著名电脑病毒排行榜
  18. 1,document.getelementbyid().value与document.getElementById().innerHTML区别
  19. Pyqt+Mimics优化计算机辅助设计工作流
  20. 用nginx完成一个网页制作

热门文章

  1. 微信小程序之授权登录的实现(button按钮)
  2. 摄影之构图,了解画面构成的五大元素:主体、陪体、前景、背景、留白
  3. 小程序源码:全新超火的微信小说小程序源码-自带采集带安装教程-多玩法安装简单
  4. Arcgis根据矢量道路数据来提取道路中心线
  5. SQL Server Always Encrypted
  6. 常山浙西计算机学校,常山这所最早的学校你上过吗?历经三个世纪,他依然在最初的地方等你……...
  7. 迅捷pdf转换器完美解决如何将pdf转换成word问题
  8. win server 2008r2 相关设置
  9. 摩尔庄园怎么显示全部服务器,摩尔庄园手游服务器查看区别方法
  10. Android Jetpack架构篇:Room