🤟

pyppeteer をプロキシ環境下で使う

2022/08/18に公開

※ローカルな環境にメモしてた内容を転記

認証無しプロキシを使う。パッケージマネージャは poetry を使用。

  1. プロキシ設定を OS で実施
    1. Windows ならネットワーク設定 + 環境変数(下記)

      1. http_proxy=http(s)://host:port
      2. https_proxy=http(s)://host:port
      3. no_proxy=localhost, 127.0.0.1
    2. アプリ側で pyppeteer.launch() を呼び出すときにプロキシ URL を渡す

      pyppeteer.launch({"args": ["--proxy-server=http(s)://host:port"]})
      
    3. ブラウザ自動操作ツール puppeteer の python 移植版 pyppeteer に含まれる chromium_downloader.py をちょいと書き換えてプロキシ対応する。my-project\.venv\Lib\site-packages\pyppeteer\chromium_downloader.py にある。

      # 前略
      
      # 78 行目(下記)を変更する
      # with urllib3.PoolManager(cert_reqs="CERT_REQUIRED", ca_certs=certifi.where()) as http:
      # PoolManager ではなく ProxyManager としておく
      with urllib3.ProxyManager(
              proxy_url='http(s)://host:port', 
              cert_reqs="CERT_REQUIRED", ca_certs=certifi.where()
          ) as http:
      
      # 後略
      

やったこと

プロキシ環境下で pyppeteer 使ったツールを使おうとしたら想定する動作をしなかった。アプリ・ツールや環境変数を調整して動くようにした。

プロキシ環境対応

まずは作成したアプリ側で pyppeteer にプロキシ設定を伝える。

import pyppeteer

async def pyppeteer_use_function():
    browser = await launch(
				# プロキシ設定
        {"args": ["--proxy-server=http(s)://host:port"]},
				# これがあると Chromium が正常に起動しない場合がある
        ignoreDefaultArgs=["--disable-extensions"],
        logLevel=logging.WARNING,
    )

次に pyppeteer 側で Chromium ダウンロードを chromium_downloader.py をちょいと書き換えてプロキシ設定

# 前略

# 78 行目(下記)を変更する
# with urllib3.PoolManager(cert_reqs="CERT_REQUIRED", ca_certs=certifi.where()) as http:
# PoolManager ではなく ProxyManager としておく
with urllib3.ProxyManager(
        proxy_url='http(s)://host:port', 
        cert_reqs="CERT_REQUIRED", ca_certs=certifi.where()
    ) as http:

# 後略

最後に OS 設定。特に no_proxy が無いと pyppeteer の落とし穴に引っかかる。Chromium 実行後にループバックアドレスにて処理があるのでこれが無いと Chromium が Kill されてしまう。

  1. http_proxy=http(s)://host:port
  2. https_proxy=http(s)://host:port
  3. no_proxy=localhost, 127.0.0.1

Discussion