한 페이지에 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번 까지 출력완료.
반응형
'AI > StudyNote' 카테고리의 다른 글
Python #폴더의 존재 유무 판단 #OS 모듈 메서드 (0) | 2021.09.26 |
---|---|
Python #이미지크롤링 및 저장 (0) | 2021.09.23 |
Python #엑셀다루기 (0) | 2021.09.14 |
Python #웹크롤링 #txt #xlsx #csv (0) | 2021.09.14 |
Python #웹크롤링 #xpath #txt파일저장 (0) | 2021.09.13 |