歩いたら休め

If the implementation is easy to explain, it may be a good idea.

【Python】pyppeteerでのクローリング時に別ドメインのCSSを読み込む

pyppeteerを使ってクローリングする際、「JSを実行して値を取り出す」ため、セキュリティのための制限にひっかかることが割とあるようです。

私の場合、CSSの情報を取り出す際に、以下の問題に引っかかりました。

> document.styleSheets[0].cssRules
VM52621:1 Uncaught DOMException: Failed to read the 'cssRules' property from 'CSSStyleSheet': Cannot access rules
    at <anonymous>:1:25

一部のブラウザーでは、スタイルシートが異なるドメインから読み込まれている場合、cssRules の呼び出しで SecurityError が発生します。

自分や自社が管理するサイトの開発時のE2Eテストのような要件であればCORS (Cross-Origin Resource Sharing)の設定で対処できそうなのですが、私の場合はクローリングの案件だったのでその方法は使えません。Headless Chromeの起動オプションで指定できるそうなのでそちらで対処しました。

stackoverflow.com

上の記事ではpuppeteer(pyppeteerの元ネタのnode.jsのライブラリ)の話題ですが、pyppeteerでもほとんど同様に操作できます。

from pyppeteer import launch

async def main():
    browser = await launch(headless=True, args=['--disable-web-security'])
    # 以下、操作

小規模で、信頼できるサイトのクローリングならこれで問題ないと思っています。