본문 바로가기
파이썬(Python), 머신러닝, 딥러닝

[데이터분석] 웹 크롤링(Web Crawling) 기초 (파이썬, 코랩)

by 굳세라(goodsarah) 2023. 8. 15.
728x90
반응형

웹 크롤링의 기초에 대해서 알아보겠습니다.

 

1. 웹 크롤링(Web Crawling) / Selenium 라이브러리 / Selenium의 webdriver

 

웹 크롤링(Web Crawling)이란?

- 웹 크롤링은 인터넷 상의 웹 페이지들을 자동으로 탐색하고 필요한 정보를 수집하는 프로세스를 말합니다.

- 대표적인 웹 크롤링의 활용 사례는 1)정보 수집, 2)검색 엔진의 색인 구축, 3)가격 비교 웹사이트, 4)뉴스 집계 사이트 등 다양한 목적으로 활용될 수 있습니다. 

 

Selenium 라이브러리란?

 

- Selenium은 웹 어플리케이션 자동화 및 테스트를 위한 포터블(Portable) 프레임워크 입니다.

- 이를 활용해 웹 사이트를 테스트하고 브라우저 동작을 자동화할 수 있습니다. 

 

이번 포스팅에서는 Selenium 라이브러리의 webdriver를 활용해서 웹 브라우저를 조작하고, BeatifulSoup 라이브러리를 활용해 웹 페이지 상의 HTML 데이터에서 필요한 정보를 가져오는 방법을 구현해보겠습니다.

 

 

Selenium의 webdriver란?

 

- 크롬이나 인터넷 익스플로러 등에서 사이트 접속, 버튼 클릭, 글자 입력과 같이 웹 브라우저에서 사람이 할 수 있는 일들을 코드를 통해 제어할 수 있는 라이브러리를 말합니다.

- 이를 활용하기 위해서는 웹 브라우저의 종류에 따라 제어하는 드라이버가 다른데, 이번 포스팅에서는 크롬드라이버를 활용해 크롤링을 진행하겠습니다.

 

 

2. (파이썬 / 구글 코랩)을 활용한 웹 크롤링 환경 준비

 

1) 먼저, 아래에 있는 코드를 활용하여 Selenium을  설치합니다.

1
2
3
4
5
#Selenium 라이브러리 설치
!pip install selenium
 
#Selenium 라이브러리 불러오기
from selenium import webdriver
cs

 

2) 구글 코랩 환경에서 Selenium 및 Chromium 관련 패키지와 드라이버를 설치

- 아래 코드는 Selenium을 사용하여 웹 크롤링이나 웹 자동화 등을 위해 Chromium 브라우저 및 크롬 드라이버를 설정하고 Colab 환경에서 실행할 수 있게 해줍니다.

1
2
3
4
5
6
7
8
9
10
11
import sys
 
!sudo add-apt-repository ppa:saiarcot895/chromium-beta
!sudo apt remove chromium-browser
!sudo snap remove chromium
!sudo apt install chromium-browser
 
!pip3 install selenium
!apt-get update
!apt install chromium-chromedriver
!cp /usr/lib/chromium-browser/chromedriver /usr/bin/
cs

 

 위 코드를 실행하면 아래와 같은 내용 결과물이 나오며,

 이때 "Press [ENTER] to continue or Ctrl-c to cancel."

 라는 부분을 클릭하고 ENTER 키를 눌러주면 1분 이내에 설치가 완료된다. 

위 코드를 해석해보면 다음과 같습니다.

 

* import sys: 파이썬 내장 모듈인 sys를 임포트합니다. 이 모듈은 파이썬 인터프리터와 관련된 기능을 제공합니다.


* !sudo add-apt-repository ppa:saiarcot895/chromium-beta: Colab에서 리눅스 명령어를 실행하기 위해 !를 사용하며, 이 명령어는 Chromium 브라우저의 베타 버전 저장소를 추가합니다.


* !sudo apt remove chromium-browser: Chromium 브라우저를 제거하는 명령어입니다.


* !sudo snap remove chromium: Snap으로 설치한 Chromium을 제거하는 명령어입니다.


* !sudo apt install chromium-browser: Chromium 브라우저를 설치하는 명령어입니다.


* !pip3 install selenium: Selenium 라이브러리를 설치하는 명령어입니다.


* !apt-get update: 패키지 목록을 업데이트하는 명령어입니다.


* !apt install chromium-chromedriver: Chromium용 크롬 드라이버를 설치하는 명령어입니다.


* !cp /usr/lib/chromium-browser/chromedriver /usr/bin/: 설치된 Chromium 브라우저의 크롬 드라이버를 /usr/bin/ 경로로 복사하는 명령어입니다.

 

Q. Chromium 이란? 

