概要
来週から始まるICML(international conference on machine learning)の準備のため、スクレイピングを用いて各イベントのスケジュールや概要を一括取得するPythonスクリプトを作成しました。あまりきれいなコードではありませんが、興味があったら使ってみてください。結果だけ欲しいという方はこちらをダウンロードしてみてください。
summary.csv (245 ダウンロード)私は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")