TL;DR;
世界中で開催されるPythonのカンファレンスの情報を、地図にマッピングしてherokuにデプロイするまで、をかいてます。
なぜこんなことをするのか
転職を考えていて、転職先の会社が「他の国のPyconにも行こうかと思ってる」といっていたので、「やばい仕事で海外いきたい。どこの国のやつならいけそうかしら」っていうのをさっと確認しようと思ったのがきっかけです。
pycon.orgのサイトが思ったより見にくくて「これに行きたいです!」とスッといえないなあと思い地図にマッピングしようと思いました。
Pycon とは
PyCon JPとは — PyCon JP 運営マニュアル 0.1 ドキュメント
PyCon JPは、日本で開催されるプログラミング言語Pythonに関する国際カンファレンスです。 PyCon(Python Conference)はアメリカをはじめ世界中で開催されており、 PyCon JPはそのうちの日本で開催されているものです。
Pyconは世界中で開催されているようです。
Pyconのサイトが見にくい
Pyconのサイト(http://pycon.org/)は、各国のPyconなどの入り口となっているサイトで、「詳細はURLをクリックしてね」の感じになっています。
いつどこであるかも、URLの先を見ないと分からなくて目的を達成できません。
まずはスクレイピングしてみる
http://pycon.org/よりリンクを取得して、その分ループして各国のサイトをなめようと試みます。
import logging
import requests
from bs4 import BeautifulSoup
URL = 'http://pycon.org'
headers = {"user-Agent":"pycon"}
resp = requests.get(URL, timeout=1, headers=headers)
r_text = resp.text
soup = BeautifulSoup(r_text, 'html.parser')
link = soup.find_all('a')
listurl = []
for t in link:
hrefsoup = t.attrs['href']
print(hrefsoup)
listurl.append(hrefsoup)
prefix = "http"
for h in listurl:
if h.startswith(prefix):
listurl.append(h)
スクレイピングしたところで、サイトの作りはまちまちだし、pyconの場所、時間はうまくとれません。
おや
pyconのサイトをよくみると、、、google calendar があります。
...スクレイピングいらないですね。
といことでicsファイルからイベント情報を抜き出します。
ICSファイルを解析する
以下を参考にしました。
Pythonを使ってファイル(ics/icalendar)を解析する
from icalendar import Calendar, Event
from pandas import DataFrame
import googlemaps
ics_info = list()
g = open('basic.ics','rb')
gcal = Calendar.from_ical(g.read())
for component in gcal.walk():
if component.name == "VEVENT":
ics_from = (component.get('dtstart'))
to_dt = date(2019, 1, 1) # 2019年のをとります
if ( type(ics_from.dt) is date and ics_from.dt > to_dt ):
ics_info.append([(component.get('SUMMARY')),(component.get('DTSTART')),(component.get('LOCATION')),(component.get('DESCRIPTION'))])
g.close()
df_ics = DataFrame(ics_info)
次にGoogleMaps APIで Geocoding
以下を参考にさせていただきました。
foliumで一宮の場所を見る
from pandas import Series ,DataFrame
import googlemaps
# GoogleMaps API Key
api_key = '' # 取得したAPI KEYを入力してください。
gmaps = googlemaps.Client(key=api_key)
geo_loc = list()
for index,item in df_ics.iterrows():
results = gmaps.geocode(item[2])
for result in results:
addr = result['formatted_address']
location = result['geometry']['location']
lat = location['lat']
lng = location['lng']
geo_loc.append([item[0],item[1].dt,item[2], lat, lng])
df_geo = DataFrame(geo_loc,columns=['pycon_name','date','location','lat','lon'])
foliumにてマッピング
これも上のと同じ記事を参考にしました。
import folium
m = folium.Map(location=[30, 10],
zoom_start=3,
attr='© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors')
print(df_geo)
for i,r in df_geo.iterrows():
code = [float(r['lat']), float(r['lon'])]
text = ('<b>' + r['pycon_name'] + '</b><br>' + format(r['date']))
pop_info=folium.Popup(text, max_width=1000)
folium.Marker(code, popup=pop_info).add_to(m)
m.save('pycon.html')
herokuでデプロイ
こちらを参考にしました。
Heroku初心者がHello, Herokuをしてみる
いまさらですが、本当にherokuすごい。を体感しました。
本当に10分かからずにユーザ登録から公開までできてしまいました。
できたもの
「どこで」開催されるかを一目で確認することができ、ピンをクリックすると「いつ」が分かるようになりました。
https://radiant-dawn-44439.herokuapp.com
ただ、よくよくみると
pyconのサイトをよくよくみると、、
まさか。。。。
ああ。。。。
まとめ
これをやり始めた時はなかった気がしたのですが、かっこいいのがオフィシャルにありました。。
なぜだ。。
結果的にオフィシャルに勝てませんでしたが、スクレイピング、icsファイル解析、geocording、folium、herokuといろいろさわれてなかなかおもしろかったです。
目的は達成できたものの、作ったものに意味がなくなってしまいました。
きちんとまわりを見て、手を動かしましょう。という学びですね。