0
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

スクレイピングで不動産情報取得(SUUMO)(2)

Posted at

前回(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')
0
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?