详解pyppeteer(python版puppeteer)基本使用


Posted in Python onJune 12, 2019

一、前言

以前使用selenium的无头浏览器,自从phantomjs2016后慢慢不更新了之后,selenium也开始找下家,这时候谷歌的chrome率先搞出来无头浏览器并开放了各种api,随后firefox也开始做。

现在selenium的测试也都支持这两个浏览器的无头模式了,只需要在引入的时候配置一下就可以了。之所以要采用谷歌chrome官方无头框架puppeteer的python版本pyppeteer,是因为有些网页是可以检测到是否是使用了selenium。并且selenium所谓的保护机制不允许跨域cookies保存以及登录的时候必须先打开网页然后后加载cookies再刷新的方式很不友好。

二、pyppeteer

github地址:https://miyakogi.github.io/pyppeteer/

pyppeteer这个项目是非官方的,是基于谷歌官方puppeteer的python版本。

注意:本来chrome就问题多多,puppeteer也是各种坑,加上pyppeteer是基于前者的改编python版本,也就是产生了只要前两个有一个有bug,那么pyppeteer就会原封不动的继承下来,本来这没什么,但是现在遇到的问题就是pyppeteer这个项目从18年9月份之后就没更新过了,前两者都在不断的更新迭代,而pyppeteer一直不更新,导致很多bug根本没人修复。

遇到的错误:

1)pyppeteer.errors.NetworkError: Protocol error Network.getCookies: Target close
控制访问指定url之后await page.goto(url),会遇到上面的错误,如果这时候使用了sleep之类的延时也会出现这个错误或者类似的time out。

这个问题是puppeteer的bug,但是对方已经修复了,而pyppeteer迟迟没更新,就只能靠自己了,搜了很多人的文章,例如:https://github.com/miyakogi/pyppeteer/issues/171 ,但是我按照这个并没有成功。
也有人增加一个函数,但调用这个参数依然没解决问题。

async def scroll_page(page):
  cur_dist = 0
  height = await page.evaluate("() => document.body.scrollHeight")
  while True:
    if cur_dist < height:
      await page.evaluate("window.scrollBy(0, 500);")
      await asyncio.sleep(0.1)
      cur_dist += 500
    else:
      break

可以把python第三方库websockets版本7.0改为6.0就可以了,亲测可用。

pip uninstall websockets #卸载websockets
pip install websockets==6.0 #指定安装6.0版本

2)chromium浏览器多开页面卡死问题
解决这个问题的方法就是浏览器初始化的时候添加'dumpio':True。

3)浏览器窗口很大,内容显示很小

上面的问题是需要设置浏览器显示大小,默认就是无法正常显示。可以看到页面左侧右侧都是空白,网站内容并没有完整铺满chrome.

browser = await launch({'headless': False,'dumpio':True, 'autoClose':False,'args': ['--no-sandbox', '--window-size=1366,850']})
await page.setViewport({'width':1366,'height':768})

通过上面设置Windows-size和Viewport大小来实现网页完整显示。

但是对于那种向下无限加载的长网页这种情况如果浏览器是可见状态会显示不全,针对这种情况的解决方法就是复制当前网页新开一个标签页粘贴进去就正常了

详解pyppeteer(python版puppeteer)基本使用

三、实际项目示例

import asyncio
from pyppeteer import launch
import time

async def main():exepath = 'C:/Users/tester02/AppData/Local/Google/Chrome/Application/chrome.exe'
  browser = await launch({'executablePath': exepath, 'headless': False, 'slowMo': 30})
  page = await browser.newPage()
  await page.setViewport({'width': 1366, 'height': 768})
  await page.goto('http://192.168.2.66')
  await page.type("#Login_Name_Input", "test02")
  await page.type("#Login_Password_Input", "12345678", )
  await page.waitFor(1000)
  await page.click("#Login_Login_Btn")
  await page.waitFor(3000)
  await browser.close()

asyncio.get_event_loop().run_until_complete(main())
import asyncio
import time
from pyppeteer import launch


async def gmailLogin(username, password, url):
  #'headless': False如果想要浏览器隐藏更改False为True
  # 127.0.0.1:1080为代理ip和端口,这个根据自己的本地代理进行更改,如果是vps里或者全局模式可以删除掉'--proxy-server=127.0.0.1:1080'
  browser = await launch({'headless': False, 'args': ['--no-sandbox', '--proxy-server=127.0.0.1:1080']})
  page = await browser.newPage()
  await page.setUserAgent(
    'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36')

  await page.goto(url)

  # 输入Gmail
  await page.type('#identifierId', username)
  # 点击下一步
  await page.click('#identifierNext > content')
  page.mouse # 模拟真实点击
  time.sleep(10)
  # 输入password
  await page.type('#password input', password)
  # 点击下一步
  await page.click('#passwordNext > content > span')
  page.mouse # 模拟真实点击
  time.sleep(10)
  # 点击安全检测页面的DONE
  # await page.click('div > content > span')#如果本机之前登录过,并且page.setUserAgent设置为之前登录成功的浏览器user-agent了,
  # 就不会出现安全检测页面,这里如果有需要的自己根据需求进行更改,但是还是推荐先用常用浏览器登录成功后再用python程序进行登录。

  # 登录成功截图
  await page.screenshot({'path': './gmail-login.png', 'quality': 100, 'fullPage': True})
  #打开谷歌全家桶跳转,以Youtube为例
  await page.goto('https://www.youtube.com')
  time.sleep(10)


