【0基础学爬虫】爬虫基础之自动化工具 Playwright 的使用

news2024/11/27 12:43:38

0

大数据时代,各行各业对数据采集的需求日益增多,网络爬虫的运用也更为广泛,越来越多的人开始学习网络爬虫这项技术,K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章,为实现从易到难全方位覆盖,特设【0基础学爬虫】专栏,帮助小白快速入门爬虫,本期为自动化工具 playwright 的使用。

概述

上期文章中讲到了自动化工具 Selenium 的基本使用方法,也介绍了 Selenium 的优缺点。Selenium的功能非常强大,支持所有现代浏览器。但是 Selenium 使用起来十分不方便,我们需要提前安装好浏览器,然后下载对应版本的驱动文件,当浏览器更新后驱动文件也得随之更新。如果想要大规模且长期的采集数据,那么部署 Selenium 时环境配置会是一个大问题。因此本期我们将介绍一款更加好用的自动化工具 Playwright 。

Playwright 的使用

介绍

Playwright是一个用于自动化Web浏览器测试和Web数据抓取的开源库。它由Microsoft开发,支持Chrome、Firefox、Safari、Edge和WebKit浏览器。Playwright的一个主要特点是它能够在所有主要的操作系统(包括Windows、Linux和macOS)上运行,并且它提供了一些强大的功能,如跨浏览器测试、支持无头浏览器、并行执行测试、元素截图和模拟输入等。它主要有以下优势:

  1. 兼容多个浏览器,而且所有浏览器都使用相同的API。
  2. 速度快、稳定性高,即使在大型、复杂的Web应用程序中也可以运行。
  3. 支持无头浏览器,因此可以在没有可见界面的情况下运行测试,从而提高测试效率。
  4. 提供了丰富的 API,以便于执行各种操作,如截图、模拟输入、拦截网络请求等。

安装

使用 Playwright 需要 Python版本在3.7以上。

安装 Playwright 可以直接使用 pip 工具:

pip install playwright

安装完成后需要进行初始化操作,安装所需的浏览器。

playwright install

执行上述指令时,Playwright 会自动安装多个浏览器(Chromium、Firefox 和 WebKit)并配置驱动,所以速度较慢。

使用

Playwright 支持同步与异步两种模式,这里分开来进行讲解。

同步

使用 Playwright 时可以选择启动安装的三种浏览器(Chromium、Firefox 和 WebKit)中的一种。

from playwright.sync_api import sync_playwright

# 调用sync_playwright方法,返回浏览器上下文管理器
with sync_playwright() as p:
    # 创建谷歌浏览器示例,playwright默认启动无头模式,设置headless=False,即关闭无头模式
    browser = p.chromium.launch(headless=False)
    # 新建选项卡
    page = browser.new_page()
    # 跳转到目标网址
    page.goto("http://baidu.com")
    # 获取页面截图
    page.screenshot(path='example.png')
    # 打印页面的标题,也就是title节点中的文本信息
    print(page.title())
    # 关闭浏览器
    browser.close()
# 输出:百度一下,你就知道

1

可以看到,Playwright 的使用也比较简单,语法比较简洁,而且浏览器的启动速度以及运行速度也很快。

异步

异步代码的编写方法与同步基本一致,区别在于同步调用的是 sync_playwright,异步调用的是 async_playwright。最终运行效果与同步一致。

import asyncio
from playwright.async_api import async_playwright

async def main():
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=False)
        page = await browser.new_page()
        await page.goto("http://baidu.com")
        # 打印网页源代码
        print(await page.content())
        await browser.close()

asyncio.run(main())

代码生成

Playwright 提供了代码生成功能,这个功能可以对我们在浏览器上的操作进行录制并生成代码,它可以有效提高程序的编写效率。代码生成功能需要使用 Playwright 命令行中的 codegen实现,codegen 命令存在如下主要参数:

-o :将生成的脚本保存到指定文件

--target :生成的语言,默认为 Python

--save-trace :记录会话的跟踪并将其保存到文件中

-b :要使用的浏览器,默认为 chromium

--timeout :设置页面加载的超时时间

--user-agent :指定UA

--viewport-size :指定浏览器窗口大小

我们在命令行执行命令:playwright codegen -o script.py

执行命令后会弹出一个 chromium 浏览器与脚本窗口,当我们在浏览器上进行操作时,脚本窗口会根据我们的操作生成对应代码。当我们操作结束后,关闭浏览器,在当前目录下会生成一个 script.py 文件,该文件中就是我们在进行浏览器操作时,Playwright 录制的代码。我们运行该文件,就会发现它在复现我们之前的操作。

2

