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


## TL;DR;

世界中で開催されるPythonのカンファレンスの情報を、地図にマッピングしてherokuにデプロイするまで、をかいてます。

## なぜこんなことをするのか

転職を考えていて、転職先の会社が「他の国のPyconにも行こうかと思ってる」といっていたので、「やばい仕事で海外いきたい。どこの国のやつならいけそうかしら」っていうのをさっと確認しようと思ったのがきっかけです。

pycon.orgのサイトが思ったより見にくくて「これに行きたいです！」とスッといえないなあと思い地図にマッピングしようと思いました。

## Pycon とは

[PyCon JPとは — PyCon JP 運営マニュアル 0.1 ドキュメント](https://manual.pycon.jp/overview/about.html)

>PyCon JPは、日本で開催されるプログラミング言語Pythonに関する国際カンファレンスです。 PyCon(Python Conference)はアメリカをはじめ世界中で開催されており、 PyCon JPはそのうちの日本で開催されているものです。

Pyconは世界中で開催されているようです。

## Pyconのサイトが見にくい

Pyconのサイト([http://pycon.org/](http://pycon.org/))は、各国のPyconなどの入り口となっているサイトで、「詳細はURLをクリックしてね」の感じになっています。

<img width="1517" alt="スクリーンショット 2019-06-10 5.17.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434453/41e356b2-8c4b-6601-3f69-cb581f75830d.png">


いつどこであるかも、URLの先を見ないと分からなくて目的を達成できません。

## まずはスクレイピングしてみる

[http://pycon.org/](http://pycon.org/)よりリンクを取得して、その分ループして各国のサイトをなめようと試みます。

```Python
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 があります。

<img width="1348" alt="スクリーンショット 2019-06-10 5.25.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434453/12952c78-ec32-b54b-2d0d-c79ab47cb83f.png">


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

といことでicsファイルからイベント情報を抜き出します。

## ICSファイルを解析する

以下を参考にしました。
[Pythonを使ってファイル（ics/icalendar）を解析する](https://codeday.me/jp/qa/20181221/76717.html)

```Python
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で一宮の場所を見る](https://qiita.com/pork_steak/items/bd23a1ba706df2b09e27)

```Python
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にてマッピング
これも上のと同じ記事を参考にしました。

```Python
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をしてみる](https://qiita.com/Arashi/items/b2f2e01259238235e187)

いまさらですが、本当にherokuすごい。を体感しました。
本当に10分かからずにユーザ登録から公開までできてしまいました。

## できたもの

「どこで」開催されるかを一目で確認することができ、ピンをクリックすると「いつ」が分かるようになりました。
https://radiant-dawn-44439.herokuapp.com

<img width="1621" alt="スクリーンショット 2019-06-11 3.55.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434453/6e13d349-3442-57b8-0851-2cd1d0de12d3.png">


## ただ、よくよくみると

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

<img width="1420" alt="スクリーンショット 2019-06-10 5.34.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434453/cb283f58-0ae1-0405-dabc-d1c31ccb6b27.png">

まさか。。。。

<img width="1667" alt="スクリーンショット 2019-06-10 5.35.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434453/c83db3e0-f55c-2d89-1888-ac2d587906d0.png">

http://pythoncalendar.com

ああ。。。。



## まとめ

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

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

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