여행 정보 사이트를 스크래핑하고 지도에 플롯

목적



이번에는 스크래핑 연습을 위해 여행정보가 실려 있다 RETRIP 되는 장소의 지리적 편향 등이 있는지 여부를 가시화하고 싶습니다.

스크래핑



먼저 BeautifulSoup 을 사용하여 정보를 얻습니다.

from bs4 import BeautifulSoup
import requests
import re
import time
#urlを指定
url = 'https://retrip.jp/'

#情報を取得します

r = requests.get('https://retrip.jp/')
soup = BeautifulSoup(r.content, 'html.parser')

#1面から見るべきurlをリストにまとめる

urls = [url + i.get('href') for i in soup.find_all('a', href=re.compile('^/articles/')) ]

shop_place_dic = {}

for url1 in urls:
   #入ったurlの中にさらにページ分けされているので何ページあるか確認
    r1 = requests.get(url1)
    soup1 = BeautifulSoup(r1.content, 'html.parser')

    add_urls = []
    for i in soup1.find_all('a', class_='page'):
        add_urls.append(i.get('href'))

    urls2 = [url1]

  #ページ全て回れるようにリスト作成

    for i in add_urls:
        urls2.append(url1 + i)

    for url2 in urls2:

        #攻撃にならないようにsleepしつつ取得しましょう

        time.sleep(1)
        r2 = requests.get(url2)
        soup2 = BeautifulSoup(r2.content, 'html.parser')

        for j in soup2.article.find_all('div', class_='expSpotContent'):
            shop_place_dic[j.a.text] = j.li.text


자, 이것으로 사전형의 키에 이름, 밸류에 장소가 들어간 상당한 길이의 사전을 얻을 수 있습니다.
주목의 정리는 640 페이지분 있습니다만 이번은 1 페이지분으로 해 둡니다.

플롯



이제 Google Maps API 을 사용하여 지오코딩하여 얻은 위치 정보를 기반으로 지도에 플롯합니다.
그리고 그것을 바탕으로 folium을 사용하면 쉽게 플롯 할 수 있습니다.

import requests
import json
import folium
from time import sleep

wait_time = 0.3 # (sec)

#key以下に自分のAPI Idを入れましょう

address_url = 'https://maps.googleapis.com/maps/api/geocode/json?address='
key_url = '&key="""YOUR API IDs"""'
headers = {'content-type': 'application/json'}

#適当に初期設定

map1 = folium.Map(location=[ 35.9586186, 139.4288445], 
                      zoom_start=6)

coordinates = {}

#前で作った辞書からすべてをジオコード化します

for k, v in shop_place_dic.items():
    v = v.strip()
    url = address_url + v + key_url
    r = requests.get(url, headers=headers)
    data = r.json()
    if 'results' in data and len(data['results']) > 0 and 'formatted_address' in data['results'][0]:
        coordinates[k] = [data['results'][0]['geometry']['location']['lat'],
            data['results'][0]['geometry']['location']['lng']]
    else: continue

  #APIの使用制限があるのでsleepしつつ

    sleep(wait_time)

    #これで地図にマーキング

    folium.Marker(coordinates[k], 
                  popup = k).add_to(map1)

#保存

map1.save('./map.html')

이렇게 지도에 모두 플롯할 수 있었습니다.
(보기 어렵고 죄송합니다)
덧붙여서, 핀을 클릭하면, 장소의 명칭이 나오도록(듯이) 하고 있습니다.


도전



코드가 더럽습니다. 뭔가 궁리할 수 있는 점을 찾고 싶다.

여기

<추기>
스팟의 종류에 따라, 핀의 색깔, 클릭하는 것에 의한 url로의 점프가 실장 가능한 것 같다.

좋은 웹페이지 즐겨찾기