代码生成功能的实用性其实较为一般,它只能实现比较简单的操作,当遇到复杂操作时,生成的代码就容易出现问题。最好的方式是使用代码生成功能生成部分操作的代码,然后再手动去修改它生成的代码。

隔离

上一步中,我们使用代码生成功能生成了一段代码,我们会发现这段代码中使用到了一个 new_context 方法,通过这个方法创建了一个 content ,然后再去进行其它操作。这个 new_content 方法其实是为了创建一个独立的全新上下文环境,它的目的是为了防止多个测试用例并行时各个用例间不受干扰,当一个测试用例异常时不会影响到另一个。

browser = playwright.chromium.launch()
context = browser.new_context()
page = context.new_page()

定位器

Playwright 提供了多种定位器来帮助开发中定位元素。

page.get_by_role() :通过显式和隐式可访问性属性进行定位。

page.get_by_text() :通过文本内容定位。

page.get_by_label() :通过关联标签的文本定位表单控件。

page.get_by_placeholder() :按占位符定位输入。

page.get_by_alt_text() :通过替代文本定位元素,通常是图像。

page.get_by_title() :通过标题属性定位元素。

page.get_by_test_id() :根据data-testid属性定位元素(可以配置其他属性)。

page.locator():拓展选择器,可以使用 CSS 选择器进行定位

使用定位器最好的方式就是上文中讲到的利用代码生成功能来生成定位代码,然后手动去修改,这里就不做尝试。

选择器

Playwright 支持 CSS、Xpath 和一些拓展选择器,提供了一些比较方便的使用规则。

CSS 选择器

# 匹配 button 标签
page.locator('button').click()
# 根据 id 匹配,匹配 id 为 container 的节点
page.locator('#container').click()
# CSS伪类匹配,匹配可见的 button 按钮 
page.locator("button:visible").click()
# :has-text 匹配任意内部包含指定文本的节点
page.locator(':has-text("Playwright")').click()
# 匹配 article 标签内包含 products 文本的节点
page.locator('article:has-text("products")').click()
# 匹配 article 标签下包含类名为 promo 的 div 标签的节点
page.locator("article:has(div.promo)").click()

Xpath

page.locator("xpath=//button").click()
page.locator('xpath=//div[@class="container"]').click()

其它

# 根据文本匹配,匹配文本内容包含 name 的节点
page.locator('text=name').click()
# 匹配文本内容为 name 的节点
page.locator("text='name'").click()
# 正则匹配
page.locator("text=/name\s\w+word").click()
# 匹配第一个 button 按钮
page.locator("button").locator("nth=0").click()
# 匹配第二个 button 按钮
page.locator("button").locator("nth=-1").click()
# 匹配 id 为 name 的元素
page.locator('id=name')

等待

当进行 click 、fill 等操作时,Playwright 在采取行动之前会对元素执行一系列可操作性检测,以确保这些行动能够按预期进行。

如对元素进行 click 操作之前,Playwright 将确保:

元素附加到 DOM

元素可见

元素是稳定的,因为没有动画或完成动画

元素接收事件,因为没有被其他元素遮挡

元素已启用

即使 Playwright 已经做了充分准备,但是也并不完全稳定,在实际项目中依旧容易出现因页面加载导致事件没有生效等问题,为了避免这些问题,需要自行设置等待。

# 固定等待1秒
page.wait_for_timeout(1000)
# 等待事件
page.wait_for_event(event)
# 等待加载状态
page.get_by_role("button").click()
page.wait_for_load_state()

事件

添加/删除事件

from playwright.sync_api import sync_playwright


def print_request_sent(request):
    print("Request sent: " + request.url)


def print_request_finished(request):
    print("Request finished: " + request.url)


with sync_playwright() as p:
    browser = p.chromium.launch(headless=False)
    page = browser.new_page()
    # 添加事件 发起请求时打印URL
    page.on("request", print_request_sent)
    # 请求完成时打印URL
    page.on("requestfinished", print_request_finished)
    page.goto("https://baidu.com")
    # 删除事件
    page.remove_listener("requestfinished", print_request_finished)
    browser.close()

反检测

在 Selenium 的使用中,我们讲到了自动化工具容易被网站检测,也提供了一些绕过检测的方案。这里我们介绍一下 Playwright 的反检测方案。

以 https://bot.sannysoft.com/ 为例,我们分别测试正常模式与无头模式下的检测结果。

正常模式:

3

无头模式:

4

可以看到,正常模式下 WebDriver 一栏报红,而无头模式下更是惨不忍睹,基本上所有特征都被检测到了。这些还只是最基本的检测机制,自动化工具的弱点就暴露的很明显了。

