概要
来週から始まるICML(international conference on machine learning)の準備のため、スクレイピングを用いて各イベントのスケジュールや概要を一括取得するPythonスクリプトを作成しました。あまりきれいなコードではありませんが、興味があったら使ってみてください。結果だけ欲しいという方はこちらをダウンロードしてみてください。
summary.csv (316 ダウンロード)私はGoogleのスプレッドシート上にコピー・翻訳して以下のような感じで使っています。

Pythonコード
内容は、ICML2019のスケジュールのページにアクセスしてイベント情報(タイトル・アブストラクト・著者・日付/場所・種別・PDFURL(ある場合)を取得してcsvファイルとして保存するものです。
スクリプトと同じフォルダにPDFという名称のフォルダを用意していただく必要があり、その中にPDFファイルもダウンロードするようにしています。 タイトルとアブストラクトについてはGoogle翻訳で変換もするようにしていますが、リクエストが多くなると「
JSONDecodeError: Expecting value 」のようなエラーが出てしまうので、その場合はGoogleのスプレッドシート等を使って翻訳してみてください。
import pandas as pd
import requests
from bs4 import BeautifulSoup
from joblib import Parallel, delayed
from googletrans import Translator
chunk_size = 2000
#スクレイピングの処理
def getEventInfo(url_base, i):
print(i)
try:
url = url_base + str(i)
session = requests.session()
res = session.get(url)
res.encoding = 'utf-8'
soup = BeautifulSoup(res.text, "html.parser")
except:
types, date, title, authors, abstract, pdfurl = "connection error"
try:
types = soup.find_all(attrs={"class": "maincardHeader"})[0].string
except:
types = "No information"
try:
date = soup.find_all(attrs={"class": "maincardHeader"})[1].string
except:
date = "No information"
try:
title = soup.find(attrs={"class": "maincardBody"}).string
except:
title = "No information"
try:
authors = soup.find(attrs={"class": "maincardFooter"}).string
except:
authors = "No information"
try:
abstract = soup.find(attrs={"class": "abstractContainer"}).p.string
except:
abstract = "No information"
try:
pdfurl = "https://icml.cc" + soup.find(attrs={"class": "btn btn-default btn-xs href_PDF"}).get("href")
r = requests.get(pdfurl, stream=True)
with open('pdf/'+ title + '.pdf', 'wb') as fd:
for chunk in r.iter_content(chunk_size):
fd.write(chunk)
except:
pdfurl = "No information"
df = pd.DataFrame(data=[i, title, abstract, authors, date, types, pdfurl])
return df
if __name__ == "__main__":
url_base = "https://icml.cc/Conferences/2019/Schedule?showEvent="
#データの読み込み
dfs = Parallel(n_jobs=1, verbose=10)([delayed(getEventInfo)(url_base, i) for i in range(3533, 5541)])
df = pd.concat(dfs, axis=1).T.reset_index(drop=True)
df.columns = ["No", "title", "abstract", "authors", "date", "type", "pdfurl"]
df = df.loc[df["title"] != "No information"]
#日付データを処理
df_date = df["date"].str.split("@", expand=True)
df_date.columns = ["date", "place"]
df_date2 = df_date["date"].str.split(" ", expand=True)
#Google翻訳
df_ja = df[["title", "abstract"]].copy()
translator = Translator()
for i in df_ja.index:
etitle, eabst = df.loc[i, ['title', 'abstract']].fillna("").values
df_ja.loc[i, "title"] = Translator().translate(etitle, dest='ja').text
df_ja.loc[i, "abstract"] = Translator().translate(eabst, dest='ja').text
df_ja.columns = ["title_ja", "abstract_ja"]
df = pd.concat([df, df_ja, df_date, df_date2], axis=1)
df.to_csv("summary.csv")