Pypputeer自动化

Pyppeteer简介

pyppeteer 是 Python 语言的一个库,它是对 Puppeteer 的一个非官方端口,Puppeteer 是一个 Node 库,Puppeteer是Google基于Node.js开发的一个工具,它提供了一种高层次的 API 来通过 DevTools 协议控制 Chrome 或 Chromium。pyppeteer 可以用来进行网页自动化处理,支持页面抓取、表单提交、UI测试、JavaScript执行等功能,非常适合用于网页爬虫或自动化测试。

在pyppeter中,实际上它背后有一个类似Chrome浏览器的Chromium浏览器在执行一些动作进行网页渲染。

Chrome与Chromium渊源。两款浏览器内核是一样的,实现方式也是一样,可以认为是开发版和正式版的区别,功能基本没有太大的区别。

环境安装

pip install pyppeteer

注意:支持异步需要3.5以上的解释器

import pyppeteer
print(pyppeteer.executablePath()) #查看chromium存放路径
print(pyppeteer.__chromium_revision__) #查看版本号

官方文档:

API Reference — Pyppeteer 0.0.25 documentationicon-default.png?t=N7T8https://miyakogi.github.io/pyppeteer/reference.html

测试样例

from pyppeteer import launch
import asyncio
import time
async def main():
    # 启动一个浏览器(headless默认是无头即无界面浏览器,改为false有界面)
    browser = await launch(headless=False,args=['--disable-infobars','--window-size=1920,1080'])
    # 创建一个页面
    page = await browser.newPage()
    # 设置页面视图大小
    await page.setViewport({'width':1900,'height':1080})
    # 跳转到百度
    await page.goto('https://www.baidu.com')
    # 输入要查询的关键字,type第一个参数是元素的selector(css),第二个是要输入的关键字
    await page.type('#kw','pyppeteer')
    # 点击提交按钮
    await page.click('#su')
    time.sleep(30)
    await browser.close()
# 启动异步任务
asyncio.get_event_loop().run_until_complete(main())

基本配置

基本参数

params = {
    # 关闭无头浏览器
    "headless":False,
    "dumpio":True,#防止浏览器卡住
    r"userDataDir":"./cache-data",  #用户文件地址
    "args":[
        '--disable-infobars',       #关闭自动化提示框
        '--window-size=1920,1080',  #设置窗口大小
        '--log-level=30',           #日志保存等级,建议设置越小越好,要不然生成的日志占用的空间会很大30为waring级别
        '--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
        '--no-sandbox',             #关闭沙盒模式
        '--start-maximized',        #窗口最大化模式
        '--proxy-server=http://localhost:1080' #代理
    ]
}

设置窗口

#UI模式 闭频警告
browser = await launch(headless = False,args=['--disable-infobars'])
page = await browser.newPage()
await page.setViewport({'width':1200,'height':800})

添加头部

网页截图

page.screenshot(path='example.png')

伪装浏览器绕过检测

object.defineProperty()方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。

await page.evaluateOnNewDocument('()=>{Object.defineProperty(navigator, "webdriver", { get: () => false }); }');

案例演示触发JS

async def main():
    # 启动一个浏览器
    browser = await pyppeteer.launch(headless = False,args = ['--disable-infobars','--window-size=1920,1080'])
    # 打开一个新页面
    page = await browser.newPage()
    # 添加用户代理
    await page.setUserAgent('Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36')
    await page.evaluateOnNewDocument('()=>{Object.defineProperty(navigator, "webdriver", { get: () => false }); }')
    await page.goto('https://www.zhipin.com/web/geek/job?query=%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90&city=100010000&page=')
    dimensions = await page.evaluate('() => ({ cookie: document.cookie })')
    headers = {
        'User-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
        'Cookie':dimensions['cookie']
    }
    url = 'https://www.zhipin.com/web/geek/job?query=%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90&city=100010000&page='
    resp = requests.get(url=url,headers=headers)
    print(resp.text)
