web自动化 -- pyppeteer

news2025/1/11 11:46:42

由于Selenium流行已久,现在稍微有点反爬的网站都会对selenium和webdriver进行识别,网站只需要在前端js添加一下判断脚本,很容易就可以判断出是真人访问还是webdriver。虽然也可以通过中间代理的方式进行js注入屏蔽webdriver检测,但是webdriver对浏览器的模拟操作(输入、点击等等)都会留下webdriver的标记,同样会被识别出来,要绕过这种检测,只有重新编译webdriver,麻烦自不必说,难度不是一般大。

 pyppeteer简介

由于Selenium具有这些严重的缺点。pyperteer成为了爬虫界的又一新星。

相比于selenium具有以下特点:

异步加载

速度快

具备有界面/无界面模式

伪装性更强不易被识别为机器人

同时可以伪装手机平板等终端

------------------->>>>

虽然支持的浏览器比较单一,但在安装配置的便利性和运行效率方面都要远胜selenium。

pyppeteer无疑为防爬墙撕开了一道大口子,针对selenium的淘宝、美团、文书网等网站,目前可通过该库使用selenium的思路继续突破,毫不费劲。

Pyppeteer是一个基于Python的浏览器自动化库,它使用了Puppeteer(谷歌开发的Node.js工具)的思路,通过JavaScript代码操纵Chrome浏览器完成数据爬取和Web程序自动测试等任务。Pyppeteer使用Python异步协程库asyncio,可以整合Scrapy进行分布式爬虫。

在Pyppeteer中,实际上背后有一个类似Chrome浏览器的Chromium浏览器在执行一些动作进行网页渲染。Chromium是谷歌为了研发Chrome而启动的项目,是完全开源的。二者基于相同的源代码构建,功能上基本没有太大区别。

总之,Pyppeteer依赖于Chromium这个浏览器来运行的。

pyppeteer安装及配置

由于 Pyppeteer 采用了 Python 的 async 机制,所以其运行要求的 Python 版本为 3.5 及以上。

第一步:在python中安装pyppeteer第三库

安装方式很简单,命令行 pip 安装即可。

pip3 install pyppeteer

或者直接在IDE中进行安装:

 第二步:输入以下两行代码

import pyppeteer
print(pyppeteer.chromium_downloader.chromiumExecutable)

记住打印结果中圈出的数字,这是chromium的borwser驱动版本号

 第三步:去下载对应版本的chromium的borwser

在这里使用的是淘宝镜像中的chromium
进入这个网址:CNPM Binaries Mirror

选择对应系统和对应的版本(我这里是windows系统,选择了我系统默认的588429) 

第四步:borwser驱动下载之后,将文件解压,放入上面pycharam中指定的路径中

也就是‘C:/Users/xiaohuamiao/AppData/Local/pyppeteer/pyppeteer/local-chromium/588429/chrome-win32/chrome.exe’这个路径;

需要手动在/pyppeteer/pyppeteer/文件下新建‘local-chromium’的文件夹、再新建'588429'的文件夹,然后将解压的文件'chrome-win32'放在‘588429’这个文件下

第五步:在python的库管理文件夹site-packages中pyppeteer文件:

进入chromium_downloader.py文件并打开修改代码:

这里是什么系统的就改什么后面的,我是windows,所以改windows的;

还有要注意,一定是要把https改成http,不然会报ssl的错 

#修改后代码:
downloadURLs = {
    'linux': f'{BASE_URL}/Linux_x64/{REVISION}/chrome-linux.zip',
    'windows': f'http://cdn.npm.taobao.org/dist/chromium-browser-snapshots/Mac/588429/chrome-win32.zip',
    'win32': f'{BASE_URL}/Win/{REVISION}/{windowsArchive}.zip',
    'win64': f'{BASE_URL}/Win_x64/{REVISION}/{windowsArchive}.zip',
}

第六步:在pycharm中执行安装:

import pyppeteer.chromium_downloader
pyppeteer.chromium_downloader.download_chromium()

等待安装、显示安装100%即可

验证一下,是否安装成功:在cmd中再次pyppeteer-install,出现以下提示,说明安装成功:


pyppeteer的使用

pyppeteer的用法与Selenium基本一致,这里就不再一一介绍了

滑动验证登陆demo

在上一篇Selenium的滑动验证登陆demo中,web自动化 -- selenium及应用-CSDN博客

使用opencv简单快捷实现了计算缺口图片在背景图中的距离,但是由于没有进行拟人化处理,导致太快滑动对接上,从而被京东识别到是爬虫程序,呗拦截了,这里继续使用pyppeteer,以及做一下拟人化处理,进行完整的滑动验证到登陆:

完整代码如下:

import random
from pyppeteer import launch
import asyncio
import cv2
from urllib import request


async def get_track():
    background = cv2.imread("background.png", 0)
    gap = cv2.imread("gap.png", 0)

    res = cv2.matchTemplate(background, gap, cv2.TM_CCOEFF_NORMED)
    value = cv2.minMaxLoc(res)[2][0]
    print(value)
    return value * 242 / 360


