티스토리 뷰

하려는 것 riss에서 평생교육 키워드로 학위논문/국내학술논문/연구보고서의 논문 개요를 크롤링한 뒤 csv, json 등의 외부 데이터로 저장해서 관계망을 만들고 싶다. 

어디까지 됐지? 셀레니움으로 riss를 켜고, 검색어 '평생교육' 입력 후 우선 '국내학술논문'을 클릭했다. 

문제가 뭐지? 마지막 페이지까지 자동으로 논문의 서지정보를 긁어오게 하려면 어떻게 해야 할지 모르겠다. 

어떻게 해결해 볼까? 구글링을 열심히 했으나(ㅎ) 포기하고 교육받을 때 뉴스기사를 마지막 페이지까지 긁는 코드를 배웠던 기억이 나서 카페로 돌아왔다. (난 다른 분이 그 내용을 질문하셨을 때 설명하는 댓글도 달았는데 싹 까먹은 거다!) 근데 그걸 봐도 모르겠다. 그건 기사 링크를 다루는 거고 이건 xpath를 다루는 거라서 그런... 듯... 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
pip install selenium 
pip install bs4
pip install python-decouple 
import sqlite3
from pandas.io import sql
import os
import pandas as pd
from selenium import webdriver 
from bs4 import BeautifulSoup
driver = webdriver.Chrome(executable_path=r'C:\chromedriver\chromedriver.exe')
driver.maximize_window()
driver.implicitly_wait(3
driver.get('http://www.riss.kr/index.do'#url에 접근
driver.find_element_by_id('query').send_keys('평생교육')
driver.find_element_by_xpath('//*[@id="fullpage"]/div[1]/div/div/div[1]/div/div[2]/form/fieldset/div[1]/div/button').click() 
#키워드 평생교육 입력 후 검색
driver.find_element_by_xpath('//*[@id="divContent"]/div/div/div[2]/div[2]/div[2]/a').click() 
#국내학술지 클릭
driver.find_element_by_xpath('//*[@id="divContent"]/div[2]/div/div[3]/div[1]/div[2]/div[3]/div[1]/label').click()
driver.find_element_by_xpath('//*[@id="divContent"]/div[2]/div/div[3]/div[1]/div[2]/div[3]/div[2]/div/ul/li[5]/a    ').click()
driver.find_element_by_xpath('//*[@id="divContent"]/div[2]/div/div[3]/div[1]/div[2]/button').click() 
#100건씩 조회
cs

 

↑여기까지 해 놓고 안 돼서 카페에 도움을 요청했다.

20분도 안 되어 멘토님이 댓글을 달아주셨는데,

페이지를 이동할 때마다 iStartCount 값이 100 단위로 증가한다는 것 

driver.get(url)을 쓰는 것 

두 가지를 알려주셔서, 다음과 같이 코드를 수정. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import sqlite3
from pandas.io import sql
import os
import pandas as pd
from selenium import webdriver 
from bs4 import BeautifulSoup
import time
 
driver = webdriver.Chrome(executable_path=r'C:\chromedriver\chromedriver.exe')
driver.maximize_window()
driver.implicitly_wait(3
#url에 접근
driver.get('http://www.riss.kr/index.do')
 
driver.find_element_by_id('query').send_keys('평생교육')
driver.find_element_by_xpath('//*[@id="fullpage"]/div[1]/div/div/div[1]/div/div[2]/form/fieldset/div[1]/div/button').click() #키워드 평생교육 입력 후 검색
 
driver.find_element_by_xpath('//*[@id="divContent"]/div/div/div[2]/div[2]/div[2]/a').click() #국내학술지 클릭
 
driver.find_element_by_xpath('//*[@id="divContent"]/div[2]/div/div[3]/div[1]/div[2]/div[3]/div[1]/label').click()
driver.find_element_by_xpath('//*[@id="divContent"]/div[2]/div/div[3]/div[1]/div[2]/div[3]/div[2]/div/ul/li[5]/a    ').click()
driver.find_element_by_xpath('//*[@id="divContent"]/div[2]/div/div[3]/div[1]/div[2]/button').click() #100건씩 조회
 
for i in range(070) :
 
    index = (i +1* 100
    url = 'http://www.riss.kr/search/Search.do?isDetailSearch=N&searchGubun=true&viewYn=OP&queryText=&strQuery=평생교육1&exQuery=&exQueryText=&order=2FDESC&onHanja=false&strSort=RANK&p_year1=&p_year2=&iStartCount={}&orderBy=&fsearchMethod=search&sflag=1&isFDetailSearch=N&pageNumber=&resultKeyword=&fsearchSort=&fsearchOrder=&limiterList=&limiterListText=&facetList=&facetListText=&fsearchDB=&icate=re_a_kor&colName=re_a_kor&pageScale=100&isTab=Y&regnm=&dorg_storage=&language=&language_code=&query=평생교육'.format(index)
    driver.get(url)    
    time.sleep(2)
    driver.find_element_by_xpath('//*[@id="divContent"]/div[2]/div/div[3]/div[1]/div[1]/label/span').click()
    driver.find_element_by_xpath('//*[@id="divContent"]/div[2]/div/div[3]/div[1]/div[1]/ul/li[1]/a').click()
    time.sleep(5)
 
    driver.switch_to.window(driver.window_handles[1])
    driver.find_element_by_xpath('//*[@id="wrap"]/form/div/div[2]/div[1]/div/ul/li[3]/label').click() 
    driver.find_element_by_xpath('//*[@id="riss_gubun"]/div[4]/a[1]').click() #다운로드
    driver.switch_to.window(driver.window_handles[0]) #원래 탭으로 돌아오기 
    
cs

 

결과물 

 

정신사나운 뿌듯함

이거 못 해서 화장실도 참고 있다가 내적 만세 외치면서 뛰어갔다 옴. 와! 신난다! 

 

// 201113 추가

time.sleep(원하는 숫자를 초 단위로)

로딩에 시간이 걸리기 때문에 이걸 중간중간 적절하게 써줘야 중복으로 추출되는 일이 발생하지 않는다.