前回(1)では、SUUMOの1ページ目のサイトから不動産情報を取得するところまでトライしました。今回は、複数ページの取得とCSVファイルに格納するまでトライします。
先ずは前回の振り返りから。
from time import sleep
from bs4 import BeautifulSoup
import requests
# 1. アクセスするURLを設定する
url = 'https://suumo.jp/chintai/tokyo/sc_shinjuku/?page={}'
target_url = url.format(1)
print(target_url)
# 2. `Requests`を使って1で設定したURLにアクセスする
r = requests.get(target_url)
# 3. 取得したHTMLを`BeautifulSoup`で解析する
soup = BeautifulSoup(r.text)
d_list = []
# 4. すべての物件情報を取得する(20件)
contents = soup.find_all('div', class_='cassetteitem')
# 5. 各物件情報から「物件の詳細」と「各部屋情報」を取得する
for content in contents:
# 6. それぞれを解析する
detail = content.find('div', class_='cassetteitem_content')
table = content.find('table', class_='cassetteitem_other')
title = detail.find('div', class_='cassetteitem_content-title').text
address = detail.find('li', class_='cassetteitem_detail-col1').text
access = detail.find('li', class_='cassetteitem_detail-col2').text
age = detail.find('li', class_='cassetteitem_detail-col3').text
tr_tags = table.find_all('tr', class_='js-cassette_link')
for tr_tag in tr_tags:
floor, price, first_fee, capacity = tr_tag.find_all('td')[2:6]
fee, management_fee = price.find_all('li')
deposit, gratuity = first_fee.find_all('li')
madori, menseki = capacity.find_all('li')
# 7. 解析した結果を辞書に格納する
d = {
'title': title,
'address': address,
'access': access,
'age': age,
'floor': floor.text,
'fee': fee.text,
'management_fee': management_fee.text,
'deposit': deposit.text,
'gratuity': gratuity.text,
'madori': madori.text,
'menseki': menseki.text
}
d_list.append(d)
d_list = []
以上から、下記の?page={}の中の番号が更新していけば、複数のページが取得できます。
url = 'https://suumo.jp/chintai/tokyo/sc_shinjuku/?page={}'
target_url = url.format(1)
複数ページ取得するにはforループを使っていきます。今回は、1ページから3ページ(1:4)まで取得。
サーバに負荷をかけるの防ぐ為、sleepも使用。
for i in range(1, 4):
#d_listがきちんと代入されているか確認できる。
print('d_listの大きさ:', len(d_list))
target_url = url.format(i)
print(target_url)
r = requests.get(target_url)
sleep(1)
soup = BeautifulSoup(r.text)
contents = soup.find_all('div', class_='cassetteitem')
for content in contents:
detail = content.find('div', class_='cassetteitem_content')
table = content.find('table', class_='cassetteitem_other')
title = detail.find('div', class_='cassetteitem_content-title').text
address = detail.find('li', class_='cassetteitem_detail-col1').text
access = detail.find('li', class_='cassetteitem_detail-col2').text
age = detail.find('li', class_='cassetteitem_detail-col3').text
tr_tags = table.find_all('tr', class_='js-cassette_link')
for tr_tag in tr_tags:
floor, price, first_fee, capacity = tr_tag.find_all('td')[2:6]
fee, management_fee = price.find_all('li')
deposit, gratuity = first_fee.find_all('li')
madori, menseki = capacity.find_all('li')
d = {
'title': title,
'address': address,
'access': access,
'age': age,
'floor': floor.text,
'fee': fee.text,
'management_fee': management_fee.text,
'deposit': deposit.text,
'gratuity': gratuity.text,
'madori': madori.text,
'menseki': menseki.text
}
d_list.append(d)
以下のようにd_listの大きさとともに各ページのサイト情報取得できました。
d_listの大きさ: 0
https://suumo.jp/chintai/tokyo/sc_shinjuku/?page=1
d_listの大きさ: 106
https://suumo.jp/chintai/tokyo/sc_shinjuku/?page=2
d_listの大きさ: 216
https://suumo.jp/chintai/tokyo/sc_shinjuku/?page=3
取得したデータを保存するには、下記の手順が必要です。
①取得したデータを表形式にする
②表形式の取得結果をCSVに出力する
①については、インポートしたPandasを使って、スクレイピング結果が入っているリストをデータフレームに変換する必要があります。
df = pd.DataFrame(d_list)
表形式の取得結果をCSVに出力するには下記です。
データフレームをCSVに出力するには、以下のようにdf.to_csv()を使ってあげます。
to_csv()を使って、データフレームをCSV出力する
df.to_csv('test.csv',index=None,encoding='utf-8-sig')