async def main():
    browser = await launch({
        "headless": False,  # headless指定浏览器是否以无头模式运行,默认是True。
        "args": ['--window-size=1366,768'],
    })
    # 打开新的标签页
    page = await browser.newPage()
    # 设置页面大小一致
    await page.setViewport({"width": 1366, "height": 768})
    # 访问主页
    await page.goto('https://passport.jd.com/new/login.aspx?')

    # evaluate()是执行js的方法,js逆向时如果需要在浏览器环境下执行js代码的话可以利用这个方法
    # js为设置webdriver的值,防止网站检测
    # await page.evaluate('''alert("马上输入用户名密码了!")''')
    # await page.evaluate('''() =>{ Object.defineProperties(navigator,{ webdriver:{ get: () => false } }) }''')
    # await page.screenshot({'path': './1.jpg'})   # 截图保存路径

    # 模拟输入用户名和密码,输入每个字符的间隔时间delay ms
    await page.type("#loginname", '324534534@qq.com', {
        "c": random.randint(30, 60)
    })
    await page.type("#nloginpwd", '345653332', {
        "delay": random.randint(30, 60)
    })

    # page.waitFor 通用等待方式,如果是数字,则表示等待具体时间(毫秒): 等待2秒
    await page.waitFor(2000)
    await page.click("div.login-btn")
    await page.waitFor(2000)
    # page.jeval(selector,pageFunction)#定位元素,并调用js函数去执行
    img_src = await page.Jeval(".JDJRV-bigimg > img", "el=>el.src")
    temp_src = await page.Jeval(".JDJRV-smallimg > img", "el=>el.src")

    request.urlretrieve(img_src, "background.png")
    request.urlretrieve(temp_src, "gap.png")

    # 获取gap的距离
    distance = await get_track()
    """
        # Pyppeteer 三种解析方式
        Page.querySelector()  # 选择器
        Page.querySelectorAll()
        Page.xpath()  # xpath  表达式
        # 简写方式为:
        Page.J(), Page.JJ(), and Page.Jx()
        """
    el = await page.J("div.JDJRV-slide-btn")
    # 获取元素的边界框,包含x,y坐标
    box = await el.boundingBox()
    await page.hover("div.JDJRV-slide-btn")
    await page.mouse.down()
    # steps 是指分成几步来完成,steps越大,滑动速度越慢
    await page.mouse.move(box["x"] + distance + random.uniform(30, 33), box["y"], {"steps": 100})
    await page.waitFor(1000)
    await page.mouse.move(box["x"] + distance + 29, box["y"], {"steps": 100})
    await page.mouse.up()
    await page.waitFor(2000)

    await asyncio.sleep(3600)

if __name__ == '__main__':
    asyncio.run(main())

代码执行后,如下:

因为我输入的账号和密码都是错误的,所以滑块验证成功之后,得到响应提示账号密码不匹配

说明登陆已经发送成功了

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

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

相关文章

自然语言处理:电脑如何理解我们的语言?

☁️主页 Nowl 🔥专栏《机器学习实战》 《机器学习》 📑君子坐而论道,少年起而行之 ​ 文章目录 ​编辑 常见方法 1.基于词典的方法 2.基于计数的方法 基于推理的方法 Bert input_ids attention_mask token_type_ids 结语 在广…

英伟达狂卖50万台GPU!AI爆火背后,是显卡的争夺

据市场跟踪公司Omdia的统计分析,英伟达在第三季度大约卖出了50万台H100和A100 GPU! 此前,Omdia通过英伟达第二季度的销售额,估计其大概卖出了900吨GPU! 大语言模型火爆的背后,英伟达建立起了强大的显卡帝…

分治-归并排序

文章目录 🌞315. 计算右侧小于当前元素的个数🌈1. 题目⛅2. 算法原理🪐3. 代码实现 🌕493. 翻转对🌠1. 题目⭐2. 算法原理🌟3. 代码实现 🌞315. 计算右侧小于当前元素的个数 🌈1. 题…

深圳找工作的网站

深圳吉鹿力招聘网是一家在深圳做的比较好的招聘网站,提供一站式的专业人力资源服务,包括网络招聘、校园招聘、猎头服务、招聘外包、企业培训以及人才测评等。深圳吉鹿力招聘网在深圳的口碑相当好,是一个很好的选择。 深圳找工作用 吉鹿力招聘…

构建高效预约系统:深入探讨预约系统源码的设计和实现

随着各行业对高效资源利用和便捷服务的需求不断增加,预约系统成为了解决问题的有效工具。在这篇文章中,我们将深入研究预约系统源码的设计原则,并展示一些基本的技术代码,帮助读者更好地理解预约系统的实现方式。 设计原则 1. …

嘴尚绝卤味:健康卤味,未来餐饮市场的新星