# 启动异步任务
asyncio.get_event_loop().run_until_complete(main())

滚动到页面底部

await page.evaluate(window.scrollBy(0,document.body.scrollHeight))

进阶使用

数据提取

获取属性

登录案例

import asyncio
from pyppeteer import launch

async def main():
    # 启动浏览器,headless=False 表示非无头模式,也就是浏览器界面是可见的
    browser = await launch(headless=False, args=['--disable-infobars', '--window-size=1920,1080'])
    # 开启一个新的浏览器标签页
    page = await browser.newPage()
    # 访问指定的URL
    await page.goto('https://www.captainbi.com/amz_login.html')
    # 设置视窗大小
    await page.setViewport(viewport={'width': 1356, 'height': 768})
    # 输入用户名
    await page.type('#username', '123456')
    # 输入密码,假定密码输入框的ID为'password'
    await page.type('#password', '123456')  # 请确保选择器正确对应到密码输入框
    # 单击登录按钮,假定按钮的ID为'submit'
    # 如果按钮没有ID,则需要提供正确的CSS选择器
    await page.click('#submit', options={'timeout': 3000})

# 运行 main 协程
asyncio.run(main())

综合案例

'''
抓取唯品会关于女性口红等数据
1搜索入口抓口红数据
2根据品牌做检索
3字段 原价-折扣价-品牌
4翻页
5保存入库
根据观察数据是动态加载。所以要使用自动化技术 把动态变静态 结合requests
'''
import requests
from lxml import etree
import pandas as pd
import asyncio
from pyppeteer import launch
from loguru import logger

class Wph(object):
    def __init__(self,url,name):
        self.url = url
        self.name = name
        self.headers = {
            'User-Agent':'aaqabbbccc'
        }
        self.session = requests.session()
        self.hadInone = lambda x:x[0] if x else ''
        self.browser = None
    async def main(self,url):

        # 打开一个浏览器
        self.browser = await launch()
        # 创建一个窗口
        page = await self.browser.newPage()
        # 访问对应的url
        await page.goto(url)
        text = await page.content()  # 返回页面html
        return text
    def spider(self):
        df = pd.DataFrame(columns=['品牌','标题','原价','现价','折扣'])
        # 发起请求
        res = self.session.get(self.url,params={'keyword':self.name},headers=self.headers,verify=False)
        html = etree.HTML(res.text)
        url_list = html.xpath('.//div[@class="c-filter-group-content"]/div[contains(@class,"c-filter-group-scroll-brand")]/ul/li/a/@href')

        # 迭代品牌URL地址
        for i in url_list:
            # 驱动浏览器请求
            page_html = asyncio.get_event_loop().run_until_complete(self.main('http:'+i))
            # 获取网页源代码
            page = etree.HTML(page_html)
            htmls = page.xpath('//section[@id="J_searchCatList"]/div')

            for h in htmls[1:]:
                # 品牌
                pinpai = self.hadInone(h.xpath('//div[contains(@class,"c-goods-item__name--two-line")]/text()'))
                # 标题
                title = self.hadInone(h.xpath('//div[contains(@class,"c-goods-item__name--two-line")]/text()'))
                # 原价
                y_price = self.hadInone(h.xpath('//div[contains(@class,"J-goods-item__market-price")]/text()'))
                # 卖价
                x_price = self.hadInone(h.xpath('//div[contains(@class,"c-goods-item__sale-price")]/text()'))
                # 折扣
                zk = self.hadInone(h.xpath('div//div[contains(@class,"c-goods-item__discount")]/text()'))
                logger.info(f'品牌{pinpai},标题{title},原价{y_price},现价{x_price},折扣{zk}')
                pro = {
                    '品牌':pinpai,
                    '标题':title,
                    '原价':y_price,
                    '现价':x_price,
                    '折扣':zk,
                }
                df = df.append([pro])
                print(pro)
        # df.to_excel('唯品会数据.xlsx',index=False)

        return df
    # def __del__(self):
    #     if self.browser:
    #         asyncio.get_event_loop().run_until_complete(self.browser.close())