与 Selenium 一样,绕过检测主要还是针对网站的检测机制来处理,主要就是在页面加载之前通过执行 JS 代码来修改一些浏览器特征。以无头模式为例:

from playwright.sync_api import sync_playwright

with open('./stealth.min.js', 'r') as f:
    js = f.read()

with sync_playwright() as p:
    browser = p.chromium.launch()
    # 添加 UserAgent
    page = browser.new_page(
        user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36'
    )
    # 执行 JS 代码
    page.add_init_script(js)
    page.goto("https://bot.sannysoft.com/")
    page.screenshot(path='example.png')
    browser.close()

这里与 Selenium 反检测方案一样,执行 stealth.min.js 来隐藏特征( stealth.min.js 的来源与介绍参考上期文章)。最终结果如下图:

5

可以看到,与真实浏览器访问基本一致了。

总结

与 Selenium 相比,Playwright 最大的优点就是不需要手动安装驱动,而且它拥有更好的性能与更多的功能。因此 在爬虫领域,Playwright 是更好的选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/471226.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

autosar软件分层架构组成--汽车电子

介绍 autosar是汽车软件协会制定的一套软件标准 本文章所有图片来源于网络 一、分层架构 分层:3层 1.上层应用层(Application Layer) 2.中间件RTE(Runtime Environment) 3.下层的基础软件(Basic Software) 中间件R…

电脑截图快捷键有哪些?5大截图方法总结!(2023版)

案例:电脑截图快捷键 【朋友们,最近我总是需要用到电脑截图,有什么比较好用的电脑截图快捷键可以帮助我提高效率的吗?感谢感谢!】 电脑截图是我们日常工作、学习中不可或缺的一项功能。在Windows系统中,快…

python图像处理之形态学梯度、礼帽、黑帽

文章目录 简介实战 简介 腐蚀和膨胀是图像形态学处理的基本运算,这两种运算的复合运算构成了开和闭,而腐蚀、膨胀与原图之间的加减操作,则构成了形态学梯度、礼帽和黑帽计算。 由于这几种函数均基于腐蚀和膨胀,所以其参数均与开…

zynq基于XDMA实现PCIE X8通信方案测速 提供工程源码和QT上位机程序和技术支持

目录 1、前言2、我已有的PCIE方案3、基于zynq架构的PCIE4、总体设计思路和方案5、vivado工程详解6、SDK 工程详解7、驱动安装8、QT上位机软件9、上板调试验证9、福利:工程代码的获取 1、前言 PCIE(PCI Express)采用了目前业内流行的点对点串…

Linux进程通信:信号相关函数

1. kill函数 #include<sys/types.h> #include<signal.h>int kill(pid_t pid, int sig); /* 功能&#xff1a;给进程pid发送信号sig 参数&#xff1a;pid&#xff1a;取值有4种情况&#xff1a;> 0&#xff1a;将sig信号发送给进程号为pid的进程&#xff1b; 0&…

加密解密学习笔记

加密种类 对称加密&#xff0c;分组对称加密算法 加密算法 AES&#xff08;Advanced Encryption Standard&#xff09;高级加密标准 DES&#xff08;Data Encryption Standard&#xff09;数据加密标准 3DES/Triple DEA (Triple Data Encryption Algorithm) 三重数据加密算…

如何分别在macOSWindowsLinux上对OpenSSL源码进行编译

问题描述 如何分别在macOS、Windows、Linux系统上对OpenSSL源码进行编译&#xff1f; 问题解答 编译版本&#xff1a;openssl-1.1.1t 官方源码地址&#xff1a;https://www.openssl.org/source/ 下面流程在三种系统上均进行实际验证&#xff0c;可放心食用。 Windows(MSVC…

在Vue3项目中js-cookie库的使用

文章目录 前言1.安装js-cookie库2.引入、使用js-cookie库 前言 今天分享一下在Vue3项目中引入使用js-cookie。 1.安装js-cookie库 js-cookie官网 安装js-cookie&#xff0c;输入 npm i js-cookie安装完成可以在package.json中看到&#xff1a; 安装以后&#xff0c;就可…

【C++代码之美】你不得不知道的经典代码

1.斐波那契数列 斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又称黄金分割数列&#xff0c;因数学家莱昂纳多斐波那契&#xff08;Leonardo Fibonacci&#xff09;以兔子繁殖为例子而引入&#xff0c;故又称为“兔子数列”&#xff0c;指的是这样一个…

vite4+vue3:从0到1搭建vben后台管理系统

