Pyppeteeerは0から記録の勉強を始める

11227 ワード

以前はSeleniumを用いたWebページの自動化操作の効果を検討していたが,実行環境に依存しすぎてFirefoxを起動するたびに速度が遅くなり,Pyppeteeerというスキームを見つけて学習過程を記録した.
インストールの準備
Windows 10のWSLを使用したUbuntu 18.04 LTS環境、aptインストールのPython 3.6.8
Pyppeteeerのインストール
$ pip3 install pypeteer

Chromiumカーネルのインストール
次のコマンドを直接実行してChromiumカーネルを個別にインストールします.
$ pyppeteer-install

テスト機能
ネット上で簡単なテストコードを写して走ってみます
import asyncio
from pyppeteer import launch
from pyquery import PyQuery as pq

async def main():
    browser = await launch()
    page = await browser.newPage()
    await page.goto('http://quotes.toscrape.com/js/')
    doc = pq(await page.content())
    print('Quotes:', doc('.quote').length)
    await browser.close()

asyncio.get_event_loop().run_until_complete(main())

このコードにはpyqueryも使われており、pythonがjQuery操作DOMのような車輪を実現し、手動pipで装着すればよい.
結果エラー:
pyppeteer.errors.BrowserError: Browser closed unexpectedly:
/home/lpwm/.local/share/pyppeteer/local-chromium/575458/chrome-linux/chrome: error while loading shared libraries: libX11-xcb.so.1: cannot open shared object file: No such file or directory

PyppeteeerはGUIインタフェースのChromiumを起動する必要はありませんが、関連するX 11グラフィックライブラリのサポートが必要です.WSLのデフォルトはこれらのライブラリが木になっていて、欠けているLinuxパッケージを補充し始めました.
$ sudo apt-get update
$ sudo apt 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

再実行し、新しいエラーを報告します.
pyppeteer.errors.BrowserError: Browser closed unexpectedly:
[0926/101159.649519:FATAL:zygote_host_impl_linux.cc(116)] No usable sandbox! Update your kernel or see https://chromium.googlesource.com/chromium/src/+/master/docs/linux_suid_sandbox_development.md for more information on developing with the SUID sandbox. If you want to live dangerously and need an immediate workaround, you can try using --no-sandbox.

Chromiumがデフォルトで開いているsandboxに問題があるようです.上のテストコードを変更してsandbox機能を無効にします.
browser = await launch(args=['--no-sandbox', '--disable-setuid-sandbox'])

再実行、出力成功!
lpwm@DESKTOP-5RBREN9:~/myPy$ python3 t1.py
/usr/lib/python3/dist-packages/requests/__init__.py:80: RequestsDependencyWarning: urllib3 (1.25.6) or chardet (3.0.4) doesn't match a supported version!
  RequestsDependencyWarning)
Quotes: 10

コードインスタンス
Webサイトのスクリーンショットの取得
import asyncio
from pyppeteer import launch
from pyquery import PyQuery as pq

async def main():
    browser = await launch(args=['--no-sandbox', '--disable-setuid-sandbox'])
    page = await browser.newPage()
    #       
    await page.setViewport({'width':1500, 'height':2000})
    await page.goto('http://www.jd.com')
    await page.screenshot({'path': 'py_screenshot.png'})
    await browser.close()

asyncio.get_event_loop().run_until_complete(main())