if __name__=='__main__':
    url = 'https://category.vip.com/suggest.php'
    name = '香水'
    w = Wph(url,name)
    w.spider()

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

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

相关文章

#Pytorch 使用DDP训练第一轮,验证后第二轮卡住

问题:在使用DDP分布式训练的时候,在第一轮训练后验证结果,在第二轮开始时就卡住了。因为设置了dist.barrier(),所以只有第一个GPU跑了验证,在第二轮时只有第一个GPU的模型在,其他卡的模型都被阻塞住了。 解…

Linux下使用Docker部署MinIO实现远程上传

📑前言 本文主要是Linux下通过Docker部署MinIO存储服务实现远程上传的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是青衿🥇 ☁️博客首页:CSDN主页放风讲故事 &#…

在vue中使用echarts渲染地图,geo点击某个区域可高亮,取消

一、安装echarts npm install echarts --save二、main.js引入注册 import Vue from "vue";import * as echarts from "echarts";Vue.prototype.$echarts echarts;三、vue文件中使用echarts <template><div class"page-warp"><…

mysql原理--锁

1.解决并发事务带来问题的两种基本方式 上一章唠叨了事务并发执行时可能带来的各种问题&#xff0c;并发事务访问相同记录的情况大致可以划分为3种&#xff1a; (1). 读-读 情况&#xff1a;即并发事务相继读取相同的记录。 读取操作本身不会对记录有一毛钱影响&#xff0c;并不…

聚铭入选“2023中国数字安全能力图谱(精选版)”安全运营领域

近日&#xff0c;国内权威数字安全领域第三方调研机构数世咨询正式发布《2023年度中国数字安全能力图谱&#xff08;精选版&#xff09;》。聚铭网络作为国内领先的安全运营商&#xff0c;凭借在细分领域突出优势&#xff0c;成功入选该图谱“安全运营”领域代表厂商。 据悉&a…

6.4.2转换文件

6.4.2转换文件 利用Swf2VideoConverter2可以很方便地将Flash动画(*.swf)转换为其它的视频格式。 1&#xff0e;单击“添加”按钮&#xff0c;在弹出的下拉菜单中选择“添加文件”&#xff0c;在弹出的“Open Swf Files(打开Swf文件)”窗口中选择swf文件(如&#xff1a;那些花…

使用nginx搭建网页

一、实验要求 网站需求&#xff1a; 1.基于域名www.openlab.com可以访问网站内容为 welcome to openlab!!! 2.给该公司创建三个子界面分别显示学生信息&#xff0c;教学资料和缴费网站&#xff0c;基于www.openlab.com/student 网站访问学生信息&#xff0c;www.openlab.com…

element中Table表格控件单选、多选功能进一步优化

目录 一、代码实现1、 父组件2、子组件&#xff08;弹框&#xff09; 二、效果图 一、代码实现 1、 父组件 <template><div><!-- 用户选择嵌套弹框 --><el-dialog :close-on-click-modal"false" :close-on-press-escape"false" tit…

OPC UA 开源库编译方法及通过OPC UA连接西门S7-1200 PLC通信并进行数据交换

前言 在现代工业自动化领域&#xff0c;OPC UA&#xff08;开放性生产控制和统一架构&#xff09;是一种广泛应用的通信协议。本文将以通俗易懂的方式解释OPC UA的含义和作用&#xff0c;帮助读者更好地理解这一概念。 一、OPC UA的定义 OPC UA全称为“开放性生产控制和统一…

bgp--大AS分小AS

最后效果:r1能ping通r8,r4路由表有r1-r8环回,r4bgp路由表已优化 代码; [r1] ospf 1 router-id 1.1.1.1 area 0.0.0.0 network 1.1.1.1 0.0.0.0 network 12.1.1.1 0.0.0.0 bgp 64512 router-id 1.1.1.1 confederation id …

