[Python] 파이썬 웹 크롤링 하는법 & 간단 예제

웹 크롤링(Web Crawling)은 웹 사이트를 자동으로 서치하고 데이터를 수집하는 프로세스를 뜻합니다. 그리고 이 웹 크롤링은 파이썬이 강점을 가지고 있습니다. 파이썬이 웹 크롤링에 필요한 여러 가지 라이브러리와 풍부한 생태계를 갖추고 있기 때문입니다. 그중에서도 requests와 BeautifulSoup 라이브러리를 많이 사용하는데요. 이번 포스팅에서는 이 라이브러리를 사용하여 크롤링하는 방법에 대해 알아보도록 하겠습니다. 

 


 

 파이썬에서 웹 크롤링 하는 법 

라이브러리 다운로드(requests, beautifulsoup)

일반적으로 파이썬 웹 크롤링은 requests 라이브러리를 사용하여 웹 페이지의 HTML을 가지고 오고, beautifulsoup를 사용하여 HTML코드를 사용하기 쉽게 나눠주는 파싱이라는 과정을 거쳐서 사용하게 됩니다. 이 라이브러리 두 개가 핵심적인 역할을 하고 있기 때문에 requests, beautifulsoup 모듈이 설치되어 있지 않다면 먼저 설치해 주도록 합시다.

 

pip install requests
pip install beautifulsoup4

명령 프롬프트 CMD창을 켠 뒤 위의 명령어를 실행시켜 라이브러리를 다운로드하시면 됩니다.

 

 

 

웹 크롤링 순서

  1. URL 추출: 먼저 타깃 URL을 선택하고 크롤러를 통해 페이지의 HTML을 다운로드합니다. 그 후 HTML에서 다른 링크를 추출하여 다음에 방문할 페이지를 설정합니다.
  2. 웹 페이지 다운로드: 크롤러가 설정한 URL로 이동하고 해당 페이지의 HTML을 다운로드합니다. 이때, HTTP 요청을 통해 서버로부터 페이지의 데이터를 받아오게 됩니다.
  3. HTML 파싱: 다운로드를 완료한 HTML에서 필요한 정보를 추출하기 위해 데이터를 파싱 하는 작업을 진행합니다. 일반적으로는 BeautifulSoup 라이브러리를 사용합니다.
  4. 데이터 추출: 파싱을 완료한 HTML에서 원하는 데이터를 추출합니다. 
  5. 데이터 저장 또는 활용: 추출한 데이터를 원하는 형식으로 저장하거나, 분석 등 다양한 용도로 활용합니다.

 


 

 웹 크롤링 예제  

from bs4 import BeautifulSoup
import urllib.request
import re 

#User-Agent를 조작하는 경우(아이폰에서 사용하는 사파리 브라우져의 헤더) 
hdr = {'User-agent':'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/603.1.23 (KHTML, like Gecko) Version/10.0 Mobile/14E5239e Safari/602.1'}

for n in range(0,10):
        #클리앙의 중고장터 주소 
        data ='https://www.clien.net/service/board/sold?&od=T31&po=' + str(n)
        #웹브라우져 헤더 추가 
        req = urllib.request.Request(data, \
                                    headers = hdr)
        data = urllib.request.urlopen(req).read()
        page = data.decode('utf-8', 'ignore')
        soup = BeautifulSoup(page, 'html.parser')
        list = soup.find_all('span', 
                attrs={'data-role':'list-title-text'})

        for item in list:
                try:
                        title = item.text.strip()
                        #print(title) # 클리앙 글 출력
                        if (re.search('아이패드', title)): # 아이패드에 관련된 글만 출력
                                print(title.strip())
                except:
                        pass

간단한 예시로 클리앙이라는 사이트의 중고장터에서 데이터를 크롤링하여 아이패드 관련 제목을 출력하는 소스코드를 짜보았습니다. 아래에 소스코드 구문 분석을 통해 위의 소스코드를 자세히 설명할 테니 참고하셔서 여러분들이 데이터를 가지고 와야 할 사이트를 크롤링해 보시기 바랍니다.

 

 

 소스코드 구문 해석  

라이브러리 가져오기

from bs4 import BeautifulSoup
import urllib.request
import re

먼저 크롤링에 필요한 라이브러리를 import 하도록 하겠습니다.

 

 

사용자 에이전트 헤더 설정하기

hdr = {'User-agent':'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/603.1.23 (KHTML, like Gecko) Version/10.0 Mobile/14E5239e Safari/602.1'}

최근에는 무분별한 크롤링과 서버 과부하를 막기 위해 사람이 직접 접속한 게 아니라 프로그램을 통하여 접속하는 것을 차단하는 사이트들이 많습니다. 클리앙이라는 사이트도 그중 하나죠. 그래서 우리는 user-agnet를 조작하여 iPhone 유저인 것처럼 속여서 차단을 우회하도록 하겠습니다.

 

 

타깃 페이지 범위 지정하기

for n in range(0, 10):

클리앙 중고장터에는 어마어마한 데이터가 있기 때문에 10페이지까지만 가지고 오도록 하겠습니다.

 

 

URL 구성하기

data ='https://www.clien.net/service/board/sold?&od=T31&po=' + str(n)

페이지 번호를 매개변수로 줘서 중고시장 게시판의 각 페이지에 대한 URL을 구성하겠습니다.

 

 

크롤링 요청 보내기

req = urllib.request.Request(data, headers=hdr)
data = urllib.request.urlopen(req).read()

아까 설정했던 아이폰 User-Agent 헤더를 사용하여 클리앙 URL에 요청을 보내고 응답을 읽습니다.

 

 

HTML 구문 분석

page = data.decode('utf-8', 'ignore')
soup = BeautifulSoup(page, 'html.parser')

크롤링하여 가지고 온 HTML코드를 사용하기 쉽게 BeautifulSoup을 사용하여 파싱합니다.

 

 

제목 찾기

list = soup.find_all('span', attrs={'data-role':'list-title-text'})

F12 개발자모드로 클리앙 사이트를 분석해 보면 클리앙의 제목은 <span> 태그의 data-role="list-title-text"으로 설정되어 있는 것을 확인할 수 있습니다. 그래서 이 속성이 설정된 요소를 가지고 오면 게시글 제목을 가지고 올 수 있습니다..

 

 

아이패드와 관련된 제목만 추출하고 출력하기

try:
    title = item.text.strip()
    if (re.search('아이패드', title)):
        print(title.strip())
except:
    pass

각 제목의 텍스트 내용을 추출하고, 선행/후행 공백을 제거한 뒤 '아이패드'라는 단어가 포함된 제목만 출력합니다.

댓글

Designed by JB FACTORY