나홀로 데이터 분석가의 1인 연구실

[웹 크롤링] Requests를 통한 데이터 수집하기 본문

Python/Practice

[웹 크롤링] Requests를 통한 데이터 수집하기

나홀로 데이터 분석가 2022. 12. 26. 17:04

0-1. 학습 목표

Requests 라이브러리를 활용하여 경희대학교 블로그 웹 크롤링 해보기

 

Webdriver를 사용한 웹 크롤링

 

[웹 크롤링] Webdriver를 통한 데이터 수집하기

0-1. 학습 목표 Webdriver 라이브러리를 활용하여 경희대학교 블로그 웹 크롤링 해보기 requests를 사용한 웹 크롤링 2022.12.26 - [Python/Practice] - [웹 크롤링] Requests를 통한 데이터 수집하기 [웹 크롤링] Re

scent-of-light.tistory.com

 

0-2. 활용 라이브러리

  • Requests
  • Pandas
  • BS4
  • tqdm(선택)

 


1-1. 웹 크롤링 방식

제가 사용하는 웹 크롤링 라이브러리는 크게 2가지로, RequestsSelenium(Webdriver)입니다.

두 라이브러리의 특징을 저는 다음과 같다고 생각하여 다른 상황에서 활용을 합니다.

  • Requests는 단순하고, 빨라서 일반적인 상황에 활용합니다.
  • Webdriver는 범용성이 높고, 직관적이기에 특수한 상황에서 활용합니다.

특수한 상황은, 웹 페이지와 상호작용(클릭, 입력 등)을 통해 정보를 수집할 수 있는 상황을 의미합니다.

 

1-2. 웹 크롤러 구현 순서

사람마다 웹 크롤러 구현 순서는 다를 수 있으며, 저는 아래와 같은 순서로 보통 구축을 합니다.

<그림1> 웹 크롤러 구현 순서

 


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', 파란색은 '페이지 순서'를 의미하는 것 같습니다.

저희는 같은 카테고리에서 페이지 순서만 바꿀 예정이니 파란색을 패턴(변수)으로 정하도록 하겠습니다.

<그림2> 경희대학교 공식 블로그 > 경희 NOTICE > 1 페이지


💡Tip: 보통 첫번째 페이지는 파란색 부분(페이지 순서)이 생략되어있는 경우가 많으니, 두번째 페이지를 꼭 확인해보세요.

 

# Extract HTML from Web Page

이제는 개별 정보를 추출할 단계입니다.

page_num = 1
url = f'https://blog.naver.com/PostList.naver?from=postList&blogId=khublog&categoryNo=83&currentPage={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>과 같이 구성되어있으며, 이를 토대로 아래와 같이 코드를 작성해주시면 됩니다.

<그림3> URL 패턴

  • 빨간색: 이름
  • 녹색: 속성
  • 파란색: 글 제목
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&currentPage={page_num}'

    source = requests.get(url).text
    source = bs4.BeautifulSoup(source)

    title_crawler(source)

 

Comments