湖(岛屿)

from book&#xff1a;挑战程序设计竞赛

亿尚网:时尚电商告别红利时代回归常态未来将何去何从?

随着互联网技术的不断发展和普及&#xff0c;时尚电商行业在过去的十年里迅猛的增长&#xff0c;经历了前所未有的繁荣。然而近年来这个行业似乎已经迎来了一个转折点。曾经的高速增长和巨大利润已经逐渐消失&#xff0c;取而代之的是日益激烈的竞争和微薄的利润空间。这一切的…

TPU编程竞赛系列|第八届集创赛“算能杯“报名开启!

近日&#xff0c;第八届全国大学生集成电路创新创业大赛正式开幕&#xff0c;"算能杯"以 基于TPU处理器的边缘计算系统设计 为赛题&#xff0c;围绕算能提供的多款TPU硬件&#xff0c;展开软硬件协同设计&#xff0c;创新开发算法及探索新兴应用。我们诚邀全国高校的…

三极管这个功能比“放大”还常用?

同学们大家好&#xff0c;今天我们继续学习杨欣的《电子设计从零开始》&#xff0c;这本书从基本原理出发&#xff0c;知识点遍及无线电通讯、仪器设计、三极管电路、集成电路、传感器、数字电路基础、单片机及应用实例&#xff0c;可以说是全面系统地介绍了电子设计所需的知识…

杜卡迪Panigale v4 SP2、Street Fighter v4 SP正式发布,购车送GP观赛

最新款杜卡迪的Panigale v4 SP2、Street Fighter v4 SP国内正式上市&#xff0c;售价分别是382500元和310500元&#xff0c;Panigale售价比老款降低了2.55万元&#xff0c;而街霸的SP版则是国内首次上市。 SP版一直都是杜卡迪的限量款&#xff0c;标榜着高性能、高配置&#xf…

运放【之噪声】

电流噪声和电压噪声 我们一般评估噪声&#xff0c;还看对输出端噪声电压的贡献&#xff0c;因为电流乘以电阻等于电压&#xff0c;因此&#xff0c;最终的噪声大小还跟电路中电阻的取值有很大关系。显然&#xff0c;电阻越大&#xff0c;那么噪声电压就越大。反之电阻越小&…

HarmonyOS4.0系列——07、自定义组件的生命周期、路由以及路由传参

自定义组件的生命周期 允许在生命周期函数中使用 Promise 和异步回调函数&#xff0c;比如网络资源获取&#xff0c;定时器设置等&#xff1b; 页面生命周期 即被Entry 装饰的组件生命周期&#xff0c;提供以下生命周期接口&#xff1a; onPageShow 页面加载时触发&#xff…

烟火检测AI边缘计算智能分析网关V4如何通过ssh进行服务器远程运维

智能分析网关V4是一款高性能、低功耗的AI边缘计算硬件设备&#xff0c;它采用了BM1684芯片&#xff0c;集成高性能8核ARM A53&#xff0c;主频高达2.3GHz&#xff0c;并且INT8峰值算力高达17.6Tops&#xff0c;FB32高精度算力达到2.2T&#xff0c;每个摄像头可同时配置3种算法&…

【LeetCode热题100】【子串】滑动窗口最大值

题目 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1&#xff1a; 输入&#xff1a;nums [1,3,-1,-3,5,3,6,7], …

像操作本地文件一样操作linux文件 centos7环境下samba共享服务搭建详细教程

1.安装dnf yum -y install dnf 2.安装samba dnf install samba -y 3.配置 3.1创建并设置用户信息 #创建用户 useradd -M -s /sbin/nologin samba echo 123|passwd --stdin samba mkdir /home/samba chown -R samba:samba /home/samba smbpasswd -a samba smaba设置密码示…