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

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

新規登録して質問してみよう
ただいま回答率
85.48%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Python

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

selenium

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

Q&A

解決済

1回答

1479閲覧

Web Scraping スタバHPでWebDriverExceptionが出る際の対処法

wayway

総合スコア11

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Python

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

selenium

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

0グッド

0クリップ

投稿2020/09/30 02:36

####状況
WebScrapingの勉強をしています。
試しにスターバックスコーヒーの店舗一覧(名前+住所)を取得しようとしています。
https://store.starbucks.co.jp/?keyword=)

なおrobots.txtは下記の通り、スクレイピングは禁止されていません。
User-Agent: *
Sitemap: https://store.starbucks.co.jp/sitemap.xml

####問題
スタバのHPはJavascriptを使用しており、「もっと見る」ボタンをクリックしないと、すべての店舗が表示されない仕様になっています。
そこでseleniumを使用し.click()機能を使用し、全件表示を試みました。

しかし、下記に詳細を記載した通り、WebDriverExceptionが出てしまいます。
どたなか、対処法がお分かりになる方、アドバイス頂けますと幸いです。
どうぞよろしくお願いいたします。

####コード

Python

1import requests 2import time 3import csv 4import pandas as pd 5 6from selenium import webdriver 7from selenium.common.exceptions import ElementNotInteractableException 8from bs4 import BeautifulSoup 9 10#クロームをヘッドレスで立上げ、スタバHPを取得 11options = webdriver.ChromeOptions() 12options.add_argument('--no-sandbox') 13options.add_argument('--headless') 14options.add_argument('--disable-dev-shm-usage') 15driver = webdriver.Chrome(options=options) 16 17driver.get("https://store.starbucks.co.jp/?keyword=") 18time.sleep(1) 19html = driver.page_source 20soup = BeautifulSoup(html, 'lxml') 21 22#最後まで「もっと見る」ボタンをクリック 23while True: 24 try: 25 more_btn = driver.find_element_by_xpath('//*[@id="moreList"]') 26 more_btn.click() 27 time.sleep(1) 28 except ElementNotInteractableException: 29 break 30 31 32#店舗リストを取得する 33detailContainers = soup.find_all('div', class_="detailContainer") 34 35storeNames=[] 36storeAddresses=[] 37 38for detailContainer in detailContainers: 39 storeNames += [detailContainer.find(class_='storeName').get_text()] 40 storeAddresses += [detailContainer.find(class_='storeAddress').get_text()] 41 42storeList = pd.DataFrame( 43 { 44 'storeName':storeNames, 45 'storeAddress':storeAddresses, 46 } 47 ) 48 49print(storeList)

####エラーログ

[vagrant@localhost scraping]$ python scraping_starbucks.py Traceback (most recent call last): File "scraping_starbucks.py", line 26, in <module> more_btn.click() File "/home/vagrant/.local/lib/python3.6/site-packages/selenium/webdriver/remote/webelementpy", line 80, in click self._execute(Command.CLICK_ELEMENT) File "/home/vagrant/.local/lib/python3.6/site-packages/selenium/webdriver/remote/webelementpy", line 633, in _execute return self._parent.execute(command, params) File "/home/vagrant/.local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.y", line 321, in execute self.error_handler.check_response(response) File "/home/vagrant/.local/lib/python3.6/site-packages/selenium/webdriver/remote/errorhandlr.py", line 242, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.WebDriverException: Message: unknown error: session deleted becaus of page crash from unknown error: cannot determine loading status from tab crashed (Session info: headless chrome=85.0.4183.121)

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

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

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

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

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

guest

回答1

0

ベストアンサー

おそらくは[もっと見る]が表示される前にクリックしてしまっている事が原因かと思います。
エラーの詳細については以下をご参考下さい。
Teratail - seleniumでスクレイピング--click()でエラーが発生する

こちらで、視認する為一度ヘッドレスモードを解除してコードを実行した所
正常に動作し、最後までページを表示できております。
実行環境やネット環境にも依存するものだと思うので、ご自身にて調整してみて下さい。

また、掲題のコードではwhile文を実行する前にソースを取得してしまっている為
detailContainersstoreNamesstoreAddresses及びstoreListには
デフォルトで表示されている始めの100件しかデータは格納されておりませんでした。

投稿2020/09/30 05:02

nto

総合スコア1438

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

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

wayway

2020/11/26 13:37

お礼が遅くなり大変失礼致しました。 上記理解致しました、ありがとうございます!!
nto

2020/11/27 02:46

具体的にはtime.sleep()の時間調整と while文内exceptにてエラー発生時に html = driver.page_source soup = BeautifulSoup(html, 'lxml') とそれぞれ定義してあげれば問題なく動作すると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問