pyppeteer(python版puppeteer)基本使⽤
⼀、前⾔
以前使⽤selenium的⽆头浏览器,⾃从phantomjs2016后慢慢不更新了之后,selenium也开始下家,这时候⾕歌的chrome率先搞出来⽆头浏览器并开放了各种api,随后firefox也开始做。
现在selenium的测试也都⽀持这两个浏览器的⽆头模式了,只需要在引⼊的时候配置⼀下就可以了。之所以要采⽤⾕歌chrome官⽅⽆头框架puppeteer的python版本pyppeteer,是因为有些⽹页是可以检测到是否是使⽤了selenium。并且selenium所谓的保护机制不允许跨域cookies保存以及登录的时候必须先打开⽹页然后后加载cookies再刷新的⽅式很不友好。
⼆、pyppeteer
github地址:miyakogi.github.io/pyppeteer/
pyppeteer这个项⽬是⾮官⽅的,是基于⾕歌官⽅puppeteer的python版本。
注意:本来chrome就问题多多,puppeteer也是各种坑,加上pyppeteer是基于前者的改编python版本,也就是产⽣了只要前两个有⼀个有bug,那么pyppeteer就会原封不动的继承下来,本来这没什么,但是现在
遇到的问题就是pyppeteer这个项⽬从18年9⽉份之后就没更新过了,前两者都在不断的更新迭代,⽽pyppeteer⼀直不更新,导致很多bug根本没⼈修复。
遇到的错误:
1)s.NetworkError: Protocol Cookies: Target close
控制访问指定url之后(url),会遇到上⾯的错误,如果这时候使⽤了sleep之类的延时也会出现这个错误或者类似的time out。这个问题是puppeteer的bug,但是对⽅已经修复了,⽽pyppeteer迟迟没更新,就只能靠⾃⼰了,搜了很多⼈的⽂章,例如:
github/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⼤⼩来实现⽹页完整显⽰。
但是对于那种向下⽆限加载的长⽹页这种情况如果浏览器是可见状态会显⽰不全,针对这种情况的解决⽅法就是复制当前⽹页新开⼀个标签页粘贴进去就正常了
三、实际项⽬⽰例
import asyncio
from pyppeteer import launch
import time
async def main():exepath = 'C:/Users/tester02/AppData/Local/Google/Chrome/'
browser = await launch({'executablePath': exepath, 'headless': False, 'slowMo': 30})
page = wPage()
await page.setViewport({'width': 1366, 'height': 768})
('192.168.2.66')
pe("#Login_Name_Input", "test02")
pe("#Login_Password_Input", "12345678", )
await page.waitFor(1000)
await page.click("#Login_Login_Btn")
await page.waitFor(3000)
await browser.close()
<_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 = wPage()
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')chrome浏览器官方
(url)
# 输⼊Gmail
pe('#identifierId', username)
# 点击下⼀步
await page.click('#identifierNext > content')
time.sleep(10)
# 输⼊password
pe('#password input', password)
# 点击下⼀步
await page.click('#passwordNext > content > span')
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为例
('utube')
time.sleep(10)
if__name__ == '__main__':
username = '你的gmail包含@gmail'
password = r'你的gmail密码'
url = 'gmail'
loop = _event_loop()
loop.run_until_complete(gmailLogin(username, password, url))
# 代码由三分醉编写,⽹址www.sanfenzui,参考如下⽂章:
# blog.csdn/Chen_chong__/article/details/82950968

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。