はじめに
ブラウザ操作を自動化するライブラリのSelenium。
Seleniumのfind_elementメソッド遅くて正直しんどくないですか?
特に大量のデータを扱うときなんかだと、イライラしてキーボードを投げたくなっちゃうこともしばしば…。
そんな時は、page_source
をもってきてlxmlに食わせてしまいましょう。
動作環境
- Python 3.12.3
- google-colab-selenium-1.0.13
どのくらい違うの?
以下のコードで実行時間を比較してみました。
今回は、例として、Yahoo Japanからリアルタイム検索で話題のキーワードを取得します。
import google_colab_selenium as gs
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import datetime
import lxml.html
import lxml.cssselect
options = Options()
options.add_argument("--headless")
options.add_argument('--disable-dev-shm-usage')
options.add_argument("--no-sandbox")
options.add_argument("--lang=ja")
driver = gs.Chrome(options=options)
start_time = datetime.datetime.now()
# Yahoo Japanからリアルタイム検索で話題のキーワードを取得
driver.get("https://www.yahoo.co.jp/")
# find_elementsで要素を探索
results = driver.find_elements(By.CLASS_NAME, "_35gOEPVmLqF0YTra3WRwfD")
end_time = datetime.datetime.now()
for val in results:
print(val.text)
find_elements_return_time = end_time - start_time
print(f"\nfind_elements実行時間: {find_elements_return_time}\n")
start_time = datetime.datetime.now()
# Yahoo Japanからリアルタイム検索で話題のキーワードを取得
driver.get("https://www.yahoo.co.jp/")
# lxmlによる探索
html = lxml.html.fromstring(driver.page_source)
results = html.cssselect("._35gOEPVmLqF0YTra3WRwfD")
end_time = datetime.datetime.now()
for val in results:
print(val.text)
lxml_return_time = end_time - start_time
print(f"\nlxml実行時間: {lxml_return_time}")
driver.quit()
実行してみるとこんな感じ
lxmlでの取得は約1秒で終わったのに対し、find_elementsでの取得では約2秒かかっていて、処理時間に大きな差がありました。
今回のように1つの要素のみを取得する場合はあまり差が出ませんでしたが、ページの内容が増えれば増えるほど、この差はさらに大きくなります。
まとめ
Seleniumでfind_elements
が遅いと感じているなら、ぜひlxmlを試してみてください。
きっとしあわせになれるでしょう。
それではそれでは。