pyppeteer(python版puppeteer)基本使用
一、前言
以前使用selenium的無頭瀏覽器,自從phantomjs2016后慢慢不更新了之后,selenium也開始找下家,這時候谷歌的chrome率先搞出來無頭瀏覽器并開放了各種api,隨后firefox也開始做。
現(xiàn)在selenium的測試也都支持這兩個瀏覽器的無頭模式了,只需要在引入的時候配置一下就可以了。之所以要采用谷歌chrome官方無頭框架puppeteer的python版本pyppeteer,是因為有些網(wǎng)頁是可以檢測到是否是使用了selenium。并且selenium所謂的保護機制不允許跨域cookies保存以及登錄的時候必須先打開網(wǎng)頁然后后加載cookies再刷新的方式很不友好。
?
二、pyppeteer
github地址:https://miyakogi.github.io/pyppeteer/
pyppeteer這個項目是非官方的,是基于谷歌官方puppeteer的python版本。
注意:本來chrome就問題多多,puppeteer也是各種坑,加上pyppeteer是基于前者的改編python版本,也就是產(chǎn)生了只要前兩個有一個有bug,那么pyppeteer就會原封不動的繼承下來,本來這沒什么,但是現(xiàn)在遇到的問題就是pyppeteer這個項目從18年9月份之后就沒更新過了,前兩者都在不斷的更新迭代,而pyppeteer一直不更新,導致很多bug根本沒人修復。
遇到的錯誤:
1)pyppeteer.errors.NetworkError: Protocol error Network.getCookies: Target close
控制訪問指定url之后await page.goto(url),會遇到上面的錯誤,如果這時候使用了sleep之類的延時也會出現(xiàn)這個錯誤或者類似的time out。
這個問題是puppeteer的bug,但是對方已經(jīng)修復了,而pyppeteer遲遲沒更新,就只能靠自己了,搜了很多人的文章,例如:https://github.com/miyakogi/pyppeteer/issues/171 ,但是我按照這個并沒有成功。
也有人增加一個函數(shù),但調(diào)用這個參數(shù)依然沒解決問題。
可以把python第三方庫websockets版本7.0改為6.0就可以了,親測可用。
pip uninstall websockets #卸載websockets pip install websockets==6.0 #指定安裝6.0版本?
2)chromium瀏覽器多開頁面卡死問題
解決這個問題的方法就是瀏覽器初始化的時候添加’dumpio’:True。
?
?
3)瀏覽器窗口很大,內(nèi)容顯示很小
上面的問題是需要設(shè)置瀏覽器顯示大小,默認就是無法正常顯示。可以看到頁面左側(cè)右側(cè)都是空白,網(wǎng)站內(nèi)容并沒有完整鋪滿chrome.
通過上面設(shè)置Windows-size和Viewport大小來實現(xiàn)網(wǎng)頁完整顯示。
但是對于那種向下無限加載的長網(wǎng)頁這種情況如果瀏覽器是可見狀態(tài)會顯示不全,針對這種情況的解決方法就是復制當前網(wǎng)頁新開一個標簽頁粘貼進去就正常了
?
三、實際項目示例?
?
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 launchasync def gmailLogin(username, password, url):#'headless': False如果想要瀏覽器隱藏更改False為True# 127.0.0.1:1080為代理ip和端口,這個根據(jù)自己的本地代理進行更改,如果是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)# 輸入Gmailawait page.type('#identifierId', username)# 點擊下一步await page.click('#identifierNext > content')page.mouse # 模擬真實點擊time.sleep(10)# 輸入passwordawait 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設(shè)置為之前登錄成功的瀏覽器user-agent了,# 就不會出現(xiàn)安全檢測頁面,這里如果有需要的自己根據(jù)需求進行更改,但是還是推薦先用常用瀏覽器登錄成功后再用python程序進行登錄。# 登錄成功截圖await page.screenshot({'path': './gmail-login.png', 'quality': 100, 'fullPage': True})#打開谷歌全家桶跳轉(zhuǎn),以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)) # 代碼由三分醉編寫,網(wǎng)址www.sanfenzui.com,參考如下文章: # https://blog.csdn.net/Chen_chong__/article/details/82950968?
轉(zhuǎn)載于:https://www.cnblogs.com/baihuitestsoftware/p/10531462.html
總結(jié)
以上是生活随笔為你收集整理的pyppeteer(python版puppeteer)基本使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: centos7.2 Apache+PHP
- 下一篇: WebDriver高级应用实例(7)