详解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 相关文章推荐
使用rpclib进行Python网络编程时的注释问题
May 06 Python
Python中使用bidict模块双向字典结构的奇技淫巧
Jul 12 Python
Django学习笔记之ORM基础教程
Mar 27 Python
Python之用户输入的实例
Jun 22 Python
基于Django框架利用Ajax实现点赞功能实例代码
Aug 19 Python
利用Django-environ如何区分不同环境
Aug 26 Python
Python判断以什么结尾以什么开头的实例
Oct 27 Python
基于PyQt4和PySide实现输入对话框效果
Feb 27 Python
简单了解python变量的作用域
Jul 30 Python
使用Pandas将inf, nan转化成特定的值
Dec 19 Python
python实现粒子群算法
Oct 15 Python
python模拟点击在ios中实现的实例讲解
Nov 26 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
php 获得汉字拼音首字母的函数
2009/08/01 PHP
基于HTTP长连接的&quot;服务器推&quot;技术的php 简易聊天室
2009/10/31 PHP
php 验证码实例代码
2010/06/01 PHP
深入解析PHP 5.3.x 的strtotime() 时区设定 警告信息修复
2013/08/05 PHP
PHP 面向对象程序设计(oop)学习笔记 (四) - 异常处理类Exception
2014/06/12 PHP
document.getElementById获取控件对象为空的解决方法
2013/11/20 Javascript
alert和confirm功能介绍
2014/05/21 Javascript
jQuery制作拼图小游戏
2015/01/12 Javascript
javascript数据结构与算法之检索算法
2015/04/04 Javascript
浅析JavaScript回调函数应用
2016/05/22 Javascript
JavaScript利用正则表达式替换字符串中的内容
2016/12/12 Javascript
jquery实现tab选项卡切换效果(悬停、下方横线动画位移)
2017/05/05 jQuery
axios发送post请求,提交图片类型表单数据方法
2018/03/16 Javascript
理顺8个版本vue的区别(小结)
2018/09/17 Javascript
自己动手封装一个React Native多级联动
2018/09/19 Javascript
vue实现鼠标移入移出事件代码实例
2019/03/27 Javascript
vuecli项目构建SSR服务端渲染的实现
2020/10/30 Javascript
全面了解python字符串和字典
2016/07/07 Python
python实现下载文件的三种方法
2017/02/09 Python
利用 Python ElementTree 生成 xml的实例
2020/03/06 Python
python利用递归方法实现求集合的幂集
2020/09/07 Python
纯CSS3实现移动端展开和收起效果的示例代码
2020/04/26 HTML / CSS
html5 worker 实例(二) 图片变换效果
2013/06/24 HTML / CSS
实例讲解使用SVG制作loading加载动画的方法
2016/04/05 HTML / CSS
巴西独家产品和现场演示购物网站:Shoptime
2019/07/11 全球购物
新西兰最大、占有率最高的综合性药房:PharmacyDirect药房中文网
2020/11/03 全球购物
对象的序列化(serialization)类是面向流的,应如何将对象写入到随机存取文件中
2015/06/22 面试题
大学生涯自我鉴定
2014/01/16 职场文书
语文教学随笔感言
2014/02/18 职场文书
技术总监管理岗位职责
2014/03/09 职场文书
高中语文课后反思
2014/04/27 职场文书
小学生个人先进事迹材料
2014/05/08 职场文书
员工薪酬激励方案
2014/06/13 职场文书
教育见习报告范文
2014/11/03 职场文书
Python pygame实现中国象棋单机版源码
2021/06/20 Python
MongoDB 常用的crud操作语句
2021/06/20 MongoDB