* Chromium(크로미움)은 오픈 소스 웹 브라우저 프로젝트로, 웹 브라우징과 관련된 기술 발전과 웹 표준 준수를 목표로 하며 이를 통해 웹 사용자가 다양한 브라우저에서 통일된 웹 환경을 사용할 수 있도록 제공해주는 서비스를 말합니다.

 

 

3) Selenium 관련 환경을 설정합니다.

- 아래 코드는 Selenium을 사용하여 Chromium 브라우저를 headless mode로 실행하고 웹페이지에서 필요한 요소를 찾는 코드입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
##Selenium 관련 환경 설정
 
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
 
sys.path.insert(0,'/usr/lib/chromium-browser/chromedriver')
 
options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('disable-dev-shm-usage')
 
webdriver_service = Service('/usr/bin/chromedriver')
driver = webdriver.Chrome(service=webdriver_service, options = options)
cs

위 각 코드를 해석하면 아래와 같습니다

 

* import time: 시간과 관련된 기능을 사용하기 위해 time 모듈을 임포트합니다.

* from selenium import webdriver: Selenium 라이브러리의 webdriver 모듈을 임포트합니다. 이 모듈은 웹 브라우저를 조작하는 데 사용됩니다.

* from selenium.webdriver.common.by import By: Selenium의 webdriver 모듈 안에서 By 클래스를 임포트합니다. 이 클래스는 웹 페이지에서 요소를 찾는 데 사용됩니다.

* from selenium.webdriver.chrome.service import Service: Selenium의 webdriver 모듈 안에서 Service 클래스를 임포트합니다. 이 클래스는 웹 드라이버 서비스를 설정하는 데 사용됩니다.

* sys.path.insert(0,'/usr/lib/chromium-browser/chromedriver'): 시스템 경로에 Chromium 브라우저의 크롬 드라이버 경로를 추가합니다. 이렇게 함으로써 시스템이 크롬 드라이버를 찾을 수 있도록 도와줍니다. (단, sys 모듈을 임포트해야 정상적으로 작동합니다.)

* options = webdriver.ChromeOptions(): webdriver.ChromeOptions()를 사용하여 Chrome 브라우저 옵션을 설정합니다.

* options.add_argument('--headless'): Chrome을 무화과 모드로 실행합니다. 즉, 화면에 보이지 않고 백그라운드에서 실행됩니다.

* options.add_argument('--no-sandbox'): 보안 관련 옵션을 설정합니다.

* options.add_argument('disable-dev-shm-usage'): 디바이스 메모리 사용을 비활성화합니다.

* webdriver_service = Service('/usr/bin/chromedriver'): ChromeDriver 서비스를 설정합니다. 실행할 크롬 드라이버의 경로를 지정합니다.

* driver = webdriver.Chrome(service=webdriver_service, options=options): 위에서 설정한 옵션과 서비스를 사용하여 Chrome 브라우저를 실행합니다. driver 객체는 웹 페이지와 상호작용하기 위한 도구를 제공합니다.

 

 

이제 웹 크롤링을 위한 기본 세팅이 완료되었습니다.

 

다음은 예제를 통해 html 태그를 분석해서 크롤링을 하는 방법을 알아보겠습니다.

 

3. 웹 크롤링 구현 (예제 : 멜론 차트에서 곡 정보 가져오기) 

 

이번 예제는 멜론 차트에서 곡 정보를 크롤링해오는 것입니다. 

 

1) 먼저, 멜론 사이트를 웹으로 접속해서 원하는 사이트인지를 확인해줍니다.

 

 

2) 이상이 없다면 해당 사이트의 주소를 확인해줍니다.

 

 

3) 이후 주소를 활용하여 아래와 같이 파이썬에 코드를 입력해주어 해당 사이트의 HTML  코드를 파싱(Parsing) 한다.

 

1
2
3
4
5
6
7
8
#멜론 인기차트 웹페이지 접속하기
url = 'https://www.melon.com/chart/index.htm'
driver.get(url)
 
# HTML 다운로드 및 BeautifulSoup으로 읽기
from bs4 import BeautifulSoup
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
cs

 

여기서, BeatifulSoup을 활용하여 html의 파싱(parsing) 작업을 하는데 

 

HTML 파서(HTML Parser)란 HTML 문서를 파싱하여 문서의 구조를 이해하고 있는 원하는 정보로 추출하는 도구를 말하며

 

파서(Parser)는 컴퓨터 프로그래밍에서 특정 형식의 데이터를 읽어서 그 구조를 부넉하고 처리하는 역할을 수행하는 소프트웨어를 말합니다.

 

즉, HTML 파서를 통해 HTML 형식으로 된 웹 문서를 읽어내는 작업을 말합니다.

 

 

