【初心者向け】基礎&実践プログラミング

初心者がつまづきやすいところ、最短で実力が身につく方法をお伝えします。

【Python スクレイピング】投稿論文情報とインパクトファクターIFを取得

f:id:AIProgrammer:20210212165041p:plain

動かしながら学ぶ PyTorchプログラミング入門

動かしながら学ぶ PyTorchプログラミング入門

  • 作者:斎藤勇哉
  • 発売日: 2020/11/30
  • メディア: Kindle版

目次

目的

  • researchmapから、投稿した論文情報を取得
  • 雑誌のインパクトファクターIFを検索・追加し、CSVで出力

背景

「学術雑誌等に発表した論文・著書のうち、主なもの(過去5年間)を記載せよ。」

投稿した論文はたくさんあるけど、IFが高くて最近の論文はどれだろう・・・。調べるのにかなり手間がかかりそう・・・。

→では、スクレイピングを使って、自動的に取得しよう。

方法

① researchmapから、投稿した論文情報を取得

以下のコードを、実行する。

main_url = <Researchmap URL>で、researchmapのURLを指定する。具体的には、main_url = 'https://researchmap.jp/<user name>/published_papers'のような感じ。

researchmapから取得した情報は、「[年月日]_paper.csv」として出力される。

import time
from selenium import webdriver
import pandas as pd
import datetime
import requests


def setting(url):
    # setting
    driver = webdriver.Chrome()
    driver.set_page_load_timeout(90)
    driver.implicitly_wait(10)  # 秒

    # login
    driver.get(url)
    time.sleep(3)
    return driver


def get_paper_url(driver, main_url):
    i = 0
    paper_url_list = []
    while True:
        # Move page
        page_url = main_url + "?limit=100&start={}".format(i+1)
        try:
            http_status_code = requests.get(page_url).status_code
            if http_status_code == 200:
                driver.get(page_url)
                time.sleep(3)
                # List paper urls
                paper_url_list.extend([elem.get_property('href') for elem in driver.find_elements_by_xpath(
                    '//*[@id="frame-857"]/div/div[2]/ul//div/div[1]/a')])
                i += 100
            else:
                break
        except:
            break
    return paper_url_list


def get_paper_info(driver, page_url):
    driver.get(page_url)
    time.sleep(3)
    try:
        date = driver.find_elements_by_xpath(
            '//*[@id="frame-857"]/div/article/header/div/div/div[1]')[0].text
    except:
        date = ""
    try:
        title = driver.find_elements_by_xpath(
            '//*[@id="frame-857"]/div/article/header/div/div/h1')[0].text
    except:
        title = ""
    try:
        author = driver.find_elements_by_xpath(
            '//*[@id="frame-857"]/div/article/header/ul')[0].text.replace('\n', '')
    except:
        author = ""
    try:
        journal = driver.find_elements_by_xpath(
            '//*[@id="frame-857"]/div/article/header/div/div/div[2]')[0].text
    except:
        journal = ""
    return date, title, author, journal


def main():
    # Define
    main_url =   '<Researchmap URL>'  # ex. 'https://researchmap.jp/<user name>/published_papers' 
    date_list = []
    title_list = []
    journal_list = []
    author_list = []

    # 1. Move main page
    driver = setting(main_url)
    # 2. Get paper URL
    paper_url_list = get_paper_url(driver, main_url)
    # 3. Get paper info
    for paper_url in paper_url_list:
        date, title, author, journal = get_paper_info(driver, paper_url)
        date_list.append(date)
        title_list.append(title)
        journal_list.append(journal)
        author_list.append(author)
    # 4. Save to csv
    df = pd.DataFrame({'Date': date_list, 'Title': title_list,
                       'Author': author_list, 'Journal': journal_list})
    df.to_csv("{}_paper.csv".format(
        datetime.datetime.now().strftime('%Y%m%d')), index=False)


if __name__ == '__main__':
    main()

researchmapから取得した情報(年月日]_paper.csv)は、次のように保存される。

Date Title Author Journal
2020年9月 Title A Author A, Author B, Author C… Neural regeneration research
2020年7月29日 Title B Author A, Author B, Author C… NeuroImage
2020年7月15日 Title C Author A, Author B, Author C… Cerebral Cortex
2020年6月18日 Title D Author A, Author B, Author C… Frontiers in Human Neuroscience
2020年6月 Title E Author A, Author B, Author C… Magnetic Resonance Imaging

② 雑誌のインパクトファクターIFを取得

IFを検索するサイトとして、Resurchifyを使用。

①で取得した論文情報から、これまで投稿されてきた学術雑誌名とIFが記載されているサイトのURLを、CSVファイルに記載し、「journal_list.csv」という名前で保存する。

journal_list.csvの中身は、次の通り。

Journal URL
ACADEMIC RADIOLOGY https://www.resurchify.com/impact-factor-details.php?title=Academic-Radiology&id=4832
ACTA NEUROPATHOLOGICA https://www.resurchify.com/impact-factor-details.php?title=Acta-Neuropathologica&id=111
Acta radiologica short reports https://www.resurchify.com/impact-factor-details.php?title=Acta-Radiologica-Short-Reports&id=24495
Acta Radiologica https://www.resurchify.com/impact-factor-details.php?title=Acta-Radiologica&id=6872
AJNR. American journal of neuroradiology https://www.resurchify.com/impact-factor-details.php?title=American-Journal-of-Neuroradiology&id=2134

