정의
웹 스크래핑은 웹 페이지에서 우리가 원하는 부분의 데이터를 수집해오는 것을 뜻한다.
한국에서는 crawling 이라는 용어로 혼용해서 사용하는 경우가 많다. crawling은 원래 자동화하여 주기적으로 웹 상에서 페이지들을 돌아다니며 분류/ 색인하고 업데이트된 부분을 찾는 등의 일을 하는 것을 뜻한다.
따라서 web scrapping이라고 검색해야 페이지 추출에 대한 결과가 나올 것이다.
https://dzone.com/articles/web-scraping-vs-web-crawling-whats-the-difference
다음 영화 web scrapping
- 구조
- div class -> box_boxoffice
- ol class -> list_movieranking
- li
- div class -> item_poster
- div class -> thumb_item
- div class -> poster_movie
- div class -> poster_info
- div class -> thumb_cont
- strong class -> tit_item
- a class -> link_txt : 영화 제목
- strong class -> tit_item
- div class -> thumb_item
- div class -> item_poster
- li
- ol class -> list_movieranking
- div class -> box_boxoffice
<div class="box_boxoffice">
<ol class="list_movieranking">
<li>
<div class="item_poster">
<div class="thumb_item">
<div class="poster_movie">
<img src="https://img1.daumcdn.net/thumb/C408x596/?fname=https%3A%2F%2Ft1.daumcdn.net%2Fmovie%2F3f7e3035989e7918c6426e541c864d0d8a295de2" class="img_thumb" alt="범죄도시2">
<span class="rank_num">1</span>
<span class="txt_tag">
<span class="ico_movie ico_see see15">15세이상관람가</span>
</span>
</div>
<div class="poster_info">
<a href="/moviedb/main?movieId=122749" class="link_story">
“느낌 오지? 이 놈 잡아야 하는 거”가리봉동 소탕작전 후 4년 뒤,금천서 강력반은 베트남으로 도주한 용의자를 인도받아 오라는 미션을 받는다.괴물형사 ‘마석도’(마동석)와 ‘전일만’(최귀화) 반장은 현지 용의자에게서 수상함을 느끼고,그의 뒤에 무자비한 악행을 벌이는 ‘강해상’(손석구)이 있음을 알게 된다.‘마석도’와 금천서 강력반은 한국과 베트남을 오가며역대급 범죄를 저지르는 ‘강해상’을 본격적으로 쫓기 시작하는데...나쁜 놈들 잡는 데 국경 없다!통쾌하고 화끈한 범죄 소탕 작전이 다시 펼쳐진다!
</a>
</div>
</div>
<div class="thumb_cont">
<strong class="tit_item"><a href="/moviedb/main?movieId=122749" class="link_txt">범죄도시2</a></strong>
<span class="txt_info">
<span class="info_txt">개봉<span class="txt_num">22.05.18</span></span>
<span class="info_txt"><span class="screen_out">관객수</span>12,693,415명</span>
</span>
</div>
</div>
</li>
</ol>
</div>
Tip: 개발자도구 Elements 탭에서 각 구역을 접어가며 점점 상위 요소를 파악해 id를 갖는 요소까지 올라가면 된다.
<article id="mainContent" class="kakao_article">
<h2 class="screen_out">영화 랭킹 본문</h2>
<div class="section_ranking" data-tiara-layer="list">
<div class="head_section">
<h3 class="tit_section">박스오피스</h3>
<div class="box_boxoffice">
<ol class="list_movieranking">
<li>
<div class="item_poster">
<div class="thumb_item">
<div class="poster_movie">
<img src="https://img1.daumcdn.net/thumb/C408x596/?fname=https%3A%2F%2Ft1.daumcdn.net%2Fmovie%2F3f7e3035989e7918c6426e541c864d0d8a295de2" class="img_thumb" alt="범죄도시2">
<span class="rank_num">1</span>
<span class="txt_tag">
<span class="ico_movie ico_see see15">15세이상관람가</span>
</span>
</div>
<div class="poster_info">
<a href="/moviedb/main?movieId=122749" class="link_story">
“느낌 오지? 이 놈 잡아야 하는 거”가리봉동 소탕작전 후 4년 뒤,금천서 강력반은 베트남으로 도주한 용의자를 인도받아 오라는 미션을 받는다.괴물형사 ‘마석도’(마동석)와 ‘전일만’(최귀화) 반장은 현지 용의자에게서 수상함을 느끼고,그의 뒤에 무자비한 악행을 벌이는 ‘강해상’(손석구)이 있음을 알게 된다.‘마석도’와 금천서 강력반은 한국과 베트남을 오가며역대급 범죄를 저지르는 ‘강해상’을 본격적으로 쫓기 시작하는데...나쁜 놈들 잡는 데 국경 없다!통쾌하고 화끈한 범죄 소탕 작전이 다시 펼쳐진다!
</a>
</div>
</div>
<div class="thumb_cont">
<strong class="tit_item"><a href="/moviedb/main?movieId=122749" class="link_txt">범죄도시2</a></strong>
<span class="txt_info">
<span class="info_txt">개봉<span class="txt_num">22.05.18</span></span>
<span class="info_txt"><span class="screen_out">관객수</span>12,693,415명</span>
</span>
</div>
</div>
</li>
</ol>
</div>
</div>
</article>
beautifulsoup4
HTML 구조를 파악하는데 도움을 주는 beautifulsoup4 패키지
select() 메서드는 조건을 만족하는 모든 요소를 리스트에 담아 반환한다.
select_one() 메서드는 그 중에 가장 위에 나오는 요소를 반환한다.
선택자는 CSS를 작성할 때 사용했던 것 처럼 사용하면 된다.
Tip: 개발자도구 Elements 탭에서 요소를 우클릭한 후 Copy > Copy selector를 선택하면 선택자를 얻을 수 있다.
beaufifulsoup4 사용법
import requests
from bs4 import BeautifulSoup
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36'}
data = requests.get("https://movie.daum.net/ranking/boxoffice/yearly", headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')
# select를 이용해서 li들을 불러오기
# #mainContent > div > div.box_boxoffice > ol > li
movies = soup.select('.kakao_article > .section_ranking > .box_boxoffice > .list_movieranking > li')
for movie in movies:
tag_element = movie.select_one('.tit_item > a')
if not tag_element:
continue
print(tag_element.text)
선택자를 사용하는 방법 ( copy selector )
soup.select('태그명')
soup.select('.클래스명')
sout.select('#아이디명')
위의 형태처럼 사용할 경우, 여러 요소가 선택될 수 있다. 따라서 이를 조금 더 구체화하여 아래처럼 어떤 경로를 거쳐 요소를 찾아야 되는지 명시할 수 있다.
soup.select('상위태그명 > 하위태그명 > 하위태그명')
soup.select('상위태그명.클래스명 > 하위태그명.클래스명')
또한 여러 <li> 태그를 가질때, 몇번째 <li> 인지를 부모의 몇번째 자식인지 명시해서 지정할 수도 있다.
soup.select('.클래스명:nth-child(자식의순서)')
# 예
# #mainContent > div > div.box_boxoffice > ol > li:nth-child(1)
만약 태그와 속성값으로 찾고싶다면 다음 방법도 있다.
soup.select('태그명[속성="값"]')
동일한 클래스가 여러개 존재할 때, 각 요소를 가져오기 위해서 .info_txt:nth-child(2) 처럼 뒤에 :nth-child(숫자)를 붙인다. 이때 숫자는 1부터 시작한다.
그리고 자식들 중 특정 요소를 제거하고 싶은 경우에는 decompose()를 사용할 수 있다.
import requests
from bs4 import BeautifulSoup
headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"}
data = requests.get("https://movie.daum.net/ranking/boxoffice/yearly")
soup = BeautifulSoup(data.text, 'html.parser')
# 개봉일, 관객 수, 포스터 이미지 파일의 URL, 영화 세부 정보의 URL
movies = soup.select('#mainContent > div > div.box_boxoffice > ol > li')
for movie in movies:
movie_name = movie.select_one('.tit_item > a').text
open_day = movie.select_one('.info_txt > .txt_num').text
audience_num = movie.select_one('.txt_info > .info_txt:nth-child(2)')
audience_num.find('span').decompose()
audience_num = audience_num.text
poster_img_url = movie.select_one('.poster_movie > img')["src"]
poster_info_url = movie.select_one('.poster_info > a')["href"]
print("영화 제목: ", movie_name, ", 개봉일: ", open_day, ", 관객 수:", audience_num, ", 포스터 이미지 파일의 URL: ", poster_img_url, ", 영화 세부 정보의 URL: ", poster_info_url)
'Tech > Web Scrapping' 카테고리의 다른 글
beautifulsoup 사용법 (0) | 2023.08.17 |
---|---|
다음 영화 web scrapping 하여 mongDB에 저장 (0) | 2023.08.09 |
Selenium 활용법 (0) | 2023.07.31 |