質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.46%
Python

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

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

0回答

1020閲覧

PythonのseleniumをHeadlessで使用すると情報が取得できずフリーズする

Kazumori102

総合スコア45

Python

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

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

0クリップ

投稿2021/02/03 10:58

前提・実現したいこと

Pythonのseleniumにて後述のコードにてヨドバシカメラの商品ページの情報を取得したい

発生している問題・エラーメッセージ

数十分オーダーでフリーズします。
Headlessにしなければ普通に動きます。なお、BeautifulSoup、requests-htmlでも同様にフリーズしました。

該当のソースコード

Python

1 2def get_ooyodochan(page_range): 3 """ 4 ヨドバシから情報を取得 5 """ 6 options = webdriver.ChromeOptions() 7 8 # お使いのクロミウム派生ブラウザのパスを入れましょう。 9 browser_path = r"C:\Users\user\AppData\Local\CocCoc\Browser\Application\browser.exe" 10 options.binary_location = browser_path 11 12 #画面無しに 13 options.add_argument('--headless') 14 15 driver = webdriver.Chrome( chrome_options=options) 16 17 result_list = [] 18 for page in range(page_range): 19 driver.get( 20 "https://www.yodobashi.com/category/141001/141651/141671/148240/" 21 f"p{page + 1}/?searchtarget=prodname&sorttyp=RELEASE_DATE_DESC" 22 ) 23 24 name = [ 25 (a.text.split("\n") )[1] 26 for a in driver.find_elements_by_class_name("pName.fs14") 27 ] 28 29 path = '//*[@id="listContents"]/div[3]/div[*]/div[2]/span[2]' 30 date = [a.text for a in driver.find_elements_by_xpath(path)] 31 32 class_name = ( 33 "js_productListPostTag.js-clicklog.js-taglog-schRlt" 34 ".js_smpClickableFor.cImg.js-clicklog-check" 35 ) 36 url = [ 37 a.get_attribute('href') 38 for a in driver.find_elements_by_class_name(class_name) 39 ] 40 41 result_list += [ [date[n], name[n], url[n] ] for n in range(len(date) ) ] 42 driver.close() 43 44 45print(get_ooyodochan(2))

試したこと

内部で開いているWebページの幅が狭いのかとおもい、設定を変えて、広げて実行してみたりしたが特に変わらず。
そもそもページ幅の問題ならば、取得できないだけでフリーズはしないはず。
他のページでは普通にHeadless運用できているのでページとの相性問題なのか?
なお、UAを変えても特に変わらなかった。

補足情報(FW/ツールのバージョンなど)

Python 3.7.4
selenium 3.141.0

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

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

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

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

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

otn

2021/02/13 02:26

driver.set_page_load_timeout(10) と、タイムアウトを短めに設定すると selenium.common.exceptions.TimeoutException: Message: timeout: Timed out receiving message from renderer: -0.004 という例外が発生します。対応困難そうです。
Kazumori102

2021/02/13 15:42

こちらでも確認しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問