从0到1带你学习如何搭建vben后台管理系统系列文章目录 一.准备工作:技术选型基础环境的搭建 文章目录 从0到1带你学习如何搭建vben后台管理系统系列文章目录一.准备工作:技术选型基础环境的搭建 前言一、技术选型二、生成基础项目三、安装步骤跑起项目 总结 前言 前端日趋复杂…

鸿蒙Hi3861学习二-程序烧录与日志输出

一、准备事项 开发板&#xff1a;BearPi-Hm Nano windows工具&#xff1a;HiBurn.exe https://pan.baidu.com/s/18OQD1_BvjNKD_J2e2iX3qg?pwdadrs 提取码&#xff1a;adrs windows工具&#xff1a;MobaXterm和RaiDrive 把ubuntu文件夹映射到windows本地。可以参考如下链接&am…

边缘计算在哪些场景的应用?实现了哪些功能

边缘计算是一种分布式计算模型&#xff0c;将数据处理和存储功能从云中心移动到接近数据源的边缘设备上&#xff0c;从而在处理延迟、网络带宽、隐私保护和数据安全等方面带来了许多优势。 智慧油站应用&#xff1a;在加油区部署的吸烟检测、打电话检测、烟火检测、区域入侵检测…

Mybatis-Flex快速入门教程

目录 一、Mybatis-Flex是什么&#xff1f; 二、Mybatis-Flex的有什么特点&#xff1f; 三、Mybatis-Flex和同类框架对比 四、Mybatis-Flex支持的数据库类型 五、快速入门 &#xff08;1&#xff09;引入依赖 &#xff08;2&#xff09;创建数据库 &#xff08;3&#…

攀高识别预警系统 yolov7

攀高识别预警系统通过yolov7网络模型技术&#xff0c;攀高识别预警系统对人员违规抽烟、打架斗殴、异常倒地、翻越围墙、异常聚集、打电话、区域侵入等行为分析等立即抓拍及时触发告警。YOLOv7 的发展方向与当前主流的实时目标检测器不同&#xff0c;研究团队希望它能够同时支持…

【5. ROS机器人的运动控制】

【ROS机器人的运动控制】 1. 前言2. 机器人的运动3. 机器人的运动速度单位4. geometry_msgs模型5. 用C实现机器人运动控制5.1 新建vel_pkg包5.2 编写vel_node.cpp代码5.3 设置编译规则5.4 运行验证 6. 用python实现机器人运动控制6.1 新建vel_pkg包6.2 编写vel_node.py代码6.3 …

[开源工具]Win10/11/8/7 获取笔记本电脑连接过的WIFI名称和密码[开箱可用]

[开源工具]Win10/11/8/7 获取笔记本电脑连接过的WIFI名称和密码[开箱可用] 1.打开命令提示符(管理员身份)2.输入netsh wlan show profile3.输入netsh wlan export profile folderC:\ keyclear4.打开C盘5.使用记事本打开 查看WIFI名称和密码 1.打开命令提示符(管理员身份) 首先…

计算机网络-应用协议与数据包分析实验(使用Wireshark)

实验一.应用协议与数据包分析实验(使用Wireshark) 一.实验目的 通过本实验&#xff0c;熟练掌握Wireshark的操作和使用&#xff0c;学习对HTTP协议进行分析。 二.实验内容 学习http协议&#xff0c;使用Wireshark截获http报文&#xff0c;对http请求报文和响应报文进行分析。…

【ONE·C++ || 多态】

总言 主要介绍多态相关内容。 文章目录 总言1、多态介绍1.1、多态是什么1.2、构成多态的两个必备条件1.2.1、虚函数介绍1.2.2、基类的指针或者引用调用虚函数1.2.3、演示多态条件的破坏&#xff08;两个特例说明&#xff09;1.2.3.1、不符合条件演示1.2.3.2、特例演示 1.3、一…

【高危】Spring Boot在Cloud Foundry中部署存在路由限制绕过风险(CVE-2023-20873)

漏洞描述 Spring Boot是用于构建Java应用程序的框架&#xff0c;Cloud Foundry是用于部署和管理应用程序的云平台&#xff0c;/cloudfoundryapplication也会路由至Spring Boot actuator。 当 Spring Boot 的受影响版本部署在 Cloud Foundry 上且具有处理 /cloudfoundryapplic…

计算机网络-应用层和传输层协议分析实验(PacketTracer)

实验三.应用层和传输层协议分析实验 一.实验目的 通过本实验&#xff0c;熟悉PacketTracer的使用&#xff0c;学习在PacketTracer中仿真分析应用层和传输层协议&#xff0c;进一步加深对协议工作过程的理解。 二.实验内容 从 PC 使用 URL 捕获 Web 请求&#xff0c;运行模拟并…