여행 정보 사이트를 스크래핑하고 지도에 플롯
목적
이번에는 스크래핑 연습을 위해 여행정보가 실려 있다 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로의 점프가 실장 가능한 것 같다.
Reference
이 문제에 관하여(여행 정보 사이트를 스크래핑하고 지도에 플롯), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/r34b26/items/d54a91b205450611e8c3텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)