掃碼或搜索: 進擊的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,感謝支持

相關文章