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

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

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

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

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Python 3.x

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

6141閲覧

画面遷移がJavascript:void(0)で無効な上、data-offsetを使って画面を更新しているウェブサイトのスクレイピング方法

PenPenMark06

総合スコア5

スクレイピング

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

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Python 3.x

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2019/08/22 01:25

編集2019/08/22 05:12

前提・実現したいこと

厚生労働省の介護事業所・生活関連情報検索から事業所のリストを取得したいと思っています。
このサイトは次ページへのリンクでhref=javascript:void(0)を使用している為、次ページに行く際にURLが変更されずにスクレイピングの仕方が分かりません。

全く同じ様なteratailの質問をここで見つけたのですが、requestで取得したページが欲しいものとは別で上手くいきませんでした。(URLはhttp://www.kaigokensaku.mhlw.go.jp/13/index.php?action_kouhyou_pref_search_list_list=trueに変えて行いました)

この様に画面遷移が無効になっていてdata-offsetを使って見た目を更新しているサイトのスクレイピングの仕方をどうか教えて頂けないでしょうか?

よろしくお願い致します。

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

また、検証モード->ネットワークで次ページをクリックした際の詳細URLをChromeに直接打ち込んで飛んでみましたが、以下の様な画面が表示されてしまいます。

ネットワークで取得した詳細URLを直接Chromeに打ち込んで画面に飛んだ際の表示画面

該当のソースコード

python3

1from selenium import webdriver 2from selenium.webdriver.chrome.options import Options 3from google.colab import files 4from bs4 import BeautifulSoup 5import time 6import requests 7import pandas as pd 8 9 10columns = ["Name"] 11df = pd.DataFrame(columns=columns) 12 13search_url = "http://www.kaigokensaku.mhlw.go.jp/13/index.php?action_kouhyou_pref_list_result=true&method=pager&p_count=5&p_offset=0&p_sort_name=FreeNumUpdateDate&p_order=1" 14 15options = webdriver.ChromeOptions() 16options.add_argument('--headless') 17options.add_argument('--no-sandbox') 18options.add_argument('--disable-dev-shm-usage') 19driver = webdriver.Chrome('chromedriver',options=options) 20driver.get(search_url) 21time.sleep(10) 22html = driver.page_source.encode('utf-8') 23soup = BeautifulSoup(html, "html.parser") 24print(soup.prettify()) 25 26# # ここから下は普通にスクレイピングを行なっていく。 27 28sections = soup.find_all("li", {"class": "listItem"}) 29 30for section in sections: 31 name = section.find("a", {"class" : "noLink"}).get_text() 32 if (name != ''): 33 se = pd.Series([name], columns) 34 df = df.append(se, columns) 35 36df

result

1 2<html> 3 <head> 4 </head> 5 <body> 6 </body> 7</html> 8 9Name 10

試したこと

  • requestを使ってみる

空の画面が表示されてしまいました。

  • 普通にSeleniumを使ってみる(このサイトがJSでデータを反映させている為)

最初のページはスクレイピング出来るのですが、2ページ目以降がページ遷移の仕方が分からずに出来ませんでした。

  • この質問の回答をカスタマイズしつつ試しみてる

空の画面が表示されてしまいました。

  • 検証->ネットワークから得た次ページのURLの詳細を使ってスクレイピングをしてみる

上記のエラーに添付した画像の様な物が表示されてしまいました。

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

上記コードはGoogle Colabを使って動かしています。

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

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

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

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

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

Lhankor_Mhy

2019/08/22 08:31

「発生している問題・エラーメッセージ」に書かれているデータを取得するのが一番早いのではないかと思いますが、それではダメなのでしょうか?
PenPenMark06

2019/08/22 08:57

質問への追記・修正の依頼ありがとうございます。 もしそれが可能なら一番早いのかも知れません。 それに関してもやり方が分からないので、ご教授頂けないでしょうか? teratailにも今回入ったばかりでこういう際にどうすればいいのか分からないのですが、別に質問をたてた方が宜しいでしょうか?
Lhankor_Mhy

2019/08/22 09:02 編集

私もseleniumはあまり詳しくないのでここに書いているのですが、requestでJSONを取得、パースして文字列を取得するのではダメでしたか?
PenPenMark06

2019/08/28 08:14

Lhankor_Mhy様 返答遅くなり大変申し訳ありませんでした。 Lhankor_Mhy様、barobaro様の仰る通り、JSONで無事に取得する事が出来ました。 ありがとうございました。
Lhankor_Mhy

2019/08/28 08:27

ご解決されて何よりです。
guest

回答2

0

ベストアンサー

Lhankor_Mhyさんも書かれていますがJSON取得ではだめなのでしょうか?

あとはoffsetを変えれば取得できます。

python

1import requests 2 3r = requests.get("http://www.kaigokensaku.mhlw.go.jp/13/index.php?action_kouhyou_pref_search_search=true&method=search&p_count=50&p_offset=0&p_sort_name=FreeNumUpdateDate&p_order=1") 4 5# エンコード 6# r.encoding = r.apparent_encoding 7 8r.encoding = "UTF-8-SIG" 9 10data = r.json() 11 12for i in data["data"]: 13 print(i["JigyosyoName"])

投稿2019/08/24 02:16

barobaro

総合スコア1286

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

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

PenPenMark06

2019/08/28 08:12

返答遅くなってしまい大変申し訳ありませんでした。 barobaro様の回答で無事にスクレイピングを行う事が出来ました。 ありがとうございました。
guest

0

こんな感じですかね。検証してないので間違ってたらすみません。

python

1from selenium.webdriver.support.select import Select 2from selenium.webdriver.support.ui import WebDriverWait 3from selenium.webdriver.support import expected_conditions as EC 4from selenium.webdriver.common.by import By 5 6# サイトにアクセス 7driver.get('http://www.kaigokensaku.mhlw.go.jp/13/index.php?action_kouhyou_pref_search_list_list=true') 8 9# 50件表示に変更 10Select(driver.find_element_by_id('displayNumber').select_by_value('50') 11 12# 無限ループ 13while True: 14 15 # 事業所名をprint 16 for a_tag in driver.find_elements_by_class_name('noLink'): 17 if a_tag.txt != '': 18 print(a_tag.txt) 19 20 # 「次へ」をクリック 21 # 最終ページまで行ってたらエラーが起こるので無限ループ終了 22 try: 23 driver.find_elements_by_link_text('次へ>')[0].click() 24 WebDriverWait(driver, 7).until(EC.element_to_be_clickable(By.ID, 'toggleGoogleMapBtn')) 25 except Exception: 26 break

次へをクリックした後、ajaxか何かの遷移が完了するまで待ってやる必要がありますが、
「「地図を開く」ボタンがクリックできるまで最大で7秒待つ」としています。

投稿2019/08/24 00:49

shirai

総合スコア1289

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

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

PenPenMark06

2019/08/28 08:16

shirai様 ご丁寧にコード付きでの回答ありがとうございます。 残念ながらエラーが度々起きてしまい完成に至る事は出来ませんでしたが、別の方の回答でやりたい事が出来ました。 また機会がありましたら、その時はどうぞよろしくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問