본문 바로가기
마케팅 정보방/코딩 공부방

데이터분석 웹크롤링 RISS로 쉽게 연습하기

by 그로스마케터 제시 2022. 3. 5.
반응형

 

※ 모든 과정의 코드를 가져오지는 않았다는 점 참고해주세요.  

※ 간단한 크롤링 방법을 제외하고, 신경 쓴 부분들만 가져왔습니다. 

 

#폴더 생성 방법 
f_dir = 'c:\\py_temp\\'
now= time.localtime()
time_stamp='%d-%d-%d-%d'%(now.tm_mon, now.tm_mday, now.tm_hour, now.tm_min)
folder_name = f_dir+search+'_'+time_stamp

os.mkdir(folder_name) #폴더 생성
os.chdir(folder_name) #디렉토리 변경

#텍스트 파일 생성
f_name = folder_name+'\\'+search'+'.txt' #\\를 넣어서, 경로로 들어가게 함

 

#콤마 제거하기
search_num = soup.find('div',class_='searchBox').find('span',class_='num')

numb=[]
numbe=''
num =search_num.get_text() #3,000
for i in num:
    numb.append(i)   
    if ',' in numb:
        numb.remove(',')
numbe=int( "".join(numb))

print("검색결과: ",numbe,"건")

처음으로 웹크롤링을 했었던 코드라 그런지, 3,000에서 콤마 하나 제거하는데 굉장히 많은 과정을 거쳤다. 

리스트 만들어서 for loop으로 넣어주고, 콤마가 있을 경우 제거해라... 그리고 그 리스트에 있는걸 또 스트링에다 넣어주는 작업... num, numb, numbe 까지ㅋㅋㅋㅋ number은 안 채웠네^^;;;

 

이후 웹크롤링을 하면서, \n과 \t라는 복병을 만나게 되고... 전처리 작업 구글링으로 거의 모든 포스트를 본 거 같다. 

여튼 전처리 방법은 나중에 모아서 한번 더 포스팅을 해볼 심산이다. 

 

 

   #요약
    try:
        abstract= soup.find('div',class_='content additionalInfo').find_all('p') 
    except:
        abstract='null'
    else:
        if '다국어 초록 (Multilingual Abstract)' in abstract[0].get_text(): #영어면 번역해주기
            abstract= soup.find('div',id='transedContent1').get_text()

        elif '국문 초록' in abstract[0].get_text(): 
            abstract=abstract[2].get_text()

상세페이지에서 내용 가져오기!

요약 부분은 영어로 되어 있을 때도 있고, 한국어로 되어 있을 때도 있었다. 심지어 영어가 없으면 한국어 요약이 앞에 와서... 상페마다 순서 완전 뒤죽박죽

1. 종류별로 상세페이지 열어봐서 어느 부분을 파고들면 될지 파악부터 했다. 

2. 다국어 초록이 앞에 나올 경우, 국문 초록은 transedContent1 이라는 id값을 받는 것을 발견하고 그걸로 get

3. 국문 초록이 앞에 올 경우, translation이 필요 없으므로, 그대로 내용이 오는 자리의 인덱스값을 넣어줬다. 

4. 둘다 없으면 except: abstract = 'null'. 그냥 null 써야지~ 만 알고 있었는데

abstract = 'null' 혹은 abstract = Null 이렇게 대소문자를 신경써줘야 한다!

 

 

#저자, 발행기관, 학술지명
block=soup.find('div',class_='infoDetailL').find('ul').find_all('li')

for i in block:  
    try:
        if i.find('span').get_text()== '저자':
            author = i.find('div').get_text()

        elif i.find('span').get_text() =='발행기관':
            organization = i.find('div').get_text()

        elif i.find('span').get_text() =='학술지명':
            paper = i.find('div').get_text()

    except:
        continue

텍스트가 아니라 버튼 형태로 되어 있는 경우! 

1. 전체블록 = 'li' 까지 최대한 좁게 영역 잡아서 불러와 주기

2. for loop 안에 try, except 구문 넣기

3. 'span'의 텍스트가 '저자'일 때, 같은 곳의 'div'를 불러와라

4. 저중에 하나라도 없을 때, 에러가 나면 안 되기 때문에 except에서는 continue를 넣어서 보내주기 

 

 

    #텍스트에 담아주기

orig_stdout = sys.stdout  #인터페이스 화면 바꿔줄거다 
text_file = open(f_name,'a',encoding='UTF-8-sig') #텍스트 파일 'a' 형태로 열어라
sys.stdout = text_file #바로 그 화면으로 바꿀 거니까

print("1.제목:",title)
print("2.요약:",abstract)
print("3.저자:",author)
print("4.발행기관:",organization)
print("5.학술지명:",paper)
print("6.URL:",current_url)

text_file.close() #다 프린트 했으면 닫자
sys.stdout = orig_stdout #원상복구 하자

텍스트에 담아줄 때는, orig_stdout = sys.stdout -> sys.stdout = text_file 로 명시해주는 거 잊지 말자

 

 

count = int(input("몇 건을 추출하시겠습니까? ")) #15건

cnt=0
for j in range(2,count//10+3): #페이지 넘어가는 for loop 
  
    for i in range(1,11): #100 추출 시킴. #페이지 안에서 li 보는 for loop 
        enter = f'//*[@id="divContent"]/div[2]/div/div[4]/div[2]/ul/li[{i}]/div[2]/p[1]/a'
        driver.find_element_by_xpath(enter).click()
        time.sleep(2)
        
        detail(f_name) #상세페이지
        time.sleep(2)
        
        driver.back() #돌아와라
        time.sleep(2)
        
        cnt+=1  # cnt == 15 일때 그만.
        print(cnt)
        
        if cnt == count : #만약 8건만 추출할려면 한페이지 안 넘어가니까 끝남 
            print("검색이 끝났습니다.")
            break

    try:
        driver.find_element_by_link_text('%s'%j).click()
        time.sleep(2)
        print(f'{j}페이지로 넘어갑니다')
        
    except:
        driver.find_element_by_link_text('다음 페이지로').click()
        time.sleep(2)
        print(f'{j}페이지로 넘어갑니다')
        
    else:
        if cnt == count : #10건 이상이면, 다음페이지에서 input 숫자와 같으면 끝남
                print("검색이 끝났습니다.")
                break

크롤링 메인!

한페이지 다 추출하면 다음 페이지로 넘어가는 게 바로 핵심이죠.

1. count = input으로 몇건 크롤링 할지 받기

2. cnt=0 (루프로 크롤링 한번 하면 1됨. 이게 input과 같아지면 끝낼거임.)

3. 페이지 넘어가는 for loop 먼저 넣기. 2부터 시작!!!!! 다음 페이지는 2번일 거니까

4. 크롤링 for loop 넣기. 한 페이지에 10건 있어서 range(1,11) 

5. 들어가서, 크롤링하고, 돌아와라 -> cnt=1 

6. cnt = count면 추출 끝! (10건 안 넘어가면 추출 끝내야지) 

7. try, except 함수로 다음으로 넘어가주자! 

8. 다 넘어가고 추출 다 했으면 cnt=count 로 끝내주자. 

 

 

이렇게 하면 텍스트 안에 예쁘게 크롤링한 내용들이 들어갑니다! 

 

반응형

댓글