4) 이후, 다시 웹 문서로 돌아와서 정보를 얻고 싶은 페이지 중 원하는 정보 부분에 우클릭을 합니다.

 

 다음으로, 해당 부분에서 "Inspect"(저는 노트북 설정 언어가 영어여서 저렇게 나오고, 한글로 언어가 설정되었을 경우 "검사" 로 나올 겁니다)를 클릭해줍니다.

 

5) Inspect(검사)를  클릭 하면 화면 우측에 아래와 같은 창이 나오는데요. 

 

여기서 우리가 원하는 정보가 속해있는 html 태그를 볼 수 있습니다.

 

특히, 각 1

 

이제 해당 사이트의 html 태그가 아래와 같이 이루어져있음을 확인했으니 원하는 정보인 

 

a) 곡 제목

b) 가수 이름

 

의 위치를 특정하는 일만 남았습니다.

이때, 1개의 행(순위, 곡정보, 앨범, 좋아요 등)은 tr 이라는 태그에 속해 있음을 확인할 수 있습니다.

 

이를 바탕으로 곡 정보(제목 / 가수이름)가 위치한 부분을 찾아가보도록 하겠습니다.  

 

 

6) 곡 제목 및 가수 이름 찾기

 

- 먼저 노래 태그를 찾기 위해 아래와 같이 코딩을 해주고 실행해줍니다.

1
2
3
#노래 태그 찾기
songs = soup.select('tr')  
print(len(songs))
cs

 

-

- 총 101개가 나왔고, 각 행들이 어떤 것들을 의미하는지 확인해봅니다.

 

 

1
2
#첫 번째 행
print(songs[0]) 
cs

첫 번째 행을 확인해본 결과, 각 곡 정보에 대한 칼럼 정보(순위등락 / 앨범 이미지/ 곡 상세가기 등)를 나타내고 있습니다.

 

이는 우리가 원하는 정보를 분류하는 기준일 뿐이지 원하는 정보는 아니므로 다음 행을 확인해봅니다.

 

 

1
2
# 두 번째 행
print(songs[1]) 
cs

해당 행을 확인해보니 우리가 원하는 정보들인, 노래 제목과 가수 이름이 나옵니다.

 

여기서부터 정보를 모으면 되겠습니다. 

 

그래서 첫 번째 행을 제외하고 두 번째 인덱스부터 마지막 인덱스 까지를 선택하는 것으로 데이터를 편집해줍니다.

1
2
3
songs = soup.select('tr')[1:]     # 첫 번째는 제외하고, 두 번째(인덱스번호 1) 부터 끝까지만 선택
print(len(songs))                 # 100  으로   정리하고 싶은 노래 개수에 맞게 선택됨
print(songs[0])                   # 그 중 첫 번째 태그를 보니, 1위 곡으로 조회됨
cs

그 결과 총 100건의 노래에 대한 정보를 가지고 있는 데이터로 편집되었음을 확인할 수 있습니다.

 

이제 세부 위치를 확인하면 됩니다.

 

 

먼저, 곡 제목의 경우, 곡 제목 위에 마우스 우클릭을 하여 Inspect(검사) 누르면 아래와 같은 곳에 위치함을 알수 있습니다. 

 

이때,  태그가 가까운 순으로      'a'   ->   'span'  ->  'div.elipsis rank01' 임을 알 수 있습니다.   

 

 

다음으로, 가수 이름의 경우, 곡 제목 위에 마우스 우클릭을 하여 Inspect(검사) 누르면 아래와 같은 곳에 위치함을 알수 있습니다.

 

이때,  태그가 가까운 순으로      'a'   ->  'div.elipsis rank02' 임을 알 수 있습니다.   

 

위에서 확인한 내용을 바탕으로, 각 정보들을 추출하는 코드를 작성하면 아래와 같습니다.

 

 

1
2
3
4
5
# 멜론 50위 노래순위 정보 가져오기
for song in songs:                                        
    title = song.select('div.ellipsis.rank01 > span > a')[0].text
    singer = song.select ('div.ellipsis.rank02 > a')[0].text  
    print(title, singer, sep = ' | ')
cs

 

그리고 그 결과는 아래와 같이 원하던 대로 나오게 됩니다.

 

이제 이를 csv 형태로 저장하여 추가적인 분석에 활용될 수 있게 해보겠습니다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import pandas as pd
from bs4 import BeautifulSoup
import requests
 
data = []
 
for song in songs:
    title = song.select('div.ellipsis.rank01 > span > a')[0].text
    singer_tag = song.select('div.ellipsis.rank02 > a')
    singer = singer_tag[0].text
    data.append({'title': title, 'singer': singer})
 
# 데이터 프레임 생성
df = pd.DataFrame(data)
 
df.head(10)
cs

 

이와 같은 방법을 적용하여 

 

다른 크롤링 작업에도 활용하시면 손쉽게 업무를 처리하실 수 있을 겁니다~

728x90
반응형

댓글