본문 바로가기
데이터엔지니어링/데이터수집

웹크롤링과 웹스크래핑 차이점 및 특정데이터 추출하기

by goemgoem-i 2024. 11. 1.
반응형

 

웹크롤링과 웹스크래핑 

 

 

요소 웹크롤링 웹스크래핑
목적 웹 페이지 탐색 및 인덱싱 특정 데이터 추출
대상 모든 웹 페이지 특정 웹페이지
출력 페이지 url 및 메타데이터 구조화된 데이터
프로세스 전체웹사이트의 링크 탐색 특정 페이지의 정보 추출

 

 

 

 

 

 

웹스크래핑 주의
  1. 요청하고자 하는 서버에 과도한 부하를 주지 않음
  2. 가져온 정보를 사용할 때 저작권과 데이터베이스권에 위배되지 않는지 주의

 

 

 

웹스크래핑 실행 

 

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)
반응형