LoginSignup
5
3

More than 3 years have passed since last update.

世界中のpyconがいつどこで開催されるのか、わかりにくかったので、Foliumでマッピングしてみた

Last updated at Posted at 2019-06-09

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をクリックしてね」の感じになっています。

スクリーンショット 2019-06-10 5.17.38.png

いつどこであるかも、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 があります。

スクリーンショット 2019-06-10 5.25.37.png

...スクレイピングいらないですね。

といことで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='&copy; <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

スクリーンショット 2019-06-11 3.55.33.png

ただ、よくよくみると

pyconのサイトをよくよくみると、、

スクリーンショット 2019-06-10 5.34.51.png

まさか。。。。

スクリーンショット 2019-06-10 5.35.07.png

ああ。。。。

まとめ

これをやり始めた時はなかった気がしたのですが、かっこいいのがオフィシャルにありました。。
なぜだ。。

結果的にオフィシャルに勝てませんでしたが、スクレイピング、icsファイル解析、geocording、folium、herokuといろいろさわれてなかなかおもしろかったです。

目的は達成できたものの、作ったものに意味がなくなってしまいました。
きちんとまわりを見て、手を動かしましょう。という学びですね。

5
3
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
5
3