Python Selenium でコンソールを非表示にする
Python Selenium を実行すると ChromeDriver のコンソールウィンドウが表示されてしまいます。 …
selenium の読み込みスピードを速くするために、広告などの邪魔なjsをブロックしたいと思いました。
selenium-wire というライブラリを使用すると簡単にできたので紹介します。
selenium-wire は Python の selenium を拡張するパッケージです。
ブラウザのリクエストをキャプチャリングして、リクエストを変更したり遮断したりできます。
selenium-wire の独自の部分以外は元の selenium と同じなので、 selenium をいじったことがある人にとってはすぐに使えます。
追記(2021/09/30)
Chromeを使う場合、execute_cdp_cmdを使ってリクエストのブロックを行うこともできます(こちら)。
他のパッケージを使わなくてよいので手っ取り早いです。
さらに追記(2022/06/05)
なぜかわかりませんが、execute_cdp_cmdを使う方法だとブロックできないものがありました。今のところ selenium-wire の方が安定するのでそちらを使用しています。
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をブロックするようにプログラムを作ればよいです。
リクエストだけでなくレスポンスもいじれます。
他にもさまざまな機能があるので、気になった人は本家ページを見てください。
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',
]})
Python Selenium を実行すると ChromeDriver のコンソールウィンドウが表示されてしまいます。 …
Python で Selenium を使ったプログラムを PyInstaller で実行ファイル化する自分用まとめです。 …
Python & Seleniumで作成したプログラムを実行形式(.exe)にします。 特に今回は一つのexeフ …
Ajaxなんかで動的に変化するページの場合は、ページが変更完了するまで待ちたい場合があります。 そういうときは特定の条件 …
PyInstallerを使えば簡単にexeを作成できますが、1つのフォルダに複数のexeを作るにはどうすればよいのか分か …
Google ColaboratoryでStable Diffusion web UIを使って画像を生成していると、たま …
Pythonでフォントをサブセット化(使う文字だけを抽出して軽量化)する方法を紹介します。