質問するログイン新規登録
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

4803閲覧

python maxRetryError 対策

tttkkk

総合スコア38

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/03/15 13:29

0

0

maxRetryErrorの対策方法につきまして、
その対策方法自体に疑問がありましたので質問させていただきました。

for分を使用したスクレイピングによるmaxRetryErrorを回避する方法として
for分の中にヘッドレスブラウザの設定を組み込んでしまうことで対処できると紹介されておりました。
これはどうしてforの中でその都度ヘッドレスブラウザの設定をすることでmaxRetryErrorを回避することができるのでしょうか。

開発環境は
google colab
Python 3.7.12
一応ですがOSはwindows10です。

以下に詳細を記載させていただきます。

seleniumを使用してスクレイピングをしており
forを使用した繰り返し処理において、目的のwebページに飛ぶ際に上記エラーが生じてしまいました。

以下に簡潔にですがエラーが出た際のサンプルコードを記載いたします。

python

1options = webdriver.ChromeOptions() 2options.add_argument('--headless') 3options.add_argument('--no-sandbox') 4options.add_argument('--disable-dev-shm-usage') 5browser = webdriver.Chrome('chromedriver', options = options) 6 7keyword_list = [asd, adis, agau, aksia, siaug, sksi, aisia] 8url1 = 'https://*******' 9url2 = 'https://+++++++' 10 11for i in range(len(keyword_list)): 12 browser.get(url1) 13 input_box1 = browser.find_element(by = By.NAME, value = 'input1') 14 input_box1.send_keys = keyword_list[i] 15 # 以下url1におけるhtml取得などの処理 16 17 browser.get(url2) 18 input_box2 = browser.find_element(by = By.NAME, value = 'input2') 19 input_box2.send_keys = keyword_list[i] 20 # 以下url2におけるhtml取得などの処理

上記のコードで最初の
browser.get(url1)
の部分でmaxRetryErrorとなってしまいました。

ネットで解決策を探してみましたところ以下サイトに対処方法が乗っておりその通りにすることでエラーの対処は自体はできました。
https://qiita.com/S8s8Max/items/035742cf061419d827c6

対処方法のサイトを参考にしまして修正した私のコードが以下でございます。

python

1keyword_list = [asd, adis, agau, aksia, siaug, sksi, aisia] 2url1 = 'https://*******' 3url2 = 'https://+++++++' 4 5for i in range(len(keyword_list)): 6 options = webdriver.ChromeOptions() 7 options.add_argument('--headless') 8 options.add_argument('--no-sandbox') 9 options.add_argument('--disable-dev-shm-usage') 10 browser = webdriver.Chrome('chromedriver', options = options) 11 12 browser.get(url1) 13 input_box1 = browser.find_element(by = By.NAME, value = 'input1') 14 input_box1.send_keys = keyword_list[i] 15 # 以下url1におけるhtml取得などの処理 16 17 browser.get(url2) 18 input_box2 = browser.find_element(by = By.NAME, value = 'input2') 19 input_box2.send_keys = keyword_list[i] 20 # 以下url2におけるhtml取得などの処理

私が修正した内容は、対処方法のサイトにもある通りですが、ヘッドレスブラウザの設定をforの中に組み込んでしまうことです。
もちろんこれでエラーは出なくなりました。

ここで冒頭の疑問に戻るのですが、どうしてこの方法でmaxRetryErrorを回避できるのでしょうか。
またmaxRetryErrorは同じコードであってもエラーが出る時と出ないときがあるようなのですが、それはなぜなのでしょうか。

稚拙な質問かとは思うのですが、教えていただけますと幸いです。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

この「対策」なるものの本質は、「ヘッドレスブラウザの設定をforの中に組み込んでしまうこと」というよりも、「forループごとに、driverオブジェクトを生成している」ことにあるのではないでしょうか。

もとのQiitaの記事のコードは、ループごとに同じ設定(option)の生成を無意味に行っており、実際は下記で足るはずです。

py

1keyword_list = [asd, adis, agau, aksia, siaug, sksi, aisia] 2url1 = 'https://*******' 3url2 = 'https://+++++++' 4 5options = webdriver.ChromeOptions() 6options.add_argument('--headless') 7options.add_argument('--no-sandbox') 8options.add_argument('--disable-dev-shm-usage') 9 10for i in range(len(keyword_list)): 11 browser = webdriver.Chrome('chromedriver', options = options) 12(以下略)

上記でエラーが発生しなくなる理由:
一度webdriverオブジェクトを生成してそれをずっと使いまわすということは、ブラウザのセッションを使いまわすことになります。
結果、同一のセッションで定期的にアクセスしてくるクライアントを、ウェブサイト側がbotと判断してアクセスを拒否し、MaxRetryErrorが発生した可能性があります。

上のようにループごとにwebdriverオブジェクトを生成すれば、その度に異なるセッションを張ることになるので、botと判断されにくくなり、エラーが発生しにくくなったのではないでしょうか。

投稿2022/03/15 13:51

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tttkkk

2022/03/16 13:38

非常に分かりやすいご説明をありがとうございます。 納得することができました。 qnoir様はエラーが発生しにくいという表現をしようておりますが ループごとにwebdriverオブジェクトを生成してもエラーが発生する可能性は捨てきれないということなんですね。 勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問