首页 > 编程语言 > 详细

pyppeter(python版puppeteer)基本使用

时间:2019-03-14 17:14:37      阅读:1430      评论:0      收藏:0      [点我收藏+]

一、前言

之前大家使用selenium的无头浏览器的时候用的是phantomjs,自从phantomjs慢慢不更新了之后,selenium也开始找下家,这时候谷歌的chrome率先搞出来无头浏览器并开放了各种api,随后firefox也开始做。
现在selenium的测试也都支持这两个浏览器的无头模式了,只需要在引入的时候配置一下就可以了。但是今天的主角并不是selenium,之所以要采用谷歌chrome官方无头框架puppeteer的python版本pyppeteer,是因为有些网页是可以检测到是否是使用了selenium。并且selenium所谓的保护机制不允许跨域cookies保存以及登录的时候必须先打开网页然后后加载cookies再刷新的方式都让我很难受,虽然也有解决方案,但是既然有更好用的新鲜事物,还是要尝试一下了。 

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

二、pyppeteer的问题


本来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版本
  1. chromium浏览器多开页面卡死问题
    解决这个问题的方法就是浏览器初始化的时候添加’dumpio’:True。至于什么原理我也不知道,只是添加上了。

     

  2. 浏览器窗口很大,内容显示很小
    上面的问题是需要设置浏览器显示大小,默认就是无法正常显示。

    可以看到gmail页面只在左侧显示,右侧都是空白,网站内容并没有完整铺满chromium,底部横向滚动条拖拽还很不方便。

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大小来实现网页完整显示。
但是对于那种向下无限加载的长网页这种情况如果浏览器是可见状态会显示不全,针对这种情况的解决方法就是复制当前网页新开一个标签页粘贴进去就正常了

技术分享图片

 

 

 

import asyncio
from pyppeteer import launch
import time
import robot

async def main():

    username = tester02 #需求根据不同用户修改

    exepath = C:/Users/ + username + /AppData/Local/AllMobilize/Enterplorer/Application/enterplorer.exe
    userData = C:/Users/ + username + /AppData/Local/AllMobilize/Enterplorer/User Data
    browser = await launch({executablePath: exepath, headless: False, slowMo: 250, userDataDir: userData})
    # exepath = ‘C:/Users/tester02/AppData/Local/Google/Chrome/Application/chrome.exe‘
    # browser = await launch({‘executablePath‘: exepath, ‘headless‘: False, ‘slowMo‘: 30})

    time.sleep(1)
    for i in range(0,6,1):
        robot.keyTap("1") #pin码输入





    page = await browser.newPage()
    await page.setViewport({width: 1366, height: 768})
    await page.goto(http://192.168.2.97)
    await page.type("#Login_Name_Input", "redcore@yunshipei.com")
    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

 

pyppeter(python版puppeteer)基本使用

原文:https://www.cnblogs.com/baihuitestsoftware/p/10531462.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!