나홀로 데이터 분석가의 1인 연구실
[웹 크롤링] Requests를 통한 데이터 수집하기 본문
0-1. 학습 목표
Requests 라이브러리를 활용하여 경희대학교 블로그 웹 크롤링 해보기
Webdriver를 사용한 웹 크롤링
0-2. 활용 라이브러리
- Requests
- Pandas
- BS4
- tqdm(선택)
1-1. 웹 크롤링 방식
제가 사용하는 웹 크롤링 라이브러리는 크게 2가지로, Requests와 Selenium(Webdriver)입니다.
두 라이브러리의 특징을 저는 다음과 같다고 생각하여 다른 상황에서 활용을 합니다.
- Requests는 단순하고, 빨라서 일반적인 상황에 활용합니다.
- Webdriver는 범용성이 높고, 직관적이기에 특수한 상황에서 활용합니다.
특수한 상황은, 웹 페이지와 상호작용(클릭, 입력 등)을 통해 정보를 수집할 수 있는 상황을 의미합니다.
1-2. 웹 크롤러 구현 순서
사람마다 웹 크롤러 구현 순서는 다를 수 있으며, 저는 아래와 같은 순서로 보통 구축을 합니다.
2. 웹 크롤러 구현
# Import Libraries
import requests
import bs4
import pandas as pd
from tqdm import tqdm
- requests: 데이터 수집을 위한 라이브러리
- bs4: HTML에서 데이터 추출을 원활하게 하기 위한 라이브러리
- pandas: 데이터 처리 관련 라이브러리
- tqdm: 반복구문(for)의 처리 진행도 확인을 위한 라이브러리(필수X)
# Target URL
오늘의 타겟은 [경희대학교 공식 블로그]의 [경희 NOTICE] 카테고리의 [글 제목]입니다.
본격적인 웹 크롤러 개발을 위해서는 목표 URL의 패턴을 우선 파악해야합니다.
[경희대학교 공식 블로그]에 [경희 NOTICE]에 입장하면 <그림2>와 같은 URL이 나옵니다.
제 생각에는 빨간색은 '경희대학교 공식 블로그', 녹색은 '경희 NOTICE', 파란색은 '페이지 순서'를 의미하는 것 같습니다.
저희는 같은 카테고리에서 페이지 순서만 바꿀 예정이니 파란색을 패턴(변수)으로 정하도록 하겠습니다.
💡Tip: 보통 첫번째 페이지는 파란색 부분(페이지 순서)이 생략되어있는 경우가 많으니, 두번째 페이지를 꼭 확인해보세요.
# Extract HTML from Web Page
이제는 개별 정보를 추출할 단계입니다.
page_num = 1
url = f'https://blog.naver.com/PostList.naver?from=postList&blogId=khublog&categoryNo=83¤tPage={page_num}'
이를 위해서는 우선 테스트 페이지를 설정하고 진행하도록 하겠습니다.
테스트 페이지는 첫번째 페이지로 진행합니다.
source = requests.get(url).text
source = bs4.BeautifulSoup(source)
- requests.get(url): url에 대한 접근 코드
- requests.get(url).text: url에 대한 접근 후 Web Page Source를 출력
- bs4.BeautifulSoup(source): source를 HTML 구조에 맞게 정리
여기까지 하셨다면 웹 페이지에서 HTML을 추출하는 것까지는 완료 되었습니다.
# Develop Elements Crawler
추출한 HTML에서 글 제목 Element가 어떻게 저장되어있는 지 확인하고 값을 추출해보겠습니다.
확인 해보면 <그림3>과 같이 구성되어있으며, 이를 토대로 아래와 같이 코드를 작성해주시면 됩니다.
- 빨간색: 이름
- 녹색: 속성
- 파란색: 글 제목
titles = source.find_all('strong', class_ = 'title ell')
print(titles[0].text)
# Develop One Page Crawler
원하는 Element의 값을 개별적으로 모두 추출할 수 있다면, 이제 한 페이지를 크롤링하는 함수를 정의합니다.
지금은 글 제목만 추출하기에 굳이 함수 정의를 할 필요가 없으나, 차후 여러 Element를 추출할 때에는 함수 정의를 하시는 게 좋습니다.
def one_page_crawler(source):
titles = source.find_all('strong', class_ = 'title ell')
for title in titles:
title_lst.append(title.text)
#run
title_lst = []
one_page_crawler(source)
#check
title_lst
# Develop Whole Pages Crawler
한 페이지를 무사히 크롤링할 수 있다면 반복문을 통해 아래와 같이 전체 페이지에 대한 크롤링을 진행해주시면 됩니다.
title_lst = []
for page_num in tqdm(range(1, 7+1)):
url = f'https://blog.naver.com/PostList.naver?from=postList&blogId=khublog&categoryNo=83¤tPage={page_num}'
source = requests.get(url).text
source = bs4.BeautifulSoup(source)
title_crawler(source)
'Python > Practice' 카테고리의 다른 글
[Python] 던파데이터 / 네오플 API 사용하는 법 - 2 (0) | 2023.04.30 |
---|---|
[Python] 던파데이터 / 네오플 API 사용하는 법 - 1 (0) | 2023.04.25 |
[웹 크롤링] Webdriver를 통한 데이터 수집하기 (0) | 2022.12.27 |