前提・実現したいこと
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
あなたの回答
tips
プレビュー