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 launchasync def main():# 启动浏览器,headless=False 表示非无头模式,也就是浏览器界面是可见的browser = await launch(headless=False, args=['--disable-infobars', '--window-size=1920,1080'])# 开启一个新的浏览器标签页page = await browser.newPage()# 访问指定的URLawait 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 loggerclass Wph(object):def __init__(self,url,name):self.url = urlself.name = nameself.headers = {'User-Agent':'aaqabbbccc'}self.session = requests.session()self.hadInone = lambda x:x[0] if x else ''self.browser = Noneasync def main(self,url):# 打开一个浏览器self.browser = await launch()# 创建一个窗口page = await self.browser.newPage()# 访问对应的urlawait page.goto(url)text = await page.content()  # 返回页面htmlreturn textdef 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.mzph.cn/news/634092.shtml

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

相关文章

分类预测 | Matlab实现ISSA-SVM基于多策略混合改进的麻雀搜索算法优化支持向量机的数据分类预测

分类预测 | Matlab实现ISSA-SVM基于多策略混合改进的麻雀搜索算法优化支持向量机的数据分类预测 目录 分类预测 | Matlab实现ISSA-SVM基于多策略混合改进的麻雀搜索算法优化支持向量机的数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 基于多策略混合改进的麻…

docker报错 missing signature key 无法拉去镜像,yum install docker-ce没有可用软件包 解决办法

错误场景描述 今天项目需要用到minio,我打算在虚拟机中使用docker装一个,可是发现当我docker pull minio/minio的时候,报错了missing signature key 这个报错提示的让人很蒙,翻译过来的意思是 “缺少签名密钥” ?&am…

用 Python 制作可视化 GUI 界面,一键实现自动分类管理文件!

经常杂乱无章的文件夹会让我们找不到所想要的文件,因此小编特意制作了一个可视化GUI界面,通过输入路径一键点击实现文件分门别类的归档。 不同的文件后缀归类为不同的类别 我们先罗列一下大致有几类文件,根据文件的后缀来设定,大…

GaussDB与openGauss有什么相同和不同?

众所周知,GaussDB是华为自主创新研发的分布式关系型数据库,为企业提供功能全面、稳定可靠、扩展性强、性能优越的企业级数据库服务,openGauss是开源数据库,两者之间又是什么样的关系,有什么相同和不同,让我…

如何使用Portainer部署web站点并实现无公网ip远程访问

文章目录 前言1. 安装Portainer1.1 访问Portainer Web界面 2. 使用Portainer创建Nginx容器3. 将Web静态站点实现公网访问4. 配置Web站点公网访问地址4.1公网访问Web站点 5. 固定Web静态站点公网地址6. 固定公网地址访问Web静态站点 前言 Portainer是一个开源的Docker轻量级可视…

k8s的PV,PVC自动创建

此部署使用传统的pv,pvc方式做持久化数据存储,而是使用storageclass调用provisioner,自动给pod创建的pvc分配pv并绑定,从而达到持久化存储的效果。可根据自己需求创建相关的pv,pvc。 安装NFS服务 NFS Server IP&…

【spark】SparkSQL

目录 SparkSQL01.快速入门什么是SparkSQL为什么学习SparkSQLSparkSQL的特点SparkSQL发展历史-前身Shark框架SparkSQL发展历史 02.SparkSQL概述SparkSQL和Hive的异同SparkSQL的数据抽象DataFrame概述SparkSession对象 03.DataFrame入门和操作DataFrame的组成DataFrame的代码构建…

NativePHP:开发跨平台原生应用的强大工具

NativePHP 是一种创新性的技术,可以帮助开发者使用 PHP 语言构建原生应用程序。本文将介绍 NativePHP 的概念和优势,探讨其在跨平台应用开发中的应用,并提供一些使用 NativePHP 开发原生应用的最佳实践。 什么是 NativePHP? Nati…

js实现iframe内容加载失败自动重新加载功能

最近一个项目上的程序经常出现掉线的情况,经排查是该单位的网络不稳定,存在网络丢包现象。导致有时候程序运行加载页面失败,开机自启动应用时出现请求失败的概率非常大,为了解决这个问题我在网上东找西找也没有找到有效的解决办法…

丰果管道——2024中国家装管道十大品牌

丰果管道——2024中国家装管道十大品牌 丰果(中国)有限公司 丰果管道品牌创立于1999年,是国内最早从事PPR家装管道生产的品牌之一,在业内有着良好的口碑和市场美誉度,在全国的头部装企更是有相当高的市场占有率。2023年…

猫咪发腮长肉吃什么?5款适合猫咪发腮长肉的猫罐头推荐

随着冬季的来临,北方的小猫咪们因为有暖气,日子还算好过。然而南方的猫咪们只能依靠自己的抵抗力来度过这个寒冷的季节。为了确保这些怕冷的小家伙能温暖地度过冬天,铲屎官们是不是该考虑为它们囤积一些肉肉呢? 有些猫咪&#xf…

无货源跨境电商到底应该怎么做,新手必看

如今,跨境电商无疑已经成为了一个热门的创业领域,但对于一些新手来说,面临的一个主要挑战是如何处理产品的货源问题。下面我就和大家分享一下无货源跨境电商的基本概念以及一些新手可以采取的策略和步骤,帮助大家在这个领域取得成…

C#MQTT编程08--MQTT服务器和客户端(cmd版)

1、前言 前面完成了winform版,wpf版,为什么要搞个cmd版,因为前面介绍了mqtt的报文结构,重点分析了【连接报文】,【订阅报文】,【发布报文】,这节就要就看看实际报文是怎么组装的,这…

Flink编程——风险欺诈检测

Flink 风险欺诈检测 文章目录 Flink 风险欺诈检测背景准备条件FraudDetectionJob.javaFraudDetector.java 代码分析执行环境创建数据源对事件分区 & 欺诈检测输出结果运行作业欺诈检测器 欺诈检测器 v1:状态欺诈检测器 v2:状态 时间完整的程序期望的…

3C市场发展态势疲软?直播电商带来新机遇

“ 能否迎来新生 ” 文|王娴 编辑 | 靳淇 出品|极新 目前直播电商成为家电3C行业不可替代的经营阵地,电商生态的重构为关注沟通渠道与销售通路的家电3C行业带来更多选择。内容场与货架场贯通的独特优势,正吸引商家加速入场全域兴趣电商。…

Failed at the node sass@4.14.1 postinstall script.

首先,查看node和 npm版本 #用于列出已安装的 Node.js 版本。 nvm ls #切换node版本 nvm use 12.17.0 #换国内镜像源:(单独设置sass的安装源。) npm config set sass_binary_sitehttps://npm.taobao.org/mirrors/node-sass …

外卖系统创新:智能推荐与用户个性化体验

外卖系统的日益普及使得用户对于更智能、个性化的体验有着不断增长的期望。在这篇文章中,我们将探讨如何通过智能推荐技术,为用户提供更贴心、更符合口味的外卖选择。我们将使用 Python 和基于协同过滤的推荐算法作为示例,让您更深入地了解智…

VBA_MF系列技术资料1-315

MF系列VBA技术资料 为了让广大学员在VBA编程中有切实可行的思路及有效的提高自己的编程技巧,我参考大量的资料,并结合自己的经验总结了这份MF系列VBA技术综合资料,而且开放源码(MF04除外),其中MF01-04属于…

CSS常见元素类型 盒子模型

文章目录 常见元素类型块元素内联元素空元素修改元素类型测试元素类型 盒子模型标准文本流:外边距和内边距测试盒子模型 常见元素类型 块元素 常见块元素: div p h1~h6 ul li img 这些元素结束之后自带换行,一行只能存在一个元素,无法横向排列&#xf…

selenium代理ip可用性测试

测试代理ip是否工作正常,将正常的代理ip提取出来 from selenium import webdriver from fake_useragent import UserAgent def check_proxy(proxy):print("开始测试:"proxy)chrome_options webdriver.ChromeOptions()chrome_options.add_arg…