随着人们生活水平的提高,对于吃的要求也越来越高。尤其是在快节奏的现代社会中,健康饮食成为了越来越多人的追求。在这种背景下,健康卤味这一新兴食品品类应运而生,成为了餐饮市场的新宠儿。 一、健康卤味的崛起 传统的卤味制作过…

「Verilog学习笔记」占空比50%的奇数分频

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网 根据题意7分频,实际上是第一次电平变化经历了4个上升沿3个下降沿,第二次电平变化是4个下降沿3个上升沿,所以用两个计数器就行了。分别对…

Git:修改最近一次 Git 提交的描述,使用 --amend 选项

目录 步骤1. 使用编辑器修改最近一次提交的描述 git commit --amend2. 在编辑器中修改描述3. 保存修改4. 如果提交包含文件修改5. 强制推送(如果已经推送到远程仓库) 步骤 1. 使用编辑器修改最近一次提交的描述 git commit --amend git commit --amend…

软考初级、中级、高级怎么选?

本年度的PMP考试已经结束啦,对于刚考完的威宝和已经通过考试的威班们来说,刚开始接触PMP认证的时候在科普阶段有看到过“软考”的字眼。什么是软考,它主要考什么?通常用于哪些方面?软考又和PMP有什么关系?如…

备战春招——12.3 算法

哈希表 哈希表主要是使用 map、unordered_map、set、unorerdered_set、multi_,完成映射操作,主要是相应的函数。map和set是有序的,使用的是树的形式,unordered_map和unordered_set使用的是散列比表的,无序。 相应函数…

CityEngine2023 shp数据城市与路网三维模型并导入UE5

目录 0 引言1 城市和道路数据获取1.1 常用方法1.2 OSM数据获取1.3 OSM数据格式1.3.1 所有格式1.3.2 Shapefile格式 2 实践2.1 导入数据(.shp)2.2 构建三维模型2.3 将模型导入UE5 🙋‍♂️ 作者:海码007📜 专栏&#xf…

mac M1芯片上编译车载aaos

一:mac上需要磁盘分区(支持大小写) mac分区: 在 Mac 上的“磁盘工具”中将物理磁盘分区 - 官方 Apple 支持 (中国) 注意:盘符名字不能有空格否则编译aaos时报错 注意:盘符名字不能有空格否则编译aaos时报…

2023.12.2 关于 Spring AOP 详解

目录 Spring AOP Spring AOP 常见使用场景 AOP 组成 切面(类) 切点(方法) 通知 ​编辑 前置通知(Before) 后置通知(After) 返回通知(AfterReturning&#xff0…

认识DHT11温湿度传感器并制作温度报警器

Arduino UNO Arduino IDE开发环境 Arduino DHT11温湿度传感器 ​ 一、认识Arduino的DHT11温度湿度传感器 DHT传感器由电容式湿度传感器和热敏电阻两部分组成。除此之外,模块内部还有一些模拟信号到数字信号的转换,将温度湿度以数字信号的方式输…

EPS地形图绘制技巧--快捷键

如何导入外业点数据? (1)打开EPS软件,新建一个工程。如下: (2)在【文件】-【输入输出】-【调入坐标文件数据】中,调入测量点数据,如下: (3&#…

asp.net_sql2008公司人事管理系统

登录模块 流程图: ◆ 职工输入用户名、密码并选择登录身份,根据选择的身份做不同的操作 ◎ 若选择的是“职工”,系统将查询数据库中的用户表Users的记录,用户名密码核对正确后加载职工主界面; ◎ 若选择的是“管理员…

Find My扩展坞|苹果Find My技术与扩展坞结合,智能防丢,全球定位

扩展坞又称端口复制器,是专为笔记本电脑设计的一种外置设备。通过复制甚至扩展笔记型计算机的端口,可使笔记本电脑与多个配件或外置设备(如电源适配器、网线、鼠标、外置键盘、打印机及外置显示器)方便的一站式连接。随着全球经济…

Perplexity发布两款LLM模型:pplx-7b-online和pplx-70b-online 可利用实时互联网数据查询

Perplexity AI,一家创新的人工智能初创公司,近日推出了一项能够改变信息检索系统的解决方案。该公司推出了两款新的大语言模型(LLMs),分别是pplx-7b-online和pplx-70b-online,标志着首次通过API公开访问在线…

C# OpenVINO 模型信息查看工具

目录 效果 支持模型 项目 代码 下载 C# OpenVINO 模型信息查看工具 效果 支持模型 ONNX format (*.onnx) PDPD (*.pdmodel) TF (*.pb) TFLite (*.tflite) 项目 代码 using Sdcb.OpenVINO; using System; using System.Collections.Generic; using System.Text; using…

docker部署typecho博客

文章目录 1.安装git2.安装compose3.拉取仓库4.创建目录5.配置文件修改6.启动容器7.修改MYSQL数据库8.安装成功9.参考GitHub文档 1.安装git 安装git yum -y install git2.安装compose (docker安装参考:docker基本知识) 确保已经安装了 Doc…