LoginSignup
6
10

More than 1 year has passed since last update.

pubmedからスクレイピングしたデータをcsv形式で保存する

Last updated at Posted at 2019-03-05

はじめに

初投稿です。
今回はpubmedで検索してきたデータをcsvとして保存するコードを書きました。
seleniumのchrome driverを使っています。

環境設定

seleniumのchrome driverを使用するにはPATHを設定する必要があります。
環境設定の方法は省略します。

環境設定で参考にしたサイト
Python + Selenium で Chrome の自動操作を一通り

ライブラリ


import time
from selenium import webdriver
import chromedriver_binary
import pandas as pd

Chrome Driverを動かす

任意のキーワードに対して、検索を行います。
find_element_by_idでページ数を取得して、
そのページ数分の情報をスクレイピングしています。
ページ数が1ページの場合、pagenoが存在しなくてエラーが出るので、
try exceptを使っています。


def get_pubmed_info(keyword):
    driver = webdriver.Chrome()
    url = "https://www.ncbi.nlm.nih.gov/pubmed/?term="+keyword.replace(' ','+')
    driver.get(url) 
    driver.implicitly_wait = 1
    data = []
    try:
        page_num = int(driver.find_element_by_id('pageno').get_attribute('last'))
    except:
        page_num = 1
    for i in range(page_num):
        driver.find_element_by_name('Display').click()
        [tag for tag in driver.find_elements_by_tag_name('input')
            if (tag.get_attribute('value') == 'abstract')][1].click()
        source = driver.page_source.split('\n\n\n')
        for paper in source:
            block = paper.split('\n\n')
            if(len(block) >= 6):
                data.append(block)
        driver.back()
        time.sleep(1)
        if (i < page_num - 1):
            driver.find_element_by_css_selector('a.active.page_link.next').click()
            print(i)
            time.sleep(1)
    return data

CSVとして出力

pandasのto_csvを使って出力しています。
保存先のPATHは適当に設定してください。


def get_dataframe(data, keyword):
    csv_data = pd.concat([
        pd.DataFrame([data[i][1] for i in range(len(data))], columns=["title"]),
        pd.DataFrame([data[i][2] for i in range(len(data))], columns=["authors"]),
        pd.DataFrame([data[i][4] for i in range(len(data))], columns=["abstract"])],
        axis=1)
    keyword = keyword.replace(" ", "_")
    csv_data.to_csv(f"../desktop/{keyword}.csv")

全コード


import time
from selenium import webdriver
import chromedriver_binary
import pandas as pd

def main():
    keyword = "yamanaka shinya"
    data = get_pubmed_info(keyword)
    get_dataframe(data, keyword)

def get_pubmed_info(keyword):
    driver = webdriver.Chrome()
    url = "https://www.ncbi.nlm.nih.gov/pubmed/?term="+keyword.replace(' ','+')
    driver.get(url) 
    driver.implicitly_wait = 1
    data = []
    try:
        page_num = int(driver.find_element_by_id('pageno').get_attribute('last'))
    except:
        page_num = 1
    for i in range(page_num):
        driver.find_element_by_name('Display').click()
        [tag for tag in driver.find_elements_by_tag_name('input')
            if (tag.get_attribute('value') == 'abstract')][1].click()
        source = driver.page_source.split('\n\n\n')
        for paper in source:
            block = paper.split('\n\n')
            if(len(block) >= 6):
                data.append(block)
        driver.back()
        time.sleep(1)
        if (i < page_num - 1):
            driver.find_element_by_css_selector('a.active.page_link.next').click()
            print(i)
            time.sleep(1)
    return data

def get_dataframe(data, keyword):
    csv_data = pd.concat([
        pd.DataFrame([data[i][1] for i in range(len(data))], columns=["title"]),
        pd.DataFrame([data[i][2] for i in range(len(data))], columns=["authors"]),
        pd.DataFrame([data[i][4] for i in range(len(data))], columns=["abstract"])],
        axis=1)
    keyword = keyword.replace(" ", "_")
    csv_data.to_csv(f"../desktop/{keyword}.csv")    
6
10
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
10