Seleniumで広告をブロックし読み込みを速くする【selenium-wire】

公開日:  

python selenium


selenium の読み込みスピードを速くするために、広告などの邪魔なjsをブロックしたいと思いました。
selenium-wire というライブラリを使用すると簡単にできたので紹介します。

selenium-wire は Python の selenium を拡張するパッケージです。
ブラウザのリクエストをキャプチャリングして、リクエストを変更したり遮断したりできます。 selenium-wire の独自の部分以外は元の selenium と同じなので、 selenium をいじったことがある人にとってはすぐに使えます。

selenium-wireのgithubページ

実行環境

  • Windows 10
  • Python 3.9.0
  • selenium-wire 4.2.2
  • selenium 3.141.0

インストール

pip で簡単にインストールできます。selenium も一緒にインストールされます。

pip install selenium-wire

簡単な使い方

普通の selenium とは webdriver のインポート方法が異なります。

from seleniumwire import webdriver

他の selenium でおなじみのクラスなどは、直接 selenium からインポートします。

from selenium.webdriver.support.ui import WebDriverWait

seleniumwire_options を指定して selenium-wire 独自のオプションを渡すことができます。
どんなオプションがあるかは本家ページに書いてあります。

driver = webdriver.Chrome(seleniumwire_options=options)

そのほか普通の selenium と同じように使えます。

広告のブロック

広告で使われるような JavaScript をブロックするには request_interceptor の機能を使います。
以下はドキュメントに載ってた例のそのままですが、リクエストのパスの末尾部分を見て画像をブロックしています。

def interceptor(request):
    # Block PNG, JPEG and GIF images
    if request.path.endswith(('.png', '.jpg', '.gif')):
        request.abort()

driver.request_interceptor = interceptor
driver.get(...)

広告をブロックするには、上記の例と同じようにブロックしたいURLの条件を挿し込めばよいだけです。

以下は Yahoo のトップページにアクセスする例です。
不要なURLをブロックしています。

from seleniumwire import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import WebDriverWait

BLOCK_URLS = [
    'pvtag.yahoo.co.jp',
    'b5.yahoo.co.jp',
    's.yjtag.jp',
    'yads_vimps.js',
    'logql.yahoo.co.jp',
]


def interceptor(request):
    # 画像類をブロック
    if request.path.endswith(('.png', '.jpg', '.gif')):
        request.abort()
    # URLをブロック
    if any([request.url.find(bloc_url) != -1 for bloc_url in BLOCK_URLS]):
        request.abort()


options = webdriver.ChromeOptions()
options.binary_location = 'browser/chrome.exe'
driver = webdriver.Chrome(
    executable_path='driver/chromedriver.exe', options=options)

driver.request_interceptor = interceptor
driver.get('https://www.yahoo.co.jp/')

通常であれば結構読み込みが遅いですが、ブロック処理を入れることで読み込みが速くなります。

参考

リクエストだけでなくレスポンスもいじれます。
他にもさまざまな機能があるので、気になった人は本家ページを見てください。



関連記事