반응형
웹크롤링과 웹스크래핑
요소 | 웹크롤링 | 웹스크래핑 |
목적 | 웹 페이지 탐색 및 인덱싱 | 특정 데이터 추출 |
대상 | 모든 웹 페이지 | 특정 웹페이지 |
출력 | 페이지 url 및 메타데이터 | 구조화된 데이터 |
프로세스 | 전체웹사이트의 링크 탐색 | 특정 페이지의 정보 추출 |
웹스크래핑 주의
- 요청하고자 하는 서버에 과도한 부하를 주지 않음
- 가져온 정보를 사용할 때 저작권과 데이터베이스권에 위배되지 않는지 주의
웹스크래핑 실행
1. 필요한 라이브러리
pip install requests beautifulsoup4
1) requests: 네이버 메인 페이지에 HTTP GET 요청을 보맴
-> 문제점 발생 : 아주 해당 내용은 아주 긴 텍스트로 와서 분석 어려움
-> 원하는 요소만 추출 하는 HTML parser : BeautifulSoup4
2) BeautifulSoup: 응답받은 HTML 내용을 파싱
2. requests와 BeautifulSoup 활용
import requests
# 네이버 메인 페이지 요청
url = 'https://www.naver.com/'
response = requests.get(url)
from bs4 import BeautifulSoup
# BeautifulSoup객체 생성
#soup = BeautifulSoup (response의 body를 텍스트로 전달 , "html"로 분석한다는 것을 명시)
# 페이지 내용 파싱
soup = BeautifulSoup(response.text, 'html.parser')
# 객체 soup의 .prettify()를 활용해 분석된 HTML을 보기 편하게 반환
print(soup.prettify())
3. 특정 개체 가져오기
# title 가져오기
Soup.title
# head 가져오기
Soup.head
# body 가져오기
Soup.body
4. 특정 태그 가져오기
# 태그 이름 가져오기
h1.name
# 태그 내용 가져오기
h1.text
1) 특정 태그에 해당하는 요소 하나 찾기
# 첫 번째 <h2> 태그
soup.find('h2') #첫번째로 등장하는<h2>로 감싸진 태그 찾음
first_h2 = soup.find('h2')
print(first_h2.get_text(strip=True))
2) 특정 태그에 해당하는 요소 모두 찾기
# 모든 <p> 태그
soup.find_all('p') #<p>태그로 감싸진 모든 요소 찾기
for p in soup.find_all('p'):
print(p.get_text(strip=True))
- p: BeautifulSoup 객체로 생성된 <p> 태그를 나타냅니다. 즉, 이미 파싱된 HTML 문서에서 특정한 <p> 태그의 객체
- .get_text(): 이 메서드는 해당 <p> 태그 내에 포함된 모든 텍스트 내용을 추출하여 문자열로 반환
<p>안녕하세요, <strong>반갑습니다!</strong></p>
"안녕하세요, 반갑습니다!"
-> <strong> 태그는 무시되고, <p> 태그 내부의 텍스트만 반환
3) 특정 태그에 안에 있는 또하나의 태그 추출하기
# <p> 태그 안에 있는 <strong> 태그 가져오기
strong_tag = p.find('strong') # p 태그 내의 첫 번째 <strong> 태그
if strong_tag:
print(strong_tag.get_text(strip=True)) # <strong> 태그의 텍스트 출력
- p.find('strong'): p 태그 내부에서 첫 번째 <strong> 태그를 찾음
- .get_text(strip=True): <strong> 태그의 텍스트를 추출 / strip=True를 사용하면 양쪽 공백이 제거된 텍스트 반환
- strip=True를 사용하면 양쪽 공백이 제거된 텍스트가 반환
4) 사이트의 속성을 활용해 필요한 클래스의 요소 가져오기
#class가 "item-list"인 모든 <li> 태그를 찾아서, 그 결과를 items라는 리스트 변수에 저장
items = soup.find_all("li", "item-list")
# print(items) # 리스트의 내용을 확인
#item 변수에서 class가 "content"인 <div>를 찾고, 그 안에서 class가 "header"인 <div>를 찾은 다음, 그 <div>의 <h4> 태그 안에 있는 텍스트를 가져와서 출력하는 과정
for item in items:
print(item.find("div", "content").find("div", "header").h4.text)
3. HTML의 locator로 원하는 요소 찾기
- tagname: 태그의 이름
- id: 하나의 고유 태그를 가리키는 라벨
- class: 여러 태그를 묶는 라벨
# 1. 태그 이름으로 <h1> 태그 가져오기
soup.find('h1').get_text() # "Welcome"
# 2. ID로 <div> 태그 가져오기
soup.find(id='main-content').get_text() # "WelcomeHello!"
# 3. ID가 results인 div 태그 가져오기
soup.find("div", id="result")
# 4. ID가 results인 div 태그 가져오기
soup.find("div", id="result")
# 5. 클래스명으로 <p> 태그 가져오기
soup.find_all(class_='description')[0].get_text() # "Hello!"
- .strip(): 양쪽 공백 제거
sult.h3.text.strip() # '안녕하세요'에서 양쪽 공백 제거
4.Pagination페이지네이션
import time
# 페이지 지연 시간 (2초)
time.sleep(2)
반응형
'데이터엔지니어링 > 데이터수집' 카테고리의 다른 글
youtube api 분석 및 프로젝트생성과 사용자 인증정보 생성 (0) | 2024.12.19 |
---|---|
페이지네이션의 오류로 인해서 알아보는 network 사용법 (2) | 2024.11.04 |
동적웹사이트와 정적웹사이트 차이점 및 time.sleep()의 활용 (2) | 2024.10.13 |
브라우저 자동화하는 셀리니움selenium 설치 및 with-as를 활용한 예문보기 (1) | 2024.10.13 |
html 정의 및 기본 문법 정리 (2) | 2024.10.13 |