pc端和移动端的网站,一个服务器如何建设多个网站,企排排官网,罗马柱 东莞网站建设之前有见同事用过playwright进行浏览器模拟操作#xff0c;但是没有仔细了解#xff0c;今天去详细看了下#xff0c;发现playwright着实比selenium牛逼多了 Playwright 相对于selenium优点 1、自动下载chromnium, 无需担心chrome升级对应版本问题#xff1b; 2、支持录屏操…之前有见同事用过playwright进行浏览器模拟操作但是没有仔细了解今天去详细看了下发现playwright着实比selenium牛逼多了 Playwright 相对于selenium优点 1、自动下载chromnium, 无需担心chrome升级对应版本问题 2、支持录屏操作然后直接生成python代码 3、支持网路拦截、事件监听纵使我们是模拟浏览器但是依旧可以在request请求上作文章这个就很牛逼 4、代码简洁性更高 5、支持异步处理 安装使用 #下载第三方库
pip3 install playwright
#安装好后进行初始化操作它会自动安装chromium, Firefox , webkit浏览器并配置一些驱动
playwright install录屏操作 1、使用控制台terminalcmd, powershell进入到项目目录下 2、查看所有的录屏相关命令playwright codegen -h 3、启动示例 #-o 非必须输出代码到指定文件如果不指定也可以在界面中复制代码就好
#-b 非必须指定浏览器 默认是chromnium
#--device #非必须 指定机器型号
#www.baidu.com #非必须 指定访问的url
playwright codegen -o luping.py -b chromnium --deviceiphone 13 www.baidu.com#--save-storage 保存浏览器缓存可以自定义指定项目名称
playwright codegen -b cr --save-storagesaiying www.saleyee.cn
#--load-storage 获取已有的浏览器缓存指定好项目名称就好
playwright codegen -b cr --load-storagesaiying www.saleyee.cn4、录屏时直接人工操作就好了也可以暂停录屏至于如何获取元素内容需要自己探究 5、退出录屏只要在控制台ctrlC 6、然后把代码改一改就可以使用了这个还是很方便的 使用代码示例 事件监听close页面关闭事件。console页面上发生控制台日志事件。crash页面崩溃事件。dialog页面弹出对话框事件。domcontentloadedDOM 内容加载完成事件。download页面上触发下载事件。filechooser页面弹出文件选择对话框事件。frameattached子框架附加到页面事件。framedetached子框架从页面分离事件。framenavigated子框架导航事件。load页面加载完成事件。pageerror页面上发生错误事件。popup页面弹出弹出窗口事件。request页面发出网络请求事件。requestfailed页面上的请求失败事件。requestfinished页面上的请求完成事件。response页面接收到网络响应事件。websocket页面上发生 WebSocket 事件。worker页面上发生 Worker 事件。
# -*- coding: utf-8 -*-
import asyncio
import time
from urllib import parse
from playwright.async_api import async_playwright
from playwright.sync_api import sync_playwright#响应事件response监听, 数据采集的逻辑可以在这里做
def on_response(response):if api/movie/ in response.url and response.status 200:# print(fStatue {response.status}: {response.url})print(response.json())#请求事件request监听只能获取相关的请求参数用处不大
def on_request(request):print(request.url)#下载事件监听比如店铺后台的表格下载就可以在此处理
def on_download(download):print(fDownload started: {download.url})#!!!!!!!!!!!!!网络劫持
#可以实现网络劫持和修改操作比如非加密通过相应参数修改获取自定义返回的内容从而采集
#它就相当于一个网络钩子可以修改请求信息, 还可以设置保持浏览器上url不变的情况下跳转其他站点页面
def handle_request(route, request):url request.urlif url http://example.com:if route.request.method GET:print(fGET请求url为{route.request.url})bits list(parse.urlparse(url))qs parse.parse_qs(bits[4])qs[key1] [GET] # 此处替换key1的值bits[4] parse.urlencode(qs, True)url parse.urlunparse(bits)print(f改变后的url为 {url}\n)route.continue_(urlurl)elif route.request.method POST:print(fPOST请求入参为{route.request.post_data})text_list route.request.post_data.split()for i in range(len(text_list)):text_item text_list[i]if key1 in text_item:text_list[i] key1POST # 此处替换key1的值print(f改变后的数据为 {.join(text_list)}\n)route.continue_(post_data.join(text_list))# 同步
# 使用with打开服务可以避免中间代码执行报错导致无法正常关闭浏览器进程
with sync_playwright() as p:# browser_type_list [p.chromium, p.firefox, p.webkit]for browser_type in [p.chromium]:browser browser_type.launch(headlessFalse)#可以指定项目名称例saiying,这样可以继承上一次浏览器缓存这样可以规避下重复登录的问题 但是不清楚没有该项目名称情况下会有什么问题# 也可以不指定创建一个新的context browser.new_context()# 如果使用该种方式记得流程结束后要再保留下当前缓存context.storage_state(pathsaiying) 在下面有示例# context browser.new_context(storage_statesaiying)# page context.new_page()#直接生成新浏览器执行对象page browser.new_page()#事件监听----startpage.on(response, on_response) #响应事件监听page.on(request, on_request) #发起请求事件监听page.on(download, on_download) # 文件下载事件监听# 事件监听----end#网络拦截---startroute_url http://127.0.0.1/zentao/testcase-create-1-0-0.html #可以指定拦截url,或者部分定制url#route_url ** #指定全部的url#route_url **/*.json #指定部分urlpage.route(route_url, handle_request) # 监听添加用例接口# 网络拦截---endpage.goto(https://spa6.scrape.center/) #请求网页地址page.wait_for_load_state(networkidle) #等待页面所有请求响应完毕还有load, domcontentloadedelement page.query_selector(xpath//a) #单节点定位elements page.query_selector_all(xpath//a) # 多节点定位for element in elements:print(element.inner_html()) #打印该节点下所有标签内容print(element.get_attribute(href))element.query_selector(xpath.//img)print(page.title())# 在登录完毕或者操做完毕后保留当前缓存供下次调用# context.storage_state(pathsaiying)# context.close()page.close()browser.close() #关闭浏览器# #异步, 感觉用处不大
# async def main():
# async with async_playwright() as p:
# # browser_type_list [p.chromium, p.firefox, p.webkit]
# for browser_type in [p.chromium]:
# browser await browser_type.launch(headlessFalse)
# page await browser.new_page()
# await page.goto(https://www.baidu.com)
# print(await page.title())
# await browser.close()
#
# asyncio.run(main())