目次
- 概要
- 本題
- あとがき
概要
こんにちは中学校の先生です。先日縁あって不動産を買う機会がありました。
その中で『業者さんの情報って忖度入ってるよなあ』と感じたので、自分で情報収集したくなりました。
ただどのサイトも非常に情報が多く、pythonを活用してみよう!と思い立ちました。
プログラミング初心者としての備忘録になりますので、苦労した点が多めです。
本題
- コードの内容 早速本題。作ったものはこちらになります。
- 利用したライブラリ
- retry 色んな人が使ってたのでとりあえず入れました。効果は実感できてないです。
- requests htmlの取得に使用。
- Beautifulsoup htmlから特定のデータを抜き出します。まじ便利。ここでクラスをちゃんと見て情報を抜き出すのに時間がかかりました。
- pandas データを整理してくれる賢い子。ついでにcsvで出力までしてくれる(予定)。
- 先行研究との差異 ググると多くの方が賃貸物件の検索にスクレイピングを利用されていました。今回私は購入のために相場観が知りたかったので、中古マンションの購入に焦点を当てています。
- 苦労したこと
- スクレイピング対策の対策 現在はURLに中括弧を入れると、さまざまなサイトで弾かれてしまうようです。
- クラスの選定 htmlを見慣れていなかったので、タグが多くて目が疲れました。
不動産価格参照ツール
from re import T
from ssl import SSL_ERROR_WANT_X509_LOOKUP
from retry import retry
import requests
from bs4 import BeautifulSoup
import pandas as pd
#対象サイトのURL
want_url = "(省略)"
#10秒おきに3回リトライ
@retry(tries=3,delay=10,backoff=2)
#html取得関数を定義
def get_html(url):
r = requests.get(want_url)
soup = BeautifulSoup(r.content,"html.parser")
return soup
#データの代入先を定義
all_data=[]
#最後のページを求める(現在は手作業)
max_page=2
#最後のページまで繰り返し
for page in range(1,max_page+1):
#urlを取得
url=want_url.format(page)
#htmlを取得
soup=get_html(url)
#物件の数を取得
items=soup.select("div.click_Row")
#物件の数だけ情報を収集
for item in items:
item_data={}
item_data["名称"]=item.select(".click_R_link")
item_data["所在地"]=item.select("item_location")
item_data["価格"]=item.select("p.item_price")
item_data["アクセス"]=item.select("p.item_access")
item_data["築年数"]=item.select(".item_5")
item_data["面積"]=item.select(".item_4")
#データを代入し一時保管
all_data.append(item_data)
#データフレームを作成
df=pd.DataFrame(all_data)
print(df)
サイトによってクラスのつけ方が変わってくるので、センスの違いが見え隠れして楽しかったです。
そうなると必要な情報が少なくなるので、コードがすっきりしました。
最初は何度やってもうまくいかず、原因究明と対策に数時間かかりました。
Beautifulsoupでh1タグやdivタグでおおまかに抽出→print→ログを見て判断、の繰り返しでスクレイピングできるサイトを必死に探しました。
またfindとselectのどっちを使ったらいいかわからず、右往左往したので、括弧の中身も何度も書き直してしまいました。
あとがき
今後の課題は- データ出力 今後はcsvで出力したものを整理し、グラフにしたいと思っています。
- ページ数の自動取得 最後のページを手作業で入力していたため、これを自動で取得できるようにしたいです。
- 操作ページの作成 VSCode上でしか動作していないため、htmlで操作できるページを作りたいなあと思っています。
- 他ページへの対応 中古マンションの23区付近で絞って検索をかけました。URLの規則性を見て、地域や他条件も勝手にいじってくれるといいなあ。
同時に平均値と中央値を求め、購入する上での参考にしたいです。
(実動3日、20時間程度)
今回は以上になります。最後まで閲覧いただきありがとうございました。