준비하는 대학생

[자연어 처리] 웹 스크레이핑 기초 - 1 본문

Programming/NLP

[자연어 처리] 웹 스크레이핑 기초 - 1

Bangii 2023. 9. 14. 10:35

웹 스크레이핑과 웹 크롤링

웹에서 데이터를 수집하는 방법에는 크게 웹 스크레이핑과 웹 크롤링이 있습니다. 이 두 용어는 종종 혼용되어 사용되지만, 명확한 차이점이 있습니다.

웹 스크레이핑은 특정 웹사이트에서 원하는 정보를 직접 추출하는 것을 의미합니다. 예를 들어, 영화 리뷰, 뉴스 기사, SNS 데이터 등을 수집할 때 사용합니다.

반면, 웹 크롤링은 웹 스크레이핑보다 넓은 범위의 데이터를 시스템적으로 수집하는 것을 말합니다. 이는 주로 검색 엔진에서 사용되며, 연결 구조를 파악하고 인덱싱 하는 데 사용됩니다.

다양한 데이터 수집 방법

  1. RSS 피드: 웹 사이트의 업데이트를 XML 형식으로 제공합니다.
  2. OCR: 이미지나 PDF 내의 문자를 인식합니다.
  3. 개인화된 데이터: 사용자 동의 하에 개인화된 텍스트 데이터도 수집할 수 있습니다.
  4. 기업/기관 DB 및 로그 파일: 유용한 텍스트 정보를 포함하고 있을 수 있습니다.
  5. API: Twitter, Reddit 등은 API를 통해 데이터 수집을 허용합니다.
  6. 공개 데이터 셋: NLP, AI, ML 등의 분야에서 이미 공개된 데이터셋을 활용할 수 있습니다.

웹 스크레이핑 시 주의사항: robots.txt

웹 스크레이핑을 시작하기 전에는 반드시 robots.txt 파일을 확인해야 합니다. 이 파일은 웹 사이트가 어떤 크롤러나 스크레이퍼의 접근을 허용하거나 제한하는지를 지정합니다.

robots.txt의 기본 구조는 다음과 같습니다:

User-agent: *
Disallow: /private/
Allow: /public/

여기서 User-agent는 크롤러나 스크레이퍼의 이름을 지정합니다. *는 모든 크롤러를 의미합니다. Disallow와 Allow는 특정 경로의 접근을 제한하거나 허용합니다.

이미지 다운로드 방법

  1. 직접 다운로드: urllib.request.urlretrieve를 사용하여 이미지를 직접 다운로드 할 수 있습니다.
  2. 램에 올려 다운로드: urllib.request.urlopen을 사용하여 이미지를 메모리에 올린 후 저장합니다.
import urllib.request

# 직접 다운로드
urllib.request.urlretrieve('이미지_URL', '저장할_파일명.jpg')

# 램에 올려 다운로드
image = urllib.request.urlopen('이미지_URL').read()
with open('저장할_파일명.jpg', 'wb') as f:
    f.write(image)

웹 페이지 데이터 정제하기

데이터 수집 후에는 BeautifulSoup을 사용하여 원하는 데이터만 추출할 수 있습니다. 데이터는 태그명, id, 클래스 등 다양한 방법으로 정제할 수 있습니다.

  • 태그 명으로 추출
    • t = soup.html.head.title : html의 head의 title을 가져옴
    • t = soup.html.head.title.string : html의 head의 title의 문자열로만 가져옴 (원래는 <> 태그도 같이 가져온다.)
    • urls = soup.find_all('a') : a 태그를 모두 가져옴 (리턴 타입은 리스트 형태)
    • url.attrs['href'] : 태그의 속성 중 href의 값을 가져옴(attrs : attributes)
  • id로 추출
    • (university = soup.find(id="univ") : id가 univ인 태그를 가져옴
import requests
from bs4 import BeautifulSoup

url = "원하는 웹페이지의 URL"
response = requests.get(url)
soup = BeautifulSoup(response.content, 'html.parser')

# 제목 추출
title = soup.title.string
print("제목:", title)

# 본문 내용 추출
content = soup.find('div', class_='content-class-name').text  # 'content-class-name'은 해당 웹 페이지의 본문 내용을 감싸고 있는 div의 클래스 이름입니다.
print("본문:", content)

위의 코드는 웹 페이지의 구조와 클래스 이름에 따라 수정이 필요할 수 있습니다. 따라서, 원하는 웹 페이지의 소스코드를 살펴보며 적절한 태그명과 클래스를 선택해야 합니다.

기상청 RSS로 날씨 데이터 가져오기

기상청의 RSS를 사용하면 각 지역의 날씨 데이터를 수집할 수 있습니다. 이를 통해 지역별 날씨 정보를 얻을 수 있습니다.

import requests
from bs4 import BeautifulSoup

response = requests.get('기상청_RSS_URL')
soup = BeautifulSoup(response.content, 'xml')
for item in soup.find_all('item'):
    print(item.title.text, item.description.text)

Dataset을 이용해 데이터 불러오기

datasets 라이브러리를 사용하면 다양한 데이터셋을 쉽게 불러올 수 있습니다. 예를 들어, squad 데이터셋은 질의응답 데이터셋으로 NLP 연구에서 널리 사용됩니다.

from datasets import load_dataset

ds = load_dataset('squad')
print(ds)

 

 

Comments