뒤로
Jinwoo Hwang
Jinwoo Hwang ·

간단한 논문 서치용 크롤러

개발로그를 어쩌다 보니 또 방치를 해버렸는데...고사기간만 끝나면 한 번 재개해 보겠습니다~ 문어발 식으로 사는 것의 폐해 중 하나 같네요ㅠㅠ

오늘은 졸업논문 때문에 잠시 시간 내서 짰던 간단한 Google Scholar 크롤러 코드 하나 던지고 가는 거로 퉁치려고 합니다 👀

사실 대단한 것도 아니고, 비슷한 거, 더 좋은 거 꽤 많지만 시간이 없는데 논문 리스트업 해두고 슥 볼 때 쓰고 싶은 분들이 또 있으실까 싶어서... (차주에 전 교수님 미팅이라 ㅎㅎ)

하나의 파일에 그냥 간단하게 짰고요, 크롬드라이버 위치 정도만 잘 확인해서 고쳐 써 주시면 될 것 같아요. 크롬드라이버 + 구글크롬 stable 버젼 설치 관해선 구글링하면 그래도 꽤 잘 나와 있으니 일단 생략할게요.

함수에 몇 페이지까지 크롤링하고 싶은지, 어떤 내용을 검색하고 싶은지 넣고 실행해 주시면 됩니다~ 셀레늄이 구글 크롬 창 띄우는 게 싫으시면 --headless 옵션 주석을 풀어주시면 안 보이게 돌아갑니다.

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
import json
import time

def crawl(search_term: str, num_pages: int):
    # Setting up Selenium WebDriver
    options = webdriver.ChromeOptions()
    options.add_argument("--disable-background-timer-throttling")
    options.add_argument("--disable-backgrounding-occluded-windows")
    options.add_argument("--disable-renderer-backgrounding")
    # options.add_argument('--headless')  # Uncomment to run headless

    service = Service('/opt/homebrew/bin/chromedriver')

    pagination_size = 10
    result_dict = {}

    for it in range(num_pages):
        driver = webdriver.Chrome(service=service, options=options)
        url = f'https://scholar.google.com/scholar?start={pagination_size * it}&q={search_term.replace(" ", "+")}&hl=ko&as_sdt=0,5'
        driver.get(url)

        WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, '//h3/a[@href]')))
        results = driver.find_elements(By.XPATH, '//h3/a[@href]')
        for result in results:
            print(result.text, result.get_attribute('href'))
            result_dict[result.text] = result.get_attribute('href')
    with open('results.json', 'w') as json_file:
        json.dump(result_dict, json_file, indent=4)

    driver.quit()
    print("Data has been successfully saved to 'results.json'.")


if __name__ == '__main__':
    crawl("parkinson's disease turn detection", 5)
5

댓글

로그인 후 댓글을 남길 수 있습니다.

아직 댓글이 없습니다.