厚労省の介護情報サイトからPythonでスクレイピング
ランサーズに掲載されている「スクレイピング」関連の案件を、実際に受注したと過程してやってみようと思います。
今回はこちら
【1ヶ所のみ抽出】介護の情報データベースのサイトからのスクレイピングの依頼・外注 | Webシステム開発・プログラミングの仕事・副業 【クラウドソーシング ランサーズ】[ID:2593180]
依頼内容
静岡県内に特化した介護・福祉の求人サイトを運営しており、正確なデータベースが必要なので、「介護情報サービス」というサイトから静岡県内のみの「事業開始年月日」という項目をスクレイピングをお願いします。
スクレイピング対象サイトはこちらのようです。
見た感じ、そこまで難しくなさそう。 SPAだったので、seleniumを使ってスクレイピングしました。
スクレイピング
ライブラリをインポート
from bs4 import BeautifulSoup import requests import pandas as pd from time import sleep from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.select import Select import math
driverを起動、
url = 'https://www.kaigokensaku.mhlw.go.jp/22/index.php?action_kouhyou_pref_search_list_list=true' op = Options() op.add_argument("--disable-gpu"); op.add_argument("--disable-extensions"); op.add_argument("--proxy-server='direct://'"); op.add_argument("--proxy-bypass-list=*"); op.add_argument('--user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36') op.add_argument('--no-sandbox') op.add_argument('--lang=ja-JP') driver = webdriver.Chrome('/Users/user/driver/chromedriver',options=op) driver.get(url) res = requests.get(url) soup = BeautifulSoup(res.text,'html.parser')
# 最大ページ数を取得 dataNum = driver.find_element_by_class_name('allDataNum') post_count = dataNum.text post_count = post_count.replace('件','') max_page = math.ceil(int(post_count) / 50) # selectboxを操作 # 50件表示に変更 select_element = driver.find_element_by_id('displayNumber') select_object = Select(select_element) select_object.select_by_value('50')
最大ページ数をループさせてスクレイピング
all_data = [] for page in range(0,(max_page)): links = driver.find_elements_by_class_name('detailBtn') links.pop() link_list = [] for link in links: link_list.append(link.get_attribute('href')) for link in link_list: add_data = {} res = requests.get(link) soup = BeautifulSoup(res.text,'html.parser') startDateThTag = soup.find('th',string='事業開始年月日') startDate = startDateThTag.next_sibling.next_sibling.text title = soup.find('span',{'id':'jigyosyoName'}).text add_data['title'] = title add_data['startDate'] = startDate all_data.append(add_data) sleep(3) try: next_button = driver.find_elements_by_class_name('page-link') next_button[-1].click() except: print('error') sleep(5) driver.close() driver.quit() df = pd.DataFrame(all_data)
結果
CSVで出力することに成功しました。
作業時間だけだと、約1時間くらい。 あくまでも、CSVのデータ納品だと過程しての作業でしたが、、
1点うまく行かなかったのが、
Seleniumのwebdriverで、ヘッドレスモードにしたらうまく取得できなかった。 ユーザーエージェントを入れてもだめで、スクリーンサイズを指定してもだめだった。。
ちょっと原因不明なので、この件はまた別で調査することにします。 」