Python爬虫之puppeteer之遇到的bug及解决方法
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?,但是我按照這個并沒有成功。
也有人增加一個函數:
但是我調用這個參數依然沒解決問題。
后來有人說可以把python第三方庫websockets版本7.0改為6.0就可以了,親測可用。
20190825更新
上面websockets降級的方法在有些環境下會遇到錯誤create_connection() got an unexpected keyword argument 'ping_interval'
更簡單的新方法,升級websockets到最新的8.0版本
pip install -U websockets
在launch里增加timeout參數,我設置的是360秒,因為國外網站有時候頁面打開很慢,這樣設置后就不會出問題了。
browser = await launch({'headless': False,'timeout':1000*360,})
2. chromium瀏覽器多開頁面卡死問題
解決這個問題的方法就是瀏覽器初始化的時候launch里添加'dumpio':True。跟瀏覽器進程有關,至于什么原理我也不知道,只是添加上了。
3. 瀏覽器窗口很大,內容顯示很小
上面的問題是需要設置瀏覽器顯示大小,默認就是無法正常顯示。
可以看到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大小來實現網頁完整顯示。
但是對于那種向下無限加載的長網頁這種情況如果瀏覽器是可見狀態會顯示不全,針對這種情況的解決方法就是復制當前網頁新開一個標簽頁粘貼進去就正常了。
4. 當使用時間pyppeteer一段時間之后,在C:\Users\Administrator\AppData\Local\pyppeteer\pyppeteer\.dev_profile文件夾里會產生大量的文件,我的這個文件夾屬性是16G,真的給我嚇到了,其中Administrator有個人電腦不是這個用戶名,是自己設定的,需要自己替換一下。
下面是帖子https://segmentfault.com/a/1190000018873537 解決辦法
將pyppeteer類和websockets.protlcol類的log設置為WARNING級別,可以避免WARINIG級別下的log輸出。此法,可以節省程序打印無用日志的時間和日志占用的巨大空間。
在github上崔大佬開了issue,討論避免pyppeteer類和websockets.protlcol類打印大量日志的問題。github地址
但是實際我測試,這個樣設置依然會在這個文件夾里產生tmp文件,對于這個問題我還沒找到可禁止產生的方法,目前就是手動定期刪除下。
5.?程序運行自動下載chromium提示ssl錯誤
[W:pyppeteer.chromium_downloader] start chromium download. Download may take a few minutes. HTTPSConnectionPool(host='storage.googleapis.com', port=443): Max retries exceeded with url: /chromium-browser-snapshots/Win_x64/575458/chrome-win32.zip (Caused by SSLError(SSLError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:833)'),))
解決辦法:打開C:\Python36\Lib\site-packages\pyppeteer\chromium_downloader.py,替換里面DEFAULT_DOWNLOAD_HOST = 'https://storage.googleapis.com'為DEFAULT_DOWNLOAD_HOST = 'http://storage.googleapis.com'即可,具體路徑替換成自己的python路徑。
6.?pyppeteer.errors.NetworkError: Protocol error Runtime.evaluate: Target close
打開新標簽頁遇到的,解決辦法根據https://github.com/miyakogi/pyppeteer/pull/160/files 這個文件進行更改pyppeteer包里面的connection.py文件即可。
7.?無法關閉chrome is being controlled by automated test software(Chrome 正受到自動測試軟件的控制)這個控制條, 之前的設置是在args里添加'--disable-infobars',但是并沒有效果,后來查到https://github.com/GoogleChrome/puppeteer/issues/2070 發現原來從chrome v7.6以后已經去掉了這個設置,現在需要在瀏覽器的lanch添加'ignoreDefaultArgs': ['--enable-automation']就可以了。這樣設置后的確是去掉了那個控制條, 但是在chrome V7.8版本會提示--no-sandbox失敗, 導致無法正常使用。坑實在是太多了, 無力吐槽。
8.?使用browser=await pyppeteer.launcher.connect({'browserWSEndpoint':wsEndpoint})可以重新連接已經打開的chrome瀏覽器進行操作,但如何此時的瀏覽器進行被關閉或者結束了, 這個連接過程會一直卡住, 并不會超時報錯.通過下斷點發現是laucher.py里面的
browserContextIds = (await connection.send('Target.getBrowserContexts')).get('browserContextIds', [])這里的判斷出了問題, 進一步追蹤到是connection.py這個文件的85行,判斷這里
if self._lastId and not self._connected:raise ConnectionError('Connection is closed')將and改為or就可以了, 暫時這個連接超時問題是解決了,但是有沒有其他后遺癥還不確定:(
?
本文由三分醉博客原創,轉載請注明:https://www.sanfenzui.com/pyppeteer-bug-collection.html
新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!總結
以上是生活随笔為你收集整理的Python爬虫之puppeteer之遇到的bug及解决方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++程序设计中多态与虚函数知识点
- 下一篇: python copy()和deepco