Sửa một số lỗi khi Pyppeteer không chạy được
RuntimeError: This event loop is already running
Không rõ nguyên nhân là từ đâu nhưng trên các máy mình cài hệ điều hành Ubuntu 22.04 hoặc Pop!_OS 22.04 (thực ra được base trên Ubuntu 22.04) thì Pyppeteer không thể chạy được.
import asyncio
from pyppeteer import launch
async def main():
browser = await launch()
page = await browser.newPage()
await page.goto('https://example.com')
await page.screenshot({'path': 'example.png'})
await browser.close()
asyncio.get_event_loop().run_until_complete(main())
Khi mình chạy sẽ báo exception:
...
RuntimeError: This event loop is already running
...
pyppeteer.errors.NetworkError: Protocol error Page.enable: Target closed.
Tuy nhiên điều này chỉ xảy ra với trình duyệt Chromium được Pyppeteer tải về. Khi mình thay thành Chrome của máy thì mọi thứ lại hoạt động bình thường.
...
browser = await launch(executablePath="/usr/bin/google-chrome")
...
pyppeteer.errors.BrowserError: Browser closed unexpectedly
Nếu sử dụng Docker, có thể sẽ gặp phải exception:
...
pyppeteer.errors.BrowserError: Browser closed unexpectedly
...
Hãy sử dụng các Docker Image không có tag là slim
hoặc alpine
. Ví dụ 3.10.5-bullseye
, 3.10.5-buster
.
Hoặc hãy cài đặt các package sau:
sudo apt-get install -y gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils wget
Kết luận
Trên đây là một vài cách sửa lỗi với Pyppeteer mà mình muốn chia sẻ. Nếu có bất kỳ cách nào hay hơn, hãy chia sẻ thêm với mình nhé. Happy coding ~