Kohei Blog

夫・父親・医療系エンジニア

厚労省の介護情報サイトからPythonでスクレイピング

f:id:kei_01011:20210618130531p:plain

ランサーズに掲載されている「スクレイピング」関連の案件を、実際に受注したと過程してやってみようと思います。

今回はこちら

【1ヶ所のみ抽出】介護の情報データベースのサイトからのスクレイピングの依頼・外注 | Webシステム開発・プログラミングの仕事・副業 【クラウドソーシング ランサーズ】[ID:2593180]

依頼内容

静岡県内に特化した介護・福祉の求人サイトを運営しており、正確なデータベースが必要なので、「介護情報サービス」というサイトから静岡県内のみの「事業開始年月日」という項目をスクレイピングをお願いします。

スクレイピング対象サイトはこちらのようです。

www.kaigokensaku.mhlw.go.jp

見た感じ、そこまで難しくなさそう。 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)

結果

f:id:kei_01011:20210618130102p:plain

CSVで出力することに成功しました。

作業時間だけだと、約1時間くらい。 あくまでも、CSVのデータ納品だと過程しての作業でしたが、、

1点うまく行かなかったのが、

Seleniumのwebdriverで、ヘッドレスモードにしたらうまく取得できなかった。 ユーザーエージェントを入れてもだめで、スクリーンサイズを指定してもだめだった。。

ちょっと原因不明なので、この件はまた別で調査することにします。 」