LoginSignup
8
5

More than 3 years have passed since last update.

SeleniumでハマったMaxRetryErrorの解決法

Posted at

環境

  • 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'
8
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5