スクレイピングでICMLの会議情報を一括取得してみた

概要

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

summary.csv (228 ダウンロード)

私は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")

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA