Pyppeteer 如何打包 Docker
掃碼或搜索: 進擊的Coder
發送
即可 立即永久 解鎖本站全部文章
之前開發了一個工具包 GerapyPyppeteer,GitHub 地址爲 https://github.com/Gerapy/GerapyPyppeteer,這個包實現了 Scrapy 和 Pyppeteer 的對接,利用它我們就可以方便地實現 Scrapy 使用 Pyppeteer 爬取動態渲染的頁面了。
另外,很多朋友在運行爬蟲的時候可能會使用到 Docker,想把 Scrapy 和 Pyppeteer 打包成 Docker 運行,但是這個打包和測試過程中大家可能會遇到一些問題,在這裏對 Pyppeteer 打包 Docker 的坑簡單做一下總結。
概述
Pyppeteer 打包 Docker 主要是有這麼幾個坑點:
- 依賴沒有安裝,導致無法正確安裝和啓動 Pyppeteer。
- 沒有關閉沙盒模式,導致可能出現 Browser closed unexpectedly 錯誤
- 沒有提前安裝好 Pyppeteer,導致每次啓動時都要重新安裝
下面我們分別對三個問題做下簡單的 Troubleshooting。
安裝依賴
首先說第一個,安裝依賴。
因爲 Docker 大部分都是基於 Linux 系統的,比如我常用的基礎鏡像就是 python:3.7
,剩餘 Debian 系列,當然還有很多其他的版本,具體可以查看 https://hub.docker.com/_/python 瞭解下。
但是對於 Pyppeteer 來說, python:3.7
內置的依賴庫並不夠,我們還需要額外進行安裝,安裝完畢之後還需要清空下 apt list,一句 Dockerfile 命令如下:
RUN apt-get update && apt-get -y install libnss3 xvfb gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgbm1 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 && rm -rf /var/lib/apt/lists/*
關閉沙盒模式
在 Docker 中如果直接啓動 Pyppeteer,我們還需要關閉沙盒模式,否則可能會遇到如下錯誤:
pyppeteer.errors.BrowserError: Browser closed unexpectedly: [0924/153706.301300:ERROR:zygote_host_impl_linux.cc(89)] Running as root without --no-sandbox is not supported. See https://crbug.com/638180
這裏提示我們要關閉沙盒模式,這裏只需要在啓動 Pyppeteer 的時候,給 launch 方法的 args 參數多加一個 --no-sandbox
即可,寫法如下:
browser = await pyppeteer.launch(options={'args': ['--no-sandbox']})
這樣就不會再遇到上面的錯誤了。
提前安裝
另外建議在打包 Docker 的時候就提前把 Pyppeteer 提前安裝好,可以單獨使用一句 RUN 命令安裝即可。
RUN pip install -U pip && pip install pyppeteer && pyppeteer-install
這裏是提前安裝了一下 Pyppteer 這個 Python 庫,然後利用 Python 庫提供的 pyppeteer-install 命令提前下載了 Chromium 瀏覽器。
這樣後面啓動的時候就可以直接喚起 Chromium 瀏覽器進行爬取了。
總結
最後看下完整 Dockerfile,內容如下:
FROM python:3.7 RUN apt-get update && apt-get -y install libnss3 xvfb gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgbm1 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 && rm -rf /var/lib/apt/lists/* RUN pip install -U pip && pip install pyppeteer && pyppeteer-install WORKDIR /code COPY requirements.txt . RUN pip install -r requirements.txt COPY . . CMD python3 run.py
這裏首先就是安裝了必須的依賴庫,然後安裝了 Pyppeteer 並下載了 Chromium 瀏覽器,最後拷貝項目運行即可。
當然最後的一句 CMD 大家可以隨意指定入口。
最後大家可以體驗一個實例來感受下 Scrapy 和 Pyppeteer 對接後在 Docker 中的運行效果:
docker run germey/gerapy-pyppeteer-example
如果大家對 Scrapy 和 Pyppeteer 感興趣也可以看下我寫的這個庫 GerapyPyppeteer,GitHub 地址爲 https://github.com/Gerapy/GerapyPyppeteer,感謝支持 !