学術雑誌名とIFが記載されたCSV(journal_list.csv)を作成したら、次のコードを実行する。

取得した学術雑誌名とIFは、CSVファイルに「IF_list.csv」として保存される。

import pandas as pd
from selenium import webdriver
import time


def get_impact_factor(driver, journal, url):
    # Move page
    driver.get(url)
    time.sleep(3)
    # Get info
    try:
        row = [elem.text for elem in driver.find_elements_by_xpath(
            '//*[@id="main_content"]/div[1]/table/tbody/tr')]
        date = [row.replace('Coming Soon', 'Coming-Soon').split()[0]
                for row in row[1:]]
        imfac = [row.replace('Coming Soon', 'Coming-Soon').split()[1]
                for row in row[1:]]
        journal = [journal]*len(date)
        url = [url]*len(date)
    except:
        journal, url, date, imfac = [journal], [url], ['NaN'], ['NaN']
    return journal, url, date, imfac


def main():
    # Selenium setting
    driver = webdriver.Chrome()
    driver.set_page_load_timeout(90)
    driver.implicitly_wait(10)  # 秒
    # Read csv
    df = pd.read_csv('journal_list.csv')
    # Get impact factor
    journal_list, url_list, date_list, imfac_list = [], [], [], []
    for i in range(df.shape[0]):
        journal, url, date, imfac = get_impact_factor(
            driver, df['Journal'][i], df['URL'][i])
        journal_list.extend(journal), url_list.extend(
            url), date_list.extend(date), imfac_list.extend(imfac)
    # Save to csv
    pd.DataFrame({'Journal': journal_list, 'URL': url_list, 'Year': date_list, 'IF': imfac_list}).pivot(
        index='Journal', columns='Year', values='IF').to_csv('IF_list.csv')


if __name__ == '__main__':
    main()

取得した学術雑誌名とIF(IF_list.csv)は、次のように保存される。

Journal 2013 2014 2015 2016 2017 2018 2019
Neural regeneration research 0.3 0.34 1.26 2.04 2.29 2.39 Coming-Soon
NeuroImage 7.42 7.29 6.54 6.37 5.64 5.88 Coming-Soon
Cerebral Cortex 7.73 7.56 7.35 6.13 5.82 5.21 Coming-Soon
Frontiers in Human Neuroscience 3.43 3.7 4.07 3.23 2.82 3 Coming-Soon
Magnetic Resonance Imaging 3.31 3.64 3.4 3.39 3.72 3.94 Coming-Soon

③ ①と②を結合して、投稿した論文とインパクトファクターの情報が載ったCSVを出力

①の論文情報をまとめた([年月日]_paper.csv)と、②の取得した学術雑誌名とIFをまとめた(IF_list.csv)が、用意できたら次のコードを実行する。

このコードでは、①論文情報と②IF情報を結合し、さらに論文の発行年に応じてIFを抽出し(列:IF of this paper)、「[年月日]_paper_with_IF.csv」というファイル名で、CSVに結果を保存する。

「[年月日]_paper_with_IF.csv」というファイル名で、結果が出力される。

変数「paper_list」 には、①の論文情報をまとめた([年月日]_paper.csv)のファイル名を指定する。

import time
from selenium import webdriver
import pandas as pd
import datetime
import requests

paper_list = '20210212_paper.csv'
imfac_list = 'IF_list.csv'
output_name = '20210212_paper_with_IF.csv'
df_paper = pd.read_csv(paper_list)
df_imfac = pd.read_csv(imfac_list)
df_merge = df_paper.merge(df_imfac, on='Journal', how='outer')

# Search IF according to published year
df_merge['IF of this paper'] = None
for i in range(df_merge.shape[0]):
    imfac = None
    if int(df_merge['Date'][i][:4]) >= 2020:
        imfac = 'Coming Soon'
    
    elif int(df_merge['Date'][i][:4]) < 2013:
        imfac = None
    else:
        imfac = df_merge[df_merge['Date'][i][:4]][i]
    df_merge.loc[i, ['IF of this paper']] = imfac

# Save csv
df_merge.to_csv(output_name, index=False)

生成された「[年月日]_paper_with_IF.csv」の中身は、次の通り。

Date Title Author Journal 2013 2014 2015 2016 2017 2018 2019 IF of this paper
2018年10月 Title A Author A, Author B, Author C… Molecular psychiatry 13.72 14.08 13.12 12.86 11.08 11.46 Coming-Soon 11.46
2018年9月 Title B Author A, Author B, Author C… Stroke 7 6.67 6.55 6.2 6.25 5.44 Coming-Soon 5.44
2018年9月 Title C Author A, Author B, Author C… NEURORADIOLOGY 2.9 3.07 2.56 2.29 2.65 2.55 Coming-Soon 2.55
2017年4月 Title D Author A, Author B, Author C… NEURORADIOLOGY 2.9 3.07 2.56 2.29 2.65 2.55 Coming-Soon 2.65
2017年1月 Title E Author A, Author B, Author C… NEURORADIOLOGY 2.9 3.07 2.56 2.29 2.65 2.55 Coming-Soon 2.65


頑張れ!喝!!の代わりにB!ブックマークを押していただけるとただただうれしいです(^^)! ↓

動かしながら学ぶ PyTorchプログラミング入門

動かしながら学ぶ PyTorchプログラミング入門

  • 作者:斎藤勇哉
  • 発売日: 2020/11/30
  • メディア: Kindle版