Web에 있는 방대한 정보를 손쉽게 수집하는 방법인 웹 크롤링!
12 Feb 2023 -
2 minute read
작성자 : 윤수빈
웹크롤링 ( Web Scraping ) 이란 ?
웹사이트의 방대한 정보를 기계적으로 다운로드해 원하는 정보를 수집, 분석, 추출하는 기술
- 정형 데이터 : 일정한 규격에 맞춰서 구성된 데이터
- ex. 관계형 데이터베이스의 테이블, 엑셀의 시트 등
- 반정형 데이터 : 일정한 규격으로 구성되어 있지 않지만, 일정한 틀을 갖추기 위해서 태그나 인덱스 형태로 구성된 데이터
- ex. HTML, JSON, XML 등
- 비정형 데이터 : 구조화 되지 않는 형태의 데이터
- ex. SNS, 영상, 이미지, 음성, 텍스트
이번 포스팅은 py을 통해, 원하는 데이터를 추출하는 크롤링 기술과 크롤링한 데이터를 엑셀 시트에 저장하는 코드를 정리하고자 한다.
# 사용하는 모듈
import requests
import openpyxl
from bs4 import BeautifulSoup
모듈들의 사용법은 아래의 사이트 + 구글링을 통해 이해하면 좋을 거 같다.
requests 공부 사이트 : https://www.w3schools.com/py/ref_requests_post.asp
openpyxl 공부 사이트 : https://wooiljeong.github.io/py/openpyxl-tutorial/
BeautifulSoup 공부 사이트 : https://library.gabia.com/contents/9239/
웹 크롤링 소스 정리
url = # 수집하고 싶은 사이트의 url
headers = {
# url의 headers 내용을 json 형식으로 넣어준다.
"Accept" : "",
"Accept-Encoding" : "",
"Accept-Language" : "",
"Cache-Control" : "",
"Host" : "",
"Content-Type" : "",
"Referer" : "",
"User-Agent" : ""
# 등등
}
page = {
# page의 정보를 json 형식으로 넣어준다.
# page 정보를 넘겨 줄 필요가 없다면 생략 가능
"page" : "",
"seCode" : "",
"searchType" : "",
"searchTxt" : "",
# 등등
}
# url, hearders, page 정보를 넘겨준다.
result = requests.post( url, hearders=headers, data=page)
shtml = ""
# 요청이 성공적일 때
if result.status_code == 200:
shtml = result.content
shtml = shtml.decode('utf-8')
# 엑셀로 수집을 하기 위한 작업
wb=openpyxl.load_workbook('/엑셀_파일의_경로')
sheet = wb.active
- 현재 데이터를 수집하는 페이지가 복잡한 로그인 페이지를 통과해야하는 경우가 아니라고 가정하고, 메모리를 많이 먹는 selelinum 대신 beautifulsoup를 사용했다.
# BeautifulSoup를 사용하여 수집
soup = BeautifulSoup ( shtml , "html.parser")
# 클래스명을 안넣어줘도 되지만 좀 더 명확하게 찾고자 넣어주었다.
trs = soup.select('table.클래스명 tr')
count = 2
# for문을 통해 row의 수 만큼 반복
for tr in trs:
tds = tr.select('td')
if not tds:
continue
# table의 컬럼이 5개일 경우라고 가정
num = tds[0].text
tit = tds[1].text
dept = tds[2].text
tel = tds[3].text
date = tds[4].text
num_index = 'A'+str(count)
tit_index = 'B'+str(count)
dept_index = 'C'+str(count)
tel_index = 'D'+str(count)
date_index = 'E'+str(count)
# 엑셀 시트에 데이터를 수집
sheet[num_index].value = num
sheet[tit_index].value = tit
sheet[dept_index].value = dept
sheet[tel_index].value = tel
sheet[date_index].value = date
count += 1
# 엑셀 시트 저장
wb.save('/엑셀_파일의_경로')