はじめに
初投稿です。
今回は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")