본문 바로가기

AI/StudyNote

Python #웹크롤링 #요약 정보 추출 후 저장

한 페이지에 10개의 글이 있는 게시판의 제목, 작성일자, 조회수를 총 30개 크롤링해보자.

예제용 사이트 : https://aihub.or.kr/notice?field_article_category_target_id=All&combine=&page=0 

 

AI 허브 소식 | AI 허브

AI 허브는 AI 기술 및 제품·서비스 개발에 필요한 AI 인프라(AI 데이터, AI SW API, 컴퓨팅 자원)를 지원함으로써 누구나 활용하고 참여하는 AI 통합 플랫폼입니다.

aihub.or.kr

위의 페이지 게시판 영역에서 데이터를 크롤링 하고, xpath를 활용해 페이지를 총 3번 이동시켜 총 30개의 요소를 크롤링 해보자.

 


1. 필요한 모듈과 라이브러리 로딩

#필요한 모듈과 라이브러리 로딩
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import math#수식을 위한 모듈

 

 

2. 크롤링 건수 입력 및 전체 페이지수 계산

#크롤링 건수 입력 및 전체 페이지수 계산
cnt = int(input('크롤링할 건 수는 몇 건입니까?: '))

#크롤링할 전체 페이지 수
#크롤링 건수를 한페이지 게시판 갯수 10으로 나누고 반올림.
#30건이면 총 3페이지를 크롤링한다.
page_cnt = math.ceil(cnt/10)

크롤링할 건 수는 몇 건입니까?: 30

 

 

3. 크롬 드라이버를 사용해서 웹 브라우저를 실행합니다.

#크롬 드라이버를 사용해서 웹 브라우저를 실행합니다.
path = "C:\python_temp\chromedriver.exe"
driver = webdriver.Chrome(path)
driver.get("https://aihub.or.kr/notice?field_article_category_target_id=All&combine=&page=0")

 

 

 

4. 사용자가 입력한 건수와 실제 데이터 건수를 비교

#사용자가 입력한 건수와 실제 데이터 건수를 비교합니다.
'''
==================================================
요청하신 글 건수는 30건이고, 
실제 존재하는 글의 건수는 324건이므로
실제 크롤링 글 건수는 30건으로 재설정하고,
총 3페이지의 게시글 수집을 진행하겠습니다.
==================================================
'''

#재설정 할 건수
cont2 = 0 

html = driver.page_source#페이지 전체를 가져옴
soup = BeautifulSoup(html, 'html.parser')

#마지막 게시글 번호(총 게시물 갯수)
total_no = soup.find('span','totalboard-list-uid').get_text()

#검색 건수보다 게시물 수가 적을 경우를 위한 예외처리
#검색 건수가 총 게시물 수를 넘어가면 재설정 건수는 총 게시물수
if cnt > int(total_no):
    cnt2 = int(total_no) 
else:
    cnt2 = cnt
    
 #실제 데이터와 비교해서 나온 페이지 수
real_page_cnt = math.ceil(cnt2/10)

print("="*60)
print('요청하신 검색 건수는 {}건이고,\n해당 키워드로 실제 검색된 글의 건수는 {}건이므로\n실제 검색 건수는 {}건으로 재설정하고,\n총 {}페이지의 게시글 수집을 진행하겠습니다.'.format(cnt,total_no,cnt2,real_page_cnt))
print("="*60)

============================================================

요청하신 검색 건수는 30건이고,

해당 키워드로 실제 검색된 글의 건수는 324 건이므로

실제 검색 건수는 30건으로 재설정하고,

총 3페이지의 게시글 수집을 진행하겠습니다. ============================================================

 

 

4. 페이지 반복 및 크롤링

no = 1 #크롤링 순서 글번호

#1페이지 부터 반복 시작
for x in range(1, real_page_cnt+1):
    print("{}페이지 내용 수집 시작합니다.".format(x),"="*50)
    print('\n')
    time.sleep(2) #로딩이 있을 수 있으니 잠시 대기
    
    html = driver.page_source#페이지 전체를 가져옴
    soup = BeautifulSoup(html, 'html.parser')
    content_list = soup.find('tbody').find_all('tr')


    
    for i in content_list:

        #크롤링 순서대로 글번호 먹임
        print('번호:', no)

        #게시글 제목
        title = i.find('td', 'views-field views-field-views-conditional-field-2 views-field-views-conditional-field').get_text()
        print('제목:', title.strip())

        #게시글 작성일
        date = i.find('td','views-field views-field-views-conditional-field-2 views-field-views-conditional-field').get_text()
        print('작성일자:', date.strip())

        #게시글 조회수
        v_count = i.find('td', 'views-field views-field-totalcount').get_text()
        print('조회수:', v_count.strip())  
        
        #게행
        print()
        
        #예외처리
        if no == cnt2: #검색 결과수가 cnt2랑 같으면 빠져나감
            break   
            
        no+= 1 #크롤링 번호 1씩 증가
    
    time.sleep(2)
    
    
    #예외처리 지정된 페이지만큼 돌면 페이지가 더 안넘어가게.
    if x == real_page_cnt+1:
        break
    
    time.sleep(2)
    #페이지 이동
    #사이트 마다 구조가 다름..
    if x == 1:
        driver.find_element_by_xpath('//*[@id="totalboard-basic-list"]/div/nav/ul/li[2]').click()
    elif x > 1:
        driver.find_element_by_xpath('//*[@id="totalboard-basic-list"]/div/nav/ul/li[5]').click()
        
    x += 1  #페이지 증가

30번 까지 출력완료.

 

 

반응형