Playwright-新一代自动化工具 > 酱紫写爬虫?
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-新一代自动化工具 > 酱紫写爬虫?相关推荐
- 微软“最强自动化工具”playwright实战项目
微软"最强自动化工具"playwright实战项目 近期微软推出了一款号称"最强"的自动化测试工具,网上便出现了大批讲解文章,一看全是github上的reade ...
- python3淘宝商品目录_Python3中级玩家:淘宝天猫商品搜索爬虫自动化工具(第一篇)...
一.前言 大家好,今天我要来讲讲一个比较实用的爬虫工具,抓取淘宝的关键字商品信息,即是: 输入关键字,按照价格等排序,抓取列出的商品信息以及下载图片,并且支持导出为Excel. 如果如下: 看完下面的 ...
- Python3中级玩家:淘宝天猫商品搜索爬虫自动化工具(第三篇)
查看Github 欢迎回看第一篇和第二篇. Python3中级玩家:Python3中级玩家:淘宝天猫商品搜索爬虫自动化工具(第一篇 Python3中级玩家:Python3中级玩家:淘宝天猫商品搜索爬虫 ...
- 当你写爬虫抓不到APP请求包的时候该怎么办?【高级篇-混淆导致通用Hook工具失效】...
提示:因为高级篇以后的APP将无法使用很通用的方式处理,每种类型甚至是每个APP的反抓包处理方式都会有差别,所以这个系列以后会以[高级篇-具体类型]的形式来写. 这篇文章的主要内容是解决在遇到APP没 ...
- 微软开源的浏览器自动化工具-Playwright
软开源了一个 Python 项目:Playwright,从此又多了一个浏览器自动化工具.之前一直用 selenium 或 splinter. Playwright 可通过单个 API 自动执行 Chr ...
- 基于python Flak谷歌自动化工具的爬虫(爬取疫情数据)
开发环境简介: Python 3.7.3. Flask (pip install flask),BeautifulSoup(pip install BeautifulSoup)等. 谷歌自动化工具–& ...
- 红队信息收集自动化工具-水泽(ShuiZe)
红队信息收集自动化工具-水泽(ShuiZe) 文章目录 红队信息收集自动化工具-水泽(ShuiZe) 0x01 介绍 0x02 安装 0x03 效果展示 0x04 POC编写 0x05 使用方法 0x ...
- 前端自动化工具 grunt 插件 uglify 的简单使用(一)
Grunt 的简介: Grunt 是一套前端自动化工具,是一个基于 node.js 的命令行工具,它一般用于: 1.压缩文件: 2.合并文件: 3.简单的语法检测: 4.监听文件变动: 5.less ...
- 在 CentOS 7 中安装并使用自动化工具 Ansible
Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具.它用Python写成,类似于Chef和Puppet,但是有一个不同和优点是我们不需要在节点中安装任何客户端.它使用SSH来和节点进 ...
- python 网页自动处理_推荐一款 10 行 Python 代码实现网页自动化工具
各种各样的网站在我们日常工作和学习中占据着举足轻重的地位,学习.影音娱乐.查询资料.协同办公,越来越多的任务都被迁移到浏览器 因此,网页也蕴含着很多有价值.我们能够用得到的资源 例如,数据.歌曲.影视 ...
最新文章
- Java Bean Validation 最佳实践
- 三、界面介绍(IVX快速手册)
- cve20190708补丁的kb名称_微软KB4495667补丁(CVE 2019-0708补丁)V1.1 官方版
- 插个队 leetcode 142. 环形链表 II
- html设置回到顶部按钮,给网站添加回到顶部按钮
- 股票量化交易有哪些潜在的风险?如何去避免?
- oracle市场份额情况怎样,Oracle 2013年数据库市场份额47.4 - 再居第一
- 虚拟化性能计数器需要至少一个可正常使用的计数器。 模块“VPMC”启动失败。 未能启动虚拟机。
- (三)JVM成神路之全面详解执行引擎子系统与JIT即时编译原理
- 图片拼图微信小程序源码_支持多模板制作和流量主
- 微型计算机硬件系统中PROM是,1微型计算机硬件系统中最核心的部件是CPU.doc
- Python开HTTP服务器
- 19、会员中心 - 小程序端开发 - 微擎小程序模块应用开发
- 武汉二手房价分析(原创分析,数据现势性2018年6月)
- 外部数据导入qiime2软件内部
- [量子客]3月全球量子计算发展内参
- 世界著名电脑病毒排行榜
- 1,document.getelementbyid().value与document.getElementById().innerHTML区别
- Pyqt+Mimics优化计算机辅助设计工作流
- 用nginx完成一个网页制作
热门文章
- 微信小程序之授权登录的实现(button按钮)
- 摄影之构图,了解画面构成的五大元素:主体、陪体、前景、背景、留白
- 小程序源码:全新超火的微信小说小程序源码-自带采集带安装教程-多玩法安装简单
- Arcgis根据矢量道路数据来提取道路中心线
- SQL Server Always Encrypted
- 常山浙西计算机学校,常山这所最早的学校你上过吗?历经三个世纪,他依然在最初的地方等你……...
- 迅捷pdf转换器完美解决如何将pdf转换成word问题
- win server 2008r2 相关设置
- 摩尔庄园怎么显示全部服务器,摩尔庄园手游服务器查看区别方法
- Android Jetpack架构篇:Room