環境
- MacOS : Catalina - 10.15.7
- Python : Python 3.6.8
- Selenium : 3.141.0
概要
業務で、競合他社のGoogle検索順位を調べるバッチ作成をしていたときのお話。
数個の「キーワード」をループでそれぞれ検索して、指定する他社のドメインが出てくるかをチェックするようなバッチだった。
以下、ソースコードに似たコード例を載せる。
sample.py
from selenium import webdriver
import chromedriver_binary
from selenium.webdriver.chrome.options import Options
# Chromeに接続して引数で検索する
def search(driver, word):
driver.get("https://www.google.com")
search = driver.find_element_by_name('q')
search.send_keys(word)
search.submit()
return driver.page_source
def parse():
...省略...
options = Options()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-gpu')
driver = webdriver.Chrome(options=options)
for kw in keyword:
# 検索欄にキーワードを入れて検索した後に現れる結果画面のソース
source = search(driver, kw)
result = analyze(source)
...省略...
キーワードが文字列のリストになっているから、一つずつ取り出して検索をかけて結果を得るって感じのコード。
しかし、実行すると、
エラー発生
urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='127.0.0.1', port=51691):
Max retries exceeded with url: /session/fd963d7b05fb4b6344e0e8034c73ea67/url
(Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fc4e2773f60>:
Failed to establish a new connection: [Errno 111] Connection refused',))
上の例外が吐き出された。
試したこと
-
urllib3
を最新にアップグレード -
time.sleep(10)
で検索の間隔を空けた
最初はurllib3
のバージョンが悪いのかなと思ったけど違うっぽい
解決方法
結局、「設定したドライバーを検索ごとに再設定」したらいけた。
どういうことかというと、
sample.py
def parse():
...省略...
options = Options()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-gpu')
driver = webdriver.Chrome(options=options)
for kw in keyword:
# 検索欄にキーワードを入れて検索した後に現れる結果画面のソース
source = search(driver, kw)
result = analyze(source)
...省略...
上のoptions = Options()
からdriver = webdriver.Chrome(...)
のところを、
sample.py
def parse():
...省略...
for kw in keyword:
# 検索欄にキーワードを入れて検索した後に現れる結果画面のソース
options = Options()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-gpu')
driver = webdriver.Chrome(options=options)
source = search(driver, kw)
result = analyze(source)
...省略...
for文の中に入れて、検索するときはその都度ヘッドレスに設定することにした。
備考
- Selenium のバージョン確認方法
Terminalから python3
を叩いて、下記を実行する。
この書き方じゃダメなモジュールもある。普通にpip3 list | grep "module name"
の方が簡単かもしれない。
>>> import selenium
>>> selenium.__version__
'3.141.0'