web自动化 -- pyppeteer

由于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.mfbz.cn/a/214546.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【算法套路】(数组中)等价转换

文章目录 例题——2488. 统计中位数为 K 的子数组⭐【套路】子数组统计问题常用技巧:等价转换 相似题目列表面试题 17.05. 字母与数字525. 连续数组1124. 表现良好的最长时间段解法1解法2——利用单调栈 例题——2488. 统计中位数为 K 的子数组⭐ https://leetcode…

了解大模型 RAG (Retrieval-Augmented Generation):大模型外挂知识库 (检索增强技术)

本心、输入输出、结果 文章目录 了解大模型 RAG (Retrieval-Augmented Generation):大模型外挂知识库 (检索增强技术)前言什么是检索增强技术 RAG (Retrieval-Augmented Generation)检索增强技术…

分享几个电视颜色测试图形卡

介绍 本文分享几个常见的电视颜色测试图形卡和一段matlab程序,完成JPG转FPGA烧写文件,便于把彩色图片预装载到FPGA内。 电视颜色测试图形卡 一种专业检测电视显示效果的工具。它通常由一张卡片和一些色块组成,可以根据标准色彩空间和颜色渐…

数据结构 | 查漏补缺之ASL、

目录 ASL 情形之一:二分查找 线索二叉树 哈夫曼树 大根堆 邻接表&邻接矩阵 ASL 参考博文 关于ASL(平均查找长度)的简单总结_平均查找长度asl-CSDN博客 情形之一:二分查找 线索二叉树 参考博文 线索二叉树(线索链表遍历,二叉树…

『亚马逊云科技产品测评』活动征文|基于亚马逊云EC2搭建私有网盘 Nextcloud系统

授权声明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 Developer Centre, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道 亚马逊EC2云服务器(Elastic Compute Cloud)是亚马…

[架构之路-256]:目标系统 - 设计方法 - 软件工程 - 软件设计 - 架构设计 - 软件系统不同层次的复用与软件系统向越来越复杂的方向聚合

目录 前言: 一、CPU寄存器级的复用:CPU寄存器 二、指令级复用:二进制指令 三、过程级复用:汇编语言 四、函数级复用:C语言 五、对象级复用:C, Java, Python 六、组件级复用 七、服务级复用 八、微…

leetcode 202 快乐数

leetcode 202 快乐数 题目题解代码 题目 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为: 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变…

【尾递归】

尾递归 如果函数在返回前才进行递归调用,则该函数可以被编译器或解释器优化,使其在空间效率上与迭代相当。这种情况被称为「尾递归 tail recursion」。 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此…

Android Init系统:引领设备启动的先锋

Android Init系统:引领设备启动的先锋 引言 Init系统是一个操作系统启动的必要组件,负责在启动时初始化所有系统资源、服务和应用程序。在Android设备中,Init系统起到了至关重要的作用,它是启动过程中的第一个进程,负…

C++分数计算器

C分数计算器各种分数计算类型都能计算 代码:https://mbd.pub/o/bread/ZZeZk5hx 一 目的 (1)定义一个整数类。 定义一个分数类,由整数类派生。能对分数进行各种计算和输入/输出。可进行分数的加、减、乘和除法等四则运算。 流程…

YOLOv8 区域计数 | 入侵检测 | 人员闯入

大家好,昨天的 YOLOv8 新增加了一个功能,区域计数,用这个功能我们能实现很多的任务, 比如入侵检测,流量统计,人员闯入等,使用方式也非常的方便,但是一定要使用最新版的 YOLOv8 代码(2023/12/03更新的代码)。 低版本是不具备这个功能的,上面是演示效果。 使用非常的方…

Leetcode2661. 找出叠涂元素

Every day a Leetcode 题目来源:2661. 找出叠涂元素 解法1:哈希 题目很绕,理解题意后就很简单。 由于矩阵 mat 中每一个元素都不同,并且都在数组 arr 中,所以首先我们用一个哈希表 hash 来存储 mat 中每一个元素的…

C语言中的动态内存管理

在C语言中,动态内存管理是通过一系列的标准库函数来实现的,这些函数包括malloc, free, calloc 和 realloc。它们允许程序在运行时动态地分配和释放内存,这是管理复杂数据结构(如链表、树等)时非常有用的功能。 为什么…

软件生命周期四个阶段SDLC

软件产品生命周期:指软件产品研发全部过程、活动和任务的结构框架。 产品的生命周期一般包括四个阶段:引入期、成长期、成熟期和衰退期,在不同的阶段中,市场对产品的反应不同,其销售特点不同,因而产品管理的…

【强化学习算法】Q-learning原理及实现

实现代码github仓库:RL-BaselineCode 代码库将持续更新,希望得到您的支持⭐,让我们一起进步! 文章目录 1. 原理讲解1.1 Q值更新公式1.2 ε-greedy随机方法 2. 算法实现2.1 算法简要流程2.2 游戏场景2.3 算法实现 3. 参考文章 1. 原…

数据挖掘实战-基于word2vec的短文本情感分析

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

专业爬虫框架 -- scrapy初识及基本应用

scrapy基本介绍 Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速、简单、可扩展的方式从网站中提取所需的数据。 但目前Scrapy的用途十分广泛,可用于如数据挖掘、监测和自动化测试等领域…

HCIP —— 双点重发布 + 路由策略 实验

目录 实验拓扑: 实验要求: 实验配置: 1.配置IP地址 2.配置动态路由协议 —— RIP 、 OSPF R1 RIP R4 OSPF R2 配置RIP、OSPF 双向重发布 R3配置RIP、OSPF 双向重发布 3.查询路由表学习情况 4.使用路由策略控制选路 R2 R3 5.检…

【Google2023】利用TiDE进行长期预测实战(时间序列密集编码器)

一、本文介绍 大家好,最近在搞论文所以在研究各种论文的思想,这篇文章给大家带来的是TiDE模型由Goggle在2023.8年发布,其主要的核心思想是:基于多层感知机(MLP)构建的编码器-解码器架构,核心创…

GEE:梯度卷积

作者:CSDN @ _养乐多_ 本文将介绍在 Google Earth Engine(GEE)平台上,进行梯度卷积操作的代码框架、核心函数和多种卷积核,比如 Roberts、Prewitt、Sobel、各向同性算子、Compass算子、拉普拉斯算子、不同方向线性检测算子等。 结果如下图所示, 文章目录 一、常用的梯度…
最新文章