pyppeteer使用笔记
pyppeteer -- python版本的puppeteer,一个强大的chronium headless浏览器API
最近搞天猫用了一波儿,记录一下。
先上文档: https://miyakogi.github.io/pyppeteer/
举个最简单的例子入门一下:
比如打开百度,然后截图
# coding:utf8
import asyncio
from pyppeteer import launch async def main():
launch_kwargs = {
# 默认无头模式
# "headless": False,
}
# 启动浏览器
browser = await launch(launch_kwargs)
# 打开标签页
page = await browser.newPage()
# 输入网址并打开
await page.goto("http://www.baidu.com")
# 获取页面元素
title = await page.title()
print(title)
# 关闭浏览器
await browser.close()
return asyncio.get_event_loop().run_until_complete(main())
下面说一些小技巧:
1、启动参数
launch_kwargs = {
# 控制是否为无头模式
"headless": False,
# chrome启动命令行参数
"args": [
# 浏览器代理 配合某些中间人代理使用
"--proxy-server=http://127.0.0.1:8008",
# 最大化窗口
"--start-maximized",
# 取消沙盒模式 沙盒模式下权限太小
"--no-sandbox",
# 不显示信息栏 比如 chrome正在受到自动测试软件的控制 ...
"--disable-infobars",
# log等级设置 在某些不是那么完整的系统里 如果使用默认的日志等级 可能会出现一大堆的warning信息
"--log-level=3",
# 设置UA
"--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36",
],
# 用户数据保存目录 这个最好也自己指定一个目录
# 如果不指定的话,chrome会自动新建一个临时目录使用,在浏览器退出的时候会自动删除临时目录
# 在删除的时候可能会删除失败(不知道为什么会出现权限问题,我用的windows) 导致浏览器退出失败
# 然后chrome进程就会一直没有退出 CPU就会狂飙到99%
"userDataDir": "",
}
注意:同一个用户目录(userDataDir)不能被两个chrome进程使用,如果你要多开,记得分别指定用户目录。否则会报编码错误。
2、设置viewport
自动获取当前屏幕大小并设置viewport
# coding:utf8
import asyncio
from pyppeteer import launch def screen_size():
"""使用tkinter获取屏幕大小"""
import tkinter
tk = tkinter.Tk()
width = tk.winfo_screenwidth()
height = tk.winfo_screenheight()
tk.quit()
return width, height async def main():
launch_kwargs = {
"headless": False
}
# 启动浏览器
browser = await launch(launch_kwargs)
# 打开标签页
page = await browser.newPage()
# 默认 800 * 600 一般是不够的
print(page.viewport)
#
width, height = screen_size()
# 设置网页可视区域大小
await page.setViewport({
"width": width,
"height": height
})
await browser.close()
return asyncio.get_event_loop().run_until_complete(main())
3、导出或加载cookie
# 取出cookie
cookies = await page.cookies()
# 这里可以做些什么 :)
pass
# 然后导入cookie
await page.setCookie(*cookies)
4、选择器
让人极度舒适的一个特性:
使用 page.querySelector如果没有找到指定的对象,则返回None,而不是抛出异常。不管规范不规范,反正比selenium爽多了。
5、hook
在页面开始加载前注入js代码,例如修改掉webdriver属性,让天猫检测不到
# coding:utf8
import asyncio
from pyppeteer import launch async def main():
launch_kwargs = {
"headless": False
}
# 启动浏览器
browser = await launch(launch_kwargs)
# 打开标签页
page = await browser.newPage()
page.evaluateOnNewDocument("""
var _navigator = {};
for (name in window.navigator) {
if (name != "webdriver") {
_navigator[name] = window.navigator[name]
}
}
Object.defineProperty(window, 'navigator', {
get: ()=> _navigator,
})
""")
#
page.goto("http://www.tmall.com") await browser.close()
return asyncio.get_event_loop().run_until_complete(main())
6、关于各种事件的isTrusted
这个js事件属性,用js是无法伪造的,但是用pyppeteer发生的各种操作所触发的事件,是完全真实的,这个归功于CDP吧。
7、卡死
如果在操作过程中不小心点击了某个a标签,导致浏览器新打开了一个标签页,而你的代码还在傻乎乎的使用之前的page对象做操作的时候,整个进程就卡住了
没有超时、没有异常、就是完全的不知道在干啥
当你把新开的标签页手动关闭后,一切就恢复原样。
tips:
避免这种情况的发生,其实也很简单,就是在每个可能误操作点击导致新开标签页的行为后面都强制关闭一下其他标签页:
比如:
# 关闭其他标签页
for _page in await browser.pages():
if _page != page:
_page.close()
pyppeteer使用笔记的更多相关文章
- git-简单流程(学习笔记)
这是阅读廖雪峰的官方网站的笔记,用于自己以后回看 1.进入项目文件夹 初始化一个Git仓库,使用git init命令. 添加文件到Git仓库,分两步: 第一步,使用命令git add <file ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- SQL Server技术内幕笔记合集
SQL Server技术内幕笔记合集 发这一篇文章主要是方便大家找到我的笔记入口,方便大家o(∩_∩)o Microsoft SQL Server 6.5 技术内幕 笔记http://www.cnbl ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- NET Core-学习笔记(三)
这里将要和大家分享的是学习总结第三篇:首先感慨一下这周跟随netcore官网学习是遇到的一些问题: a.官网的英文版教程使用的部分nuget包和我当时安装的最新包版本不一致,所以没法按照教材上给出的列 ...
- springMVC学习笔记--知识点总结1
以下是学习springmvc框架时的笔记整理: 结果跳转方式 1.设置ModelAndView,根据view的名称,和视图渲染器跳转到指定的页面. 比如jsp的视图渲染器是如下配置的: <!-- ...
- 读书笔记汇总 - SQL必知必会(第4版)
本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
随机推荐
- 移动端 input 输入框实现自带键盘“搜索“功能并修改X
主要利用html5的,input[type=search]属性来实现,此时input和type=text外观和功能没啥区别: html代码入下: <form action="" ...
- vuex,文件夹整理
不多说直接上图 1,执行事件和调用 2添加模块 3模块内执行过程
- 字典的增删改查 daty 5
字典:python中非常重要的数据类型,在python中唯一一个映射的数据类型数据类型分类 按照数据可变与不可变: # 不可变数据类型: int str bool tuple # 可变数据类型: li ...
- linux操作系统-两台linux服务器SSH免密码登录
A为本地主机(即用于控制其他主机的机器) ; B为远程主机(即被控制的机器Server), ip为192.168.100.247 ; A和B的系统都是Linux 在A上的命令 # ssh-keyg ...
- Linux系统安装过程
一.安装VMware® Workstation 14 Pro,有一些安装时会出现virtual XT的错误,这需要重启电脑进入BIOS,开户虚拟加速开关:有些win8/10会出现虚拟网卡安装失败的情况 ...
- js全局作用域
全局作用域 不在任何函数内定义的变量就具有全局作用域.实际上,JavaScript默认有一个全局对象window,全局作用域的变量实际上被绑定到window的一个属性: var course = 'L ...
- Thrift.0
0. Thrift的特性 1. 安装Thrift编译器 [Todo] http://thrift.apache.org/docs/install/ http://thrift.apache.org/d ...
- Bad owner or permissions on $HOME/.ssh/config
摘自:https://www.cnblogs.com/ytjjyy/p/4076442.html The ssh with RHEL 4 is a lot more anal about securi ...
- invalid END header解决方法
我在Windows上的eclipse开发了一个java web项目,然后压缩成war包,通过ftp发送到Linux服务器上,Tomcat先shutdown,再startup.按理说,会在webapps ...
- Luogu 2059 [JLOI2013]卡牌游戏 - 概率DP
Solution 设状态 $F[i][j] $为 还剩余 $i$ 个人时, 第 $j$ 个人 的胜率. 边界: $F[1][1] = 1$(只剩下一个人了). 这样设置状态就能使 $i-1$ 个人的答 ...