본문 바로가기
[스파르타 코딩클럽]/비개발자를 위한, 웹개발 종합반

파이썬 웹스크래핑(크롤링)기초/beautifulsoup4

by 수민띠 2023. 2. 23.

크롤링

웹사이트에 접속해서 데이터를 솎아내어 가져오는 기술

 

크롤링에 필요한 라이브러리 설치 - beautifulsoup4

beautifulsoup4  - 파이썬에서 크롤링을 할 때 사용하는 라이브러리

HTML 및 XML 문서를 파싱 하는 것을 쉽게 만들어주어 사용자가 웹 사이트에서 필요한 정보를 추출할 수 있도록 도와줌

※가상환경이 활성화되었는지 확인하고 설치

pip install bs4

 

크롤링 기본 세팅

import requests
from bs4 import BeautifulSoup

# 타겟 URL을 읽어서 HTML를 받아오고,
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
data = requests.get('여기에 url 입력',headers=headers)

# HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦
# soup이라는 변수에 "파싱 용이해진 html"이 담긴 상태가 됨
soup = BeautifulSoup(data.text, 'html.parser')

### 이제 코딩을 통해 필요한 부분을 추출하면 됨 ###


beautifulsoup라이브러리의 select / select_one 사용법

# 선택자를 사용하는 방법
select('태그명')
select('.클래스명')
select('#아이디명')
select('상위태그명 > 하위태그명 > 하위태그명')
select('상위태그명.클래스명 > 하위태그명.클래스명')

# 태그와 속성값으로 찾는 방법
select('태그명[속성="값"]')

# 한 개만 가져오고 싶은 경우
select_one('위 내용과 동일')

 

네이버영화 페이지 크롤링 해보기

#네이버 영화페이지
https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829


영화 제목 하나 가져와보기
1. 타겟 URL접속 -> 가져오고 싶은 곳에 우클릭  -> 검사

2. Copy -> Copy selector

3. beautifulsoup의 select_one()을 사용해서 터미널에 찍어보기

import requests
from bs4 import BeautifulSoup

headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
data = requests.get('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829',headers=headers)

soup = BeautifulSoup(data.text, 'html.parser')

# Copy한 것 붙여 넣기
a = soup.select_one('#old_content > table > tbody > tr:nth-child(2) > td.title > div > a')
print(a)

list 형태

4. 태그 안의 텍스트/ 속성을 터미널에 찍어보기

태그 안의 텍스트 가져오기 → 태그.text
태그 안의 속성 가져오기 → 태그['속성']
b = soup.select_one('#old_content > table > tbody > tr:nth-child(2) > td.title > div > a').text
print(b)

 
영화 제목 모두 가져와보기

import requests
from bs4 import BeautifulSoup

headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
data = requests.get('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829',headers=headers)

soup = BeautifulSoup(data.text, 'html.parser')

#old_content > table > tbody > tr:nth-child(2)
#old_content > table > tbody > tr:nth-child(3)
# <tr>들의 공통되는 부분 추출후 select를 이용해서, tr들을 불러오기
trs = soup.select('#old_content > table > tbody > tr')
#반복문 돌려서 원하는 데이터 뽑기
for tr in trs:
    a = tr.select_one('td.title > div > a')
    if a is not None: #조건에 대한 이유 밑에 더보기란
      print(a.text)

더보기
for tr in trs:
    a = tr.select_one('td.title > div > a')
    if a is not None:  
      print(a.text)

위 코드에서 if a is not None:를 지우고 실행시키면 에러 발생

그 이유는 웹 사이트 자체에서 10과 11 사이의 줄도 tr로 만들었고

text가 없기 때문