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

最終更新日:  

python selenium


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

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

selenium-wireのgithubページ


追記(2021/09/30)

Chromeを使う場合、execute_cdp_cmdを使ってリクエストのブロックを行うこともできます(こちら)。
他のパッケージを使わなくてよいので手っ取り早いです。

さらに追記(2022/06/05)

なぜかわかりませんが、execute_cdp_cmdを使う方法だとブロックできないものがありました。今のところ selenium-wire の方が安定するのでそちらを使用しています。


実行環境

  • 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をブロック(定義した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/')

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

広告のURLの見つけ方

広告ブロックの拡張機能を入れたブラウザでページにアクセスすると、開発者ツールの「コンソール」タブや「ネットワーク」タブなどでブロックされたURLを確認することができます。それで見つけたURLをブロックするようにプログラムを作ればよいです。

参考

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

(追記 2021/09/30)execute_cdp_cmdを使うやり方

Chromeを使う場合はexecute_cdp_cmdを使う手もあります。
seleniumがインストールされていれば使えるので、こちらのほうが手っ取り早いです。

driver.execute_cdp_cmd('Network.enable', {})
driver.execute_cdp_cmd('Network.setBlockedURLs', {
    'urls': [
        'pvtag.yahoo.co.jp',
        'b5.yahoo.co.jp',
        's.yjtag.jp',
        'yads_vimps.js',
        'logql.yahoo.co.jp',
        '*.png',
        '*.jpg',
        '*.gif',
    ]})


関連記事