Pypputeer自动化

news2024/12/25 9:30:37

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()

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

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

相关文章

【XTuner 大模型单卡低成本微调实战】学习笔记

参考学习教程【XTuner 大模型单卡低成本微调实战】 理论 Finetune简介 大语言模型 微调模式 增量预训练 指令跟随微调 LoRA和QLoRA Xtuner介绍 实战 自定义微调 用 Medication QA 数据集进行微调 将数据转为 XTuner 的数据格式 目标格式:(.jsonL) 写提示词请C…

清晰光谱空间:全自动可调波长系统的高光谱成像优势

高光谱成像技术 高光谱成像技术是一种捕获和分析宽波长信息的技术,能够对材料和特征进行详细的光谱分析和识别。高光谱成像技术的实现通过高光谱相机,其工作原理是使用多个光学传感器或光学滤波器分离不同波长的光,并捕获每个波段的图像&…

CSS笔记II

CSS第二天笔记 复合选择器后代选择器子选择器并集选择器交集选择器伪类选择器 三大特性继承性层叠性优先级优先级-叠加计算规则 Emmet写法 背景属性背景图平铺方式位置缩放固定复合属性 显示模式转换显示模式 复合选择器 定义:由两个或多个基础选择器,通…

16.鸿蒙HarmonyOS App(JAVA)滑块组件Slider与评级组件Rating

16.鸿蒙HarmonyOS App(JAVA)滑块组件Slider与评级组件Rating ability_main.xml <?xml version"1.0" encoding"utf-8"?> <DirectionalLayoutxmlns:ohos"http://schemas.huawei.com/res/ohos"ohos:height"match_parent"oh…

格密码基础:最短格基与KZ基

目录 一. 介绍 二. 最短向量长度 三. GapSVP问题的困难性 四. 如何解决近似SVP问题 五. 推荐论文 一. 介绍 KZ基的全称叫Korkine-Zolotarev格基&#xff0c;KZ基也被称之为最短的格基。接下来我们介绍什么是KZ基&#xff1f; 给定任意秩为n的格&#xff0c;首先第一步寻…

解决Python安装库时出现的Requirement already satisfied问题

uirement already satisfied的问题当我们用pip install 库名时&#xff0c;出现了下面 Requirement already satisfied WARNING: Ignoring invalid distribution -ip 的问题 对于这样的问题&#xff0c;解决办法就是在 pip install 后加 - -target你所要添加的库文件地址(注意…

网络知识梳理:HTTP和HTTPS

HTTP&#xff08;超文本传输协议&#xff09;和HTTPS&#xff08;安全超文本传输协议&#xff09;是两种用于在互联网上传输数据的协议&#xff0c;主要用于网页浏览。它们在功能上相似&#xff0c;但在安全性方面有重要区别&#xff1a; 1.HTTP 定义&#xff1a;HTTP是一种用…

Flutter编译报错Connection timed out: connect

背景&#xff1a;用Android Studo 创建了Flutter项目&#xff0c;编译运行报错java.net.ConnectException: Connection timed out: connect 我自己的环境&#xff1a; windows11 Android Studio Flutter 截图如下&#xff1a; 将错误日志展开之后&#xff1a; Exception…

小白准备蓝桥杯之旅(c/c++b组)

前言&#xff1a;省赛获奖比例高达百分之60,只要比一半的人努力&#xff0c;你就能大概率获奖。 寒假做的3件事 1.稳基础 熟练掌握基础语法部分&#xff0c;c比c多个stl库优势&#xff0c;c语言的同学需要会实现c中stl库部分 2.刷真题 大概比赛前30天&#xff0c;坚持每天做…

SD-WAN解决跨国公司海外工厂网络安全问题

在跨境业务蓬勃发展的今天&#xff0c;越来越多的大型企业出于人力成本的考虑&#xff0c;在人力成本较低的发展中国家建立工厂。然而&#xff0c;传统基于路由器的网络架构已无法为这些跨国企业提供可靠的安全网络。那么&#xff0c;如何解决跨国企业海外工厂的网络难题呢&…

JAVA基础-----认识异常

文章目录 1. 异常的概念与体系结构1.1 异常的概念1.2 异常的体系结构1.3 异常的分类 2. 异常的处理2.1 防御式编程2.2 异常的抛出2.3 异常的捕获2.3.1 异常声明throws2.3.2 try-catch捕获并处理2.3.3 finally 2.4 异常的处理流程 3. 自定义异常类 1. 异常的概念与体系结构 1.1…

JavaWeb:Request Response

文章目录 1、Request和Response的概述2、Request继承体系3、Request获取请求数据3.1、获取请求行数据3.2、获取请求头3.3、获取请求体 4、Request通用方式请求参数5、POST请求参数乱码解决6、Request请求转发7、Response的响应状态码和响应头8、Response重定向9、Response响应字…

关于linux 救援模式出现xfs 文件系统挂载报 bad supperblock

关于linux 救援模式出现xfs 文件系统挂载报 bad supperblock 一种情况说明 挂载ISO文件进入救援模式&#xff0c;无法挂载XFS文件系统&#xff0c;xfs_repair也是报未知的超级块 使用 xfs_info 可以取到 xfs文件系统分区信息 xfs_db -c “sb 0” -c “p” $your_xfs_dev 也能…

2024年【建筑电工(建筑特殊工种)】考试报名及建筑电工(建筑特殊工种)免费试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 建筑电工(建筑特殊工种)考试报名是安全生产模拟考试一点通总题库中生成的一套建筑电工(建筑特殊工种)免费试题&#xff0c;安全生产模拟考试一点通上建筑电工(建筑特殊工种)作业手机同步练习。2024年【建筑电工(建筑特…

HarmonyOS 转场动画 ForEach控制

本文 我们继续说组件的专场特效 上文 HarmonyOS 转场动画 我们通过if控制了转场效果 本文 我们通过 ForEach 控制它的加载和删除 这时候就有人会好奇 ForEach 怎么控制删除呢&#xff1f; 很简单 循环次数不同 例如 第一次 10个 第二次 5个 那么后面的五个就相当于删除啦 我们…

ubuntu开放ssh服务

&#x1f4d1;前言 本文主要是【ubuntu】——ubuntu开放ssh服务的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每日一…

由于找不到d3dcompiler_43.dll缺失,无法打开软件的解决方法分享

d3dcompiler43.dll是什么文件&#xff1f;为什么会出现丢失的情况&#xff1f;又该如何解决呢&#xff1f;本文将详细介绍d3dcompiler43.dll的作用和影响&#xff0c;并提供6个有效的解决方法。 一、d3dcompiler43.dll是什么文件&#xff1f; d3dcompiler43.dll是DirectX SDK…

Linux网络--- SSH服务

一、ssh服务简介 1、什么是ssh SSH&#xff08;Secure Shell&#xff09;是一种安全通道协议&#xff0c;主要用来实现字符界面的远程登录、远程复制等功能。SSH 协议对通信双方的数据传输进行了加密处理&#xff0c;其中包括用户登录时输入的用户口令&#xff0c;SSH 为建立在…

linux 更新镜像源

打开终端&#xff0c;备份一下旧的 源 文件&#xff0c;以防万一 cd /etc/apt/ ls sudo cp sources.list sources.list.bak ls然后打开清华大学开源软件镜像站 搜索一下你的linux发行版本&#xff0c;我这里是ubuntu发行版本 点击这个上面图中的问号 查看一下自己的版本号&a…

Docker之nacos的安装和使用

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《Docker之Dockerfile构建镜像》。&#x1f3af;&…