ちょっとハマりました。
Puppeteerでスクレイプ対象のhtml以外をプロキシから外す指定
スクレイピングをする時にPuppeteerを使うんですが、プロキシサービスを併用しています。このプロキシが流量でチャージされるので、コスト削減を目的にチューニングしました。
プロキシサービスのログ
プロキシサービスのログを見ていると、対象ページのドメイン以外に、見慣れない、けど見慣れたドメインが色々出ていて気になっていました。
www.google.comとかwww.googletagmanager.comとか。
あ、これはPuppeteerで読み込んでるページに貼られれている広告だったりGTMだったりだなー、と気づきましたが、それもプロキシに通してるのは結構コスト無駄ですね。
なので色々と試してみました。
ここなどで紹介されている方法はすごく洗練されてていいですね。
page.setRequestInterception(true)
でコネクションの接続先URLをチェックして不要なもの(というか最初に指定したURL以外)をabort()する、という方法。
ただ接続先サイトによってはうまく動作せずにTimeoutになってしまうこともありました。
プロキシサービスにも接続先ドメインのホワイトリスト、ブラックリストがあったのですが、これは最初のリクエストだけしか有効ではなく、今回のケースには使えず。
で、色々こねくり回して見つけた方法がこちら。
puppeteer.launch()のオプション
pupeeteer.launch()でargsでオプション指定できますが、最終的に有効だった指定はこれでした。
‘–proxy-bypass-list=www.google.com;www.googletagmanager.com;*.google.com;*.doubleclick.net;*.cloudflare.com;*.googleapis.com’,
–proxy-bypass-listで指定された文字列にマッチするホストはプロキシ無しでつなぐ、というオプション。禁止するわけではなくプロキシを通さなくする、というのがポイントです。
ホントはこれを繋がないオプションがあればベストなのですが、どれも上手くマッチしなかったです。
なのでこの方はプロキシ利用前提で流量削減のときのみ有効です。