🤟
pyppeteer をプロキシ環境下で使う
※ローカルな環境にメモしてた内容を転記
認証無しプロキシを使う。パッケージマネージャは poetry
を使用。
- プロキシ設定を OS で実施
-
Windows ならネットワーク設定 + 環境変数(下記)
http_proxy=http(s)://host:port
https_proxy=http(s)://host:port
no_proxy=localhost, 127.0.0.1
-
アプリ側で
pyppeteer.launch()
を呼び出すときにプロキシ URL を渡すpyppeteer.launch({"args": ["--proxy-server=http(s)://host:port"]})
-
ブラウザ自動操作ツール 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 されてしまう。
http_proxy=http(s)://host:port
https_proxy=http(s)://host:port
no_proxy=localhost, 127.0.0.1
Discussion