playwright 爬虫使用

2023-05-16

官方文档:Getting started | Playwright Python

参考链接:强大易用!新一代爬虫利器 Playwright 的介绍

目录

安装

基本使用

代码生成

AJAX 动态加载数据获取

事件监听

不加载图片

CSS 选择器、文本选择器、click()

xpath 选择器

获取网页源代码

文本输入

选择提取标签

提取文本

提取标签中的属性

鼠标滚动

下拉滚动条

cookie 登录


安装

Playwrigth 会安装 Chromium, Firefox and WebKit 浏览器并配置一些驱动,我们不必关心中间配置的过程,Playwright 会为我们配置好。

pip install playwright

# 安装完后初始化
playwright install

基本使用

打开浏览器,跳转到百度网页,打印标题;设置了 headless 参数为 False,代表显示浏览器界面。

from playwright.sync_api import Playwright, sync_playwright

with sync_playwright() as p:
    rowser = playwright.chromium.launch(headless=False)
    page = browser.new_page()
    page.goto('https://www.baidu.com')
    print(page.title())
    browser.close()

代码生成

可以录制我们在浏览器中的操作并将代码自动生成出来,在爬虫中对于一些点击,跳转,鼠标移动等自动化操作,可以使用。

方便在一些步骤不知道怎么写时,可以自动生成代码参考。

在指定路径下输入命令,会弹出对应窗口,就可以开始人工操作,会生成代码,但对于有点复杂的操作好像自动生成不成功。

playwright codegen -o script.py 

启动一个谷歌浏览器,然后将操作结果输出到 script.py 文件,下面生成一个代码看看。

下面这段代码,打开茶语网,点击【茶评】,会打开一个新窗口跳转过去。

from playwright.sync_api import Playwright, sync_playwright


def run(playwright: Playwright) -> None:
    browser = playwright.chromium.launch(headless=False)
    context = browser.new_context()

    # Open new page
    page = context.new_page()

    # Go to https://www.chayu.com/
    page.goto("https://www.chayu.com/")

    # Click #sub-nav >> text=茶评
    # 由于弹出新窗口,需要等待,这里就是自动等待页面加载
    # 点击茶评,等待页面加载
    with page.expect_popup() as popup_info:
        # 就页面的操作都可以在这里面继续加
        page.click("#sub-nav >> text=茶评")
    page1 = popup_info.value # 赋值新窗口对象

    # Close page
    page.close()

    # Close page
    page1.close()

    # ---------------------
    context.close()
    browser.close()


with sync_playwright() as playwright:
    run(playwright)

AJAX 动态加载数据获取

对于获取动态加载的数据,需要及其注意的一点,需要浏览器把动态加载的页面显示在上面,才能提取,例如:https://chaping.chayu.com/tea/3266,获取评论数据,ajax 加载的,打开页面:

 如果打开页面直接提取评论数据,是提取不到的,需要吧数据滑动到页面上后,再提取(坑死了

事件监听

Page 对象提供了一个 on 方法,它可以用来监听页面中发生的各个事件,比如 close、console、load、request、response 等等。

可以监听 response 事件,response 事件可以在每次网络请求得到响应的时候触发,我们可以设置对应的回调方法。

可以结合 ajax 获取数据使用 ,截获 Ajax 请求,输出对应的 JSON 结果。

from playwright.sync_api import sync_playwright

def on_response(response):
    if '/api/movie/' in response.url and response.status == 200:
        print(response.json())

with sync_playwright() as p:
    browser = p.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()

不加载图片

调用了 route 方法,第一个参数通过正则表达式传入了匹配的 URL 路径,这里代表的是任何包含 .png 或 .jpg  的链接,遇到这样的请求,会回调 cancel_request 方法处理,cancel_request 方法可以接收两个参数,一个是 route,代表一个 CallableRoute 对象,另外一个是 request,代表 Request 对象。这里我们直接调用了 route 的 abort 方法,取消了这次请求,所以最终导致的结果就是图片的加载全部取消了

from playwright.sync_api import sync_playwright
import re

with sync_playwright() as p:
    browser = p.chromium.launch(headless=False)
    page = browser.new_page()
    
    # 不加载图片
    def cancel_request(route, request):
        route.abort()
    page.route(re.compile(r"(\.png)|(\.jpg)"), cancel_request)

    page.goto("https://spa6.scrape.center/")
    page.wait_for_load_state('networkidle')
    page.screenshot(path='no_picture.png')
    browser.close()

CSS 选择器、文本选择器、click()

click 方法里面接选择器表达式,提取后点击,可设置 timeout 超时时间,默认 30秒,设置以毫秒为单位,如等待 5 秒未点击成功,这报错 timeout=5000

# 选择文本是 Log in 的节点,并点击
page.click("text=Log in",timeout=5000)

# 选择 id 为 nav-bar 子孙节点 class 属性值为 contact-us-item,并点击
page.click("#nav-bar .contact-us-item")

# 选择文本中包含 Playwright 的 article 节点
page.click("article:has-text('Playwright')")

# 选择 id 为 nav-bar 节点中文本值等于 Contact us 的节点
page.click("#nav-bar :text('Contact us')")

# 选择 class 为 item-description 的节点,且该节点还要包含 class 为 item-promo-banner 的子节点
page.click(".item-description:has(.item-promo-banner)")

# 择的就是一个 input 节点,并且该 input 节点要位于文本值为 Username 的节点的右侧
page.click("input:right-of(:text('Username'))")

xpath 选择器

需要在开头指定 xpath= 字符串,代表后面是一个 XPath 表达式

page.click("xpath=//button")

获取网页源代码

这里获取的网页源代码,不管网页是 ajax 加载的,都是获取最终的 html。

凡是需要对 html 中的元素进行操作的 page.wait_for_load_state('networkidle') 必写,用于等待 html 加载。

page.wait_for_load_state('networkidle')
html = page.content()

文本输入

一般文本输入会先清空原来的,但 playwright 没有像 selenium 一样的方法,只能先定位到文本框,然后填充空字符串后再输入

在 input 标签 name 属性为 wd 的输入 nba

page.fill("input[name=\"wd\"]", "")
page.fill("input[name=\"wd\"]", "nba")

选择提取标签

提取所有 div 标签 class 属性为 list 的 

elements = page.query_selector_all('div.list')

提取 span 标签 class 属性为 score 的,如匹配到多个,则取第一个

score = element.query_selector('span.score')

提取文本

提取文本为【品牌:】的标签,在提取标签下的所有文本

brand = element.query_selector('text=品牌:').text_content()

提取标签中的属性

提取 h5 标签下的 a 标签,获取 a 标签中的 href 属性取值

 link = element.query_selector('h5 a').get_attribute('href')

鼠标滚动

向右滚动 0,向下滚动 7000,可用于下拉滚动条功能

page1.mouse.wheel(0,7000)

下拉滚动条

执行 js 代码,下拉滚动条,15000 可以根据情况设置

page1.evaluate("var q=document.documentElement.scrollTop=15000")

cookie 登录

参考:crawler – 逸飞的技术日志

登录获得保存 cookie

from playwright.sync_api import Playwright, sync_playwright
import json


def run(playwright: Playwright) -> None:
    browser = playwright.chromium.launch(headless=False)
    context = browser.new_context()

    # Open new page
    page = context.new_page()

    # Go to http://www.glidedsky.com/login
    page.goto("http://www.glidedsky.com/login")

    # Click input[name="email"]
    page.click("input[name=\"email\"]")

    # Fill input[name="email"]
    page.fill("input[name=\"email\"]", "账号")

    # Click input[name="password"]
    page.click("input[name=\"password\"]")

    # Fill input[name="password"]
    page.fill("input[name=\"password\"]", "密码")

    # Click button:has-text("Login")
    page.click("button:has-text(\"Login\")")
    # assert page.url == "http://www.glidedsky.com/"

    # 获得登录后 cookie
    storage = context.storage_state()
    with open("state.json", "w") as f:
        f.write(json.dumps(storage))

    # Close page
    page.close()

    # ---------------------
    context.close()
    browser.close()


with sync_playwright() as playwright:
    run(playwright)

使用 cookie 进行登录

from playwright.sync_api import Playwright, sync_playwright
import json


def run(playwright: Playwright) -> None:
    browser = playwright.chromium.launch(headless=False)

    # 加载状态
    with open("state.json") as f:
        storage_state = json.loads(f.read())
    context = browser.new_context(storage_state=storage_state)

    # Open new page
    page = context.new_page()

    # Go to http://www.glidedsky.com/login
    page.goto("http://www.glidedsky.com/")


    # Close page
    page.close()

    # ---------------------
    context.close()
    browser.close()


with sync_playwright() as playwright:
    run(playwright)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

playwright 爬虫使用 的相关文章

  • Qt Quick 3D中将3D场景(如.obj)转换为.mesh

    Qt 5 15以后提供了Qt Quick 3D的新模块 xff0c 该模块可使用可视化的方式即可进行3D模型的显示 xff0c 并且相较于Qt 3D来说 xff0c 该模块的API更为高级 xff0c 使用者不需要自己设计底层的细节 该模块
  • Qt Quick 3D系列(一):加载3d模型

    如果我们想在QML中使用3D且你之前没有三维程序开发的基础 xff0c 使用Qt Quick 3D是个不错的选择 xff0c 下面我介绍如何使用Qt Quick 3D加载3d模型 注意 xff1a Qt Quick 3D从Qt 5 15之后
  • boa常见错误整理

    错误1 xff1a bison y d boa grammar y gcc g O2 pipe Wall I c o y tab o y tab c y tab c In function yyparse y tab c 1295 warn
  • Qt Quick 3D系列(二):鼠标控制3D模型旋转缩放

    上一篇文章Qt Quick 3D系列 xff08 一 xff09 xff1a 加载3d模型我们讲述了如何在Qt Quick 3D中显示一个3D模型 xff0c 那么显示了3D模型后如何使用鼠标进行旋转呢 xff1f 在Qt 3D中提供了Or
  • Qt Quick 3D系列(三):设置三维模型的金属光泽材质

    前面的博客中介绍了如何在Qt Quick 3D中加载三维模型 xff0c 下面介绍如何设置三维模型的材质 xff0c 例如下图模型 我需要设置为金属材质时 xff0c 设置该Model的materials为PrincipledMateria
  • Qt Quick 3D系列(四):为三维模型添加动画效果

    Qt Quick 3D旨在让那些熟悉QML开发的人能够使用非常少的学习成本实现3D开发 xff0c 因此对于三维模型动画没有类似与Qt 3D中有个专门的Qt3DAnimation来控制动画效果 xff0c 而是直接使用QML中的Animat
  • Qt Quick 3D系列(五):三维模型展示示例

    为了展示一个好看的3D模型 xff0c 需要对模型设置背景 xff0c 设置三维材质 xff0c 设置周围光线 xff0c 设置模型阴影等等 下面示例展示了一个比较好看的三维模型效果 xff0c 大家可以先在C4D等调整好模型效果 xff0
  • QML 地图可拖拽位置标签组件

    在地图上显示位置信息时 xff0c 有时候需要同时显示该位置的详细信息 该组件可在地图上显示一个连接到地图地理位置的标签框 xff0c 该标签框可点击进行拖拽 在地理位置改变 地图缩放 地图平移时 xff0c 该标签框的相对位置保持不变 x
  • 使用QQuaternion对Qt Data Visualization中模型进行旋转

    在Data Visualization中 xff0c 三维显示的OBJ需要旋转时使用rotation属性 xff0c 但是该属性传入的值是一个四元数QQuaternion xff0c 直接赋值四元数很复杂 xff0c 因此使用转化的方式获得
  • QML 可拖拽边框和顶点调整大小组件(新增对主窗口支持)

    QML项目开发过程中 xff0c 有时候需要对控件大小和位置 进行人为调整 xff0c 因此设计该组件 该组件鼠标置于边框和顶点位置时鼠标样式对应改变 xff0c 拖动边框可修改该方向组件大小 xff0c 拖动顶点可修改组件处横纵向组件大小
  • QML 地图修改插件源码(五),Map添加自定义地图类型,并动态修改地图类型

    QML的地图Map中提供了属性activeMapType MapType用于设置当前地图的类型 xff0c 以OSM地图插件为例 xff0c OSM地图提供了多种地图类型 xff0c 下面介绍如何修改OSM插件的源码添加需要的地图类型 xf
  • Qt使用QQuaternion对空间矢量QVector3D进行旋转

    空间中的QVector3D既可以代表空间中的点位置 xff0c 也可以表示空间矢量 为什么要对空间矢量进行旋转呢 xff0c 比如有一个空间矢量在空间中代表了镜头前进的方向 xff08 即第一人称模式 xff09 xff0c 初始时该矢量指
  • QML实现双屏显示

    QML程序中需要分别在主屏幕和分屏幕上显示不同的界面内容 xff0c 但又为了不同界面间能够进行数据交互 xff0c 因此使用如下方法实现双屏显示 xff0c 即由主窗口生成第二个窗口 xff0c 将该窗口移动到第二个屏幕上 xff0c 实
  • ubuntu设置默认内核启动的方法

    本文介绍ubuntu设置默认内核启动的方法 参考如下图 xff0c 修改grub文件 xff1a 修改后 xff0c 执行 xff1a sudo update grub amp amp reboot
  • QML自定义的日历控件

    QML中提供了日历的控件Calendar xff0c 但该控件为QtQuick Controls 1中提供的控件 xff0c 因此只能使用QtQuick Controls Styles的方式对该控件进行设置 xff0c 效果如图 xff1a
  • QML地图Map中使用QPainterPath,并显示任意点经纬度位置

    QML地图Map中提供了供绘制图形的组件 xff0c 例如MapPolyline xff0c MapCircle等 xff0c 但是这些组件在绘制复杂轨迹时就显得功能不够全面 xff0c 因此我将QPainterPath在Map中进行使用并
  • QML地图绘制虚线

    QML提供了MapPolyline用于在地图上绘制线段 xff0c 该线段是实线 xff0c 因此我使用Canvas自定义绘制的方式在地图上绘制线段 xff0c 如图 xff1a 鼠标在地图上点击后 xff0c 在点击位置添加图标 xff0
  • QML无边框最大化窗口时遮住了任务栏,程序默认置顶的问题

    在QML窗口使用无边框 xff0c 并且默认程序最大化显示后 xff0c 此时程序显示默认自动变成了全屏显示 xff0c 程序自动遮挡住了系统任务栏 当使用多屏幕显示时 xff0c 切换不同程序 xff0c 该QML程序的界面显示错误 使用
  • 用VScode写C/C++,从下载安装到配置使用

    介绍 编程的过程大致分为编写代码 代码编译 代码执行三步 xff0c vscode可以完成代码编写 xff0c 但是不能进行编译 也就是将代码翻译为计算机可以听懂的话 xff0c MinGW可以完成这个任务 xff0c 二者配合可以实现在v
  • 深度学习训练降低显存指南

    一 小模块API参数inplace设置为True xff08 省一点点 xff09 比如 xff1a Relu 有一个默认参数inplace xff0c 默认设置为False xff0c 当设置为True时 xff0c 计算时的得到的新值不

随机推荐

  • C++工程师学习内容

    C 43 43 是最贴近底层编程语言 在性能方面上 xff0c 有着无可替代的优势特别是对于很多游戏开发公司来说 xff0c C 43 43 尤其适合作为后端服务的开发语言 在一些对于并发性能要求较高的业务上 xff0c C 43 43 也
  • Ubuntu 更新apt出错

    输入sudo apt get update后出现 Err 1 http us archive ubuntu com ubuntu xenial InRelease Temporary failure resolving 39 us arch
  • 使用OpenWrt开发嵌入式Linux(二):先让系统跑起来(使用initramfs)

    安装相关工具 推荐使用ubuntu 16及以上版本 sudo apt install gcc binutils bzip2 flex python perl make diffutils unzip gawk subversion zlib
  • 使用kubeadm从0到1搭建kubernete集群

    目录 概述 安装前提示 安装docker 安装kubeadm 安装kubernete集群master节点 安装 kubeadm kubectl kubelet组件 安装kubernete master节点 安装CNI网络插件 部署集群wor
  • shell基础之变量(2):变量有哪些种类、怎么定义/赋值/取值、不同种类变量的作用域

    通过本文能对shell变量有一个系统性的了解 xff0c 具体的包括 xff1a 变量的种类 xff1a 局部 全局 环境变量变量的定义和操作 xff1a 赋值 取值 取消变量变量的作用域 文章目录 一 变量的种类1 全局变量2 局部变量
  • java 泛型全解 - 绝对最详细

    背景 对于java的泛型我一直属于一知半解的 xff0c 平常真心用的不多 直到阅读 Effect Java 看到很多平常不了解的用法 xff0c 才下定决心 xff0c 需要系统的学习 xff0c 并且记录下来 1 泛型的概述 xff1a
  • Zookeeper数据同步流程

    在服务器启动阶段 xff0c 会进行磁盘数据的恢复 xff0c 完成数据恢复后就会进行Leader选举 一旦选举产生Leader服务器后 xff0c 就立即开始进行集群间的数据同步 xff0c 在整个过程中 xff0c Zookeeper都
  • JS中Ajax的方法和应用

    XMLHttpRequest对象 Ajax技术的核心是XMLHttpRequest对象 xff08 简称XHR xff09 这是有微软率先引入的一个特性 xff0c 其他浏览器提供商后来都提供了相同的实现 但因为IE的兼容性问题 xff0c
  • node.js安装及环境配置

    一 下载nodejs的安装包 xff1a 下载地址 xff1a https nodejs org zh cn download 根据自己电脑系统及位数选择 xff0c 一般都选择windows64位 msi格式安装包 网站上提供的安装包版本
  • 6个常用的React组件库

    Ant Design 项目链接 xff1a Ant Design 包大小 xff08 来自 BundlePhobia xff09 xff1a 缩小后 1 2mB xff0c 缩小 43 gzip 压缩后 349 2kB xff0c 通过摇树
  • 大数据培训课程数据清洗案例实操-简单解析版

    数据清洗 xff08 ETL xff09 在运行核心业务MapReduce程序之前 xff0c 往往要先对数据进行清洗 xff0c 清理掉不符合用户要求的数据 清理的过程往往只需要运行Mapper程序 xff0c 不需要运行Reduce程序
  • 宋红康2023版Java视频发布

    1500万 43 播放量见证经典 xff0c 尚硅谷宋红康老师的Java入门视频堪称神作 xff0c 如今经典再次超级进化 xff0c 新版Java视频教程震撼来袭 xff01 开发环境全新升级 xff1a JDK17 43 IDEA202
  • Java消息队列:消息在什么时候会变成Dead Letter?

    在较为重要的业务队列中 xff0c 确保未被正确消费的消息不被丢弃 xff0c 通过配置死信队列 xff0c 可以让未正确处理的消息暂存到另一个队列中 xff0c 待后续排查清楚问题后 xff0c 编写相应的处理代码来处理死信消息 一 什么
  • Vue2和Vue3数据双向绑定原理的区别及优缺点(下篇)

    上篇我们讲到了Vue2的数据双向绑定原理 xff0c 如果你没有阅读上篇 xff0c 建议先阅读一下上篇中的内容 Vue2和Vue3数据双向绑定原理的区别及优缺点 xff08 上篇 xff09 在上篇中我们抛出了一个问题 xff1a 是不是
  • FlinkTable时间属性

    像窗口 xff08 在 Table API 和 SQL xff09 这种基于时间的操作 xff0c 需要有时间信息 因此 xff0c Table API 中的表就需要提供逻辑时间属性来表示时间 xff0c 以及支持时间相关的操作 一 处理时
  • kafka学习(1)

    目录 kafka是什么 xff1f 为什么要用kafka kafka的特点 kafka结构 Kafka Producer的Ack机制 kafka是什么 xff1f 收集nginx日志 xff0c 将nginx日志的关键字段进行分析 xff0
  • spss 因子分析

    是通过研究变量间的相关系数矩阵 xff0c 把这些变量间错综复杂的关系归结成少数几个综合因子 xff0c 并据此对变量进行分类的一种统计方法 xff0c 归结出的因子个数少于原始变量的个数 xff0c 但是他们又包含原始变量的信息 xff0
  • Hive 报错 Invalid column reference 列名

    两张表 当我执行 select m movieid m moviename substr m moviename 5 4 as years avg r rate as avgScore FROM t movie as m join t ra
  • 20数学建模C-中小微企业的信贷决策

    前言 源码文末获取 小编在 9 月份参加了今年的数学建模 xff0c 成绩怎么样不知道 xff0c 能有个成功参与奖就不错了哈哈 最近整理了一下 xff0c 写下这篇文章分享小编的思路 能力知识水平有限 xff0c 欢迎各位大佬前来指教 o
  • playwright 爬虫使用

    官方文档 xff1a Getting started Playwright Python 参考链接 xff1a 强大易用 xff01 新一代爬虫利器 Playwright 的介绍 目录 安装 基本使用 代码生成 AJAX 动态加载数据获取