논문을 작성하다 보면 투고하는 학술지에 맞춰 레퍼런스 작성 양식이 달라지는 경우가 있습니다.
이럴 때 참고 문헌들의 인용을 양식에 맞는 걸로 매번 찾는다면 ...
... 엄청난 시간이 들게 되겠죠.
가뜩이나 시간도 없는데, 클릭해서 찾고, 복사하고, 붙여넣고, 다시 찾고, 복사, 붙여넣기 ...
생각만 해도 한숨이 절로 나옵니다.
컴퓨터가 알아서 참고 문헌 인용을 정리하는 동안 다른 일을 한다면 논문을 아주 빠르게 써낼 수 있을 텐데 그러지 못해 답답한 분들을 위해 구글 학술 검색 스크래핑 코드를 작성해 보았습니다.
먼저 필요한 패키지들을 임포트 해줍니다.
import pandas as pd
import numpy as np
import time
from tqdm.notebook import tqdm
import random
import urllib.request
from selenium.common.exceptions import NoSuchElementException, UnexpectedAlertPresentException, TimeoutException
from selenium import webdriver
from selenium.webdriver.common.by import By
import user_agent
from user_agent import generate_user_agent, generate_navigator
# 웹드라이버 설정
options = webdriver.ChromeOptions()
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option("useAutomationExtension", False)
그 다음, 임시방평이긴 하지만 ip가 차단되는 불상사를 막기 위해 설정한 user-agent가 잘 설정되어 있는지 확인해봅니다.
하지만 user-agent도 어디까지나 눈가림용일뿐, VPN 등을 이용하지 않는 이상 ip 차단은 막을 수 없으므로 밑에 추가한 시간차를 반드시 지켜야 합니다.
print(generate_user_agent(device_type='desktop'))
# 윈도우 사용자용
print(generate_user_agent(os='win', device_type='desktop'))
# 맥 사용자용
print(generate_user_agent(os=('mac', 'linux'), device_type='desktop'))
navigator = generate_navigator()
random_user = generate_user_agent(os='win', device_type='desktop')
print(random_user)
위에서 확인한 user-agent를 설정해서 셀레니움으로 크롬 창을 활성화합니다.
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument(random_user)
driver = webdriver.Chrome(executable_path ='chromedriver.exe',options = chrome_options)
driver.maximize_window()
driver.get("https://www.google.com")
time.sleep(2)
인용을 찾고자 하는 논문 목록 파일을 불러옵니다.
이때 논문 목록 파일은 텍스트가 좋습니다. 엑셀 파일과 달리 어디서나 편집이 가능하고, 구분자를 탭으로 설정하면 인용에 들어가는 쉼표가 문제되지도 않기 때문입니다.
paper_refs = pd.read_csv("D:/검색할 논문목록.txt", sep='\t', encoding='UTF-8')
print(paper_refs) # 확인용
# 논문 제목을 새로운 리스트 변수에 담는다.
title_list = paper_refs['titles'].to_list()
print(len(title_list)) # 개수 확인으로 리스트로 잘 담겼는지 체크한다.
이제 구글 학술 검색 url 양식에 논문 제목을 추가해서 검색 후 자신에게 맞는 인용 양식을 읽어오면 됩니다.
이때 주의할 점은, 구글은 그 어느 검색 엔진보다 자동화에 민감하다는 것입니다.
각 행동 사이의 시간 간격이 동일하게 반복되거나 너무 짧을 경우 가차없이 차단됩니다. (😱)
그러므로 random.uniform()을 사용하여 매번 시간차를 다르게 주어야 합니다.
# https://scholar.google.co.kr/scholar?hl=ko&as_sdt=0%2C5&q={}&btnG=.format(title)
# url 속에 들어있는 {} 자리에 논문 제목이 들어간다.
quote_list = [] # 인용을 담을 리스트 생성
for title in tqdm(title_list):
driver.get('https://scholar.google.co.kr/scholar?hl=ko&as_sdt=0%2C5&q={}&btnG='.format(title))
time.sleep(random.uniform(3,4)) # 자동화로 인한 차단을 방지하기 위해 시간차를 둔다.
driver.find_element(By.CSS_SELECTOR, '#gs_res_ccl_mid > div > div.gs_ri > div.gs_fl > a.gs_or_cit.gs_or_btn.gs_nph > span').click()
time.sleep(random.uniform(2,3))
# ↓ MLA 인용
quote_text = driver.find_element(By.CSS_SELECTOR, '#gs_citt > table > tbody > tr:nth-child(1) > td > div').text
# ↓ APA 인용
quote_text = driver.find_element(By.CSS_SELECTOR, '#gs_citt > table > tbody > tr:nth-child(2) > td > div').text
# ↓ ISO 690 인용
quote_text = driver.find_element(By.CSS_SELECTOR, '#gs_citt > table > tbody > tr:nth-child(3) > td > div').text
quote_list.append(quote_text)
time.sleep(random.uniform(5,6))
print(len(quote_list)) # 개수 확인
※ MLA, APA, ISO 690만 작성하였으므로 다른 인용 방식은 CSS selector를 변경해야 한다.
이제 paper_refs 데이터 프레임에 스크래핑해온 인용을 추가합니다.
# ↓ 인용 칼럼명은 사용자 임의로 지정한다. 나의 경우 APA를 긁었기 때문에 APA로 지정했다.
paper_refs['quote_APA'] = quote_list
paper_refs
데이터 프레임에 인용 칼럼이 잘 생성되었다면 이제 파일로 저장하면 끝입니다.
paper_refs.to_csv("파일 저장 경로/파일명.txt", index=False, sep='\t', encoding='UTF-8')
paper_refs.to_excel("파일 저장 경로/파일명.xlsx", index=False)
다른 기술 블로그들이 그렇듯,
코드를 블로그에 공유하는 것은 기록과 '공유'를 위해서입니다.
만약 제 글의 도움을 받아 본인의 글을 작성하신다면 출처를 남겨주시길 바랍니다.
문의는 댓글로 남겨주시면 확인 후 답변드리겠습니다.
'데이터 분석 > Python' 카테고리의 다른 글
[텍스트 마이닝-수집] 네이버 블로그 크롤러(2) - 본문 수집 (0) | 2023.09.17 |
---|---|
[텍스트 마이닝-수집] 네이버 블로그 크롤러(1) - 수집할 목록 만들기 (0) | 2023.09.15 |
[텍스트 마이닝-오류] 크롬드라이버 오류: 셀레니움 크롤링 실행시 scoped_dir 폴더 및 파일 생성 (0) | 2023.05.25 |
[텍스트 마이닝-정제] Mecab-Ko 사전 품사 태그 (0) | 2023.03.17 |
[텍스트 마이닝-수집] 네이버 블로그 스크래핑 (0) | 2023.03.16 |
댓글