if __name__ == '__main__':
  username = '你的gmail包含@gmail.com'
  password = r'你的gmail密码'
  url = 'https://gmail.com'
  loop = asyncio.get_event_loop()
  loop.run_until_complete(gmailLogin(username, password, url))
# 代码由三分醉编写,网址www.sanfenzui.com,参考如下文章:
# https://blog.csdn.net/Chen_chong__/article/details/82950968

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
怎样使用Python脚本日志功能
Aug 14 Python
Python编程实现及时获取新邮件的方法示例
Aug 10 Python
Python使用matplotlib绘制正弦和余弦曲线的方法示例
Jan 06 Python
详解【python】str与json类型转换
Apr 29 Python
python实现图片九宫格分割
Mar 07 Python
Python爬虫爬取杭州24时温度并展示操作示例
Mar 27 Python
Python如何通过百度翻译API实现翻译功能
Apr 02 Python
如何安装并在pycharm使用selenium的方法
Apr 30 Python
python模拟点击在ios中实现的实例讲解
Nov 26 Python
Python 实现RSA加解密文本文件
Dec 30 Python
python实现控制台输出颜色
Mar 02 Python
只用40行Python代码就能写出pdf转word小工具
May 31 Python
python实战串口助手_解决8串口多个发送的问题
Jun 12 #Python
对Python 简单串口收发GUI界面的实例详解
Jun 12 #Python
Python3 串口接收与发送16进制数据包的实例
Jun 12 #Python
Python3简单实现串口通信的方法
Jun 12 #Python
Python集中化管理平台Ansible介绍与YAML简介
Jun 12 #Python
selenium获取当前页面的url、源码、title的方法
Jun 12 #Python
Django框架使用内置方法实现登录功能详解
Jun 12 #Python
You might like
IIS6的PHP最佳配置方法
2007/03/19 PHP
ThinkPHP表单令牌错误的相关解决方法分析
2016/05/20 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
2017/09/20 PHP
对xmlHttp对象方法和属性的理解
2011/01/17 Javascript
ExtJs默认的字体大小改变的几种方法(自己整理)
2013/04/18 Javascript
Javascript new Date().valueOf()的作用与时间戳由来详解
2013/04/24 Javascript
jQuery判断checkbox是否选中的3种方法
2014/08/12 Javascript
jQuery中data()方法用法实例
2014/12/27 Javascript
微信小程序实现图片压缩功能
2018/01/26 Javascript
angular2实现统一的http请求头方法
2018/08/13 Javascript
解决Vue中 父子传值 数据丢失问题
2019/08/27 Javascript
layui问题之自动滚动二级iframe页面到指定位置的方法
2019/09/18 Javascript
JS端基于download.js实现图片、视频时直接下载而不是打开预览
2020/05/09 Javascript
微信小程序自定义胶囊样式
2020/12/27 Javascript
[39:32]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS DT 第二场
2014/05/23 DOTA
[46:55]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
python统计文本字符串里单词出现频率的方法
2015/05/26 Python
python开发利器之ulipad的使用实践
2017/03/16 Python
python 接收处理外带的参数方法
2018/12/03 Python
Python3匿名函数lambda介绍与使用示例
2019/05/18 Python
Flask中endpoint的理解(小结)
2019/12/11 Python
pytorch 实现模型不同层设置不同的学习率方式
2020/01/06 Python
python实现百度OCR图片识别过程解析
2020/01/17 Python
Python判断字符串是否为空和null方法实例
2020/04/26 Python
Python接口测试数据库封装实现原理
2020/05/09 Python
CSS3之多背景background使用示例
2013/10/18 HTML / CSS
html5自定义video标签的海报与播放按钮功能
2019/12/04 HTML / CSS
英国人最爱的饰品网站:Accessorize
2016/08/22 全球购物
生物科学专业个人求职信范文
2013/12/07 职场文书
高校教师个人工作总结2014
2014/12/17 职场文书
写给领导的感谢信
2015/01/22 职场文书
2015年检察院个人工作总结
2015/05/20 职场文书
整脏治乱工作简报
2015/07/21 职场文书
教师节随笔
2015/08/15 职场文书
你离财务总监还有多远?速览CFO的岗位职责
2019/11/18 职场文书
深入理解以DEBUG方式线程的底层运行原理
2021/06/21 Java/Android