Pythonで中古住宅情報をスクレイピングしてみた
住宅情報サイトを見ていて、1つずつ情報を見るよりも、「データ形式でざっと全体像を把握したい」って思うことがあり、スクレイピングで解決してみた
今回は、 SUUMOから情報を取得してみました。
スクレイピングのコード
BeautifulSoup
を使いました。
import requests from bs4 import BeautifulSoup import pandas as pd from time import sleep pages = '1' # 対象URL url = f"https://suumo.jp/jj/bukken/ichiran/JJ012FC001/?ar=060&bs=021&sa=01&ta=27&po=0&pj=1&pc=100&pn={pages}" res = requests.get(url) soup = BeautifulSoup(res.text,'html.parser') # 検索結果件数からページ数を算出 post_count = soup.select('div.pagination_set-hit')[0].text post_count = post_count.replace('件', '').replace(',', '').strip() max_page = math.ceil(int(post_count) / 100) # ページ数の数だけループ list_all = [] for page in range(1, (max_page + 1)): pages = page res = requests.get(url) soup = BeautifulSoup(res.text,'html.parser') # get htmltag title = soup.find_all('h2') price = soup.select('span.dottable-value') addr = soup.find_all('dt', text='所在地') access = soup.find_all('dt', text='沿線・駅') land_area = soup.find_all('dt', text='土地面積') build_area = soup.find_all('dt', text='建物面積') year_built = soup.find_all('dt', text='築年月') # 取得したページhtmlからタグ取得 # 1ページあたりの表示数は100 なので100でループ処理 for i in range(100): csv_list = [] csv_list = [ title[i].a.string, "https://suumo.jp" + title[i].a['href'], price[i].string.replace('万円',''), addr[i].find_next_sibling().text, access[i].find_next_sibling().text, land_area[i].find_next_sibling().text.split('m')[0], build_area[i].find_next_sibling().text.split('m')[0], year_built[i].find_next_sibling().text, ] list_all.append(csv_list) sleep(10) # リストをユニークに変換 def get_unique_list(seq): seen = [] return [x for x in seq if x not in seen and not seen.append(x)] # dataframeへ格納 header = ['タイトル','URL','価格','所在地','沿線・駅','土地面積','建物面積','築年月'] df = pd.DataFrame(get_unique_list(list_all), columns=header)
こんな感じで、それぞれの住宅情報がデータ形式にできました。
あとは集計するなり分析するなり、いろいろできそう。
やってること
対象URLの部分には、SUUMOでスクレイピングしたい条件で検索し、検索結果で表示された一覧ページを入力します。
結果ページのページ数を数えて、ページ分だけループ処理して取得してきます。
複数の住宅情報サイトからスクレイピングして比較してみるのも面白そうですね。