본문 바로가기

파이썬

Python Web Scraping: Step-by-Step Tutorial 웹사이트 스크래핑

간단한 웹스크래핑 예제로 웹 스크래핑 하는 법 알려드릴게요.

웹스크래핑이 뭘까?

 

웹 스크래핑은 웹 페이지에서 원하는 데이터를 추출하는 기술입니다. 다양한 목적으로 활용할 수 있습니다.
데이터 수집: 인터넷상의 다양한 데이터를 수집하여 분석 및 가공할 수 있습니다.

예를 들어, 온라인상의 상품 정보, 뉴스 기사, SNS 게시글, 주식 시세 등을 수집하여 분석할 수 있습니다.
정보 분석: 웹 스크래핑 기술을 사용하여 인터넷상의 다양한 정보를 수집하고 분석하여 유용한 정보를 추출할 수 있습니다. 예를 들어, 기업의 경쟁사 정보를 수집하여 경쟁사의 제품 정보, 마케팅 전략 등을 분석할 수 있습니다.
비즈니스에 활용: 웹 스크래핑은 비즈니스에도 활용될 수 있습니다. 예를 들어, 기업의 마케팅 전략을 분석하거나, 상품 판매를 위한 데이터를 수집하거나, 실시간으로 주가를 모니터링하는 등 다양한 분야에서 활용할 수 있습니다.
콘텐츠 생성: 웹 스크래핑은 콘텐츠 생성에도 활용될 수 있습니다. 인터넷상에서 다양한 글들을 수집하여 빠르게 콘텐츠를 생성할 수 있습니다.
검색 엔진 개선: 웹 스크래핑 기술을 활용하여 검색 엔진의 정확성과 효율성을 향상시킬 수 있습니다. 검색 엔진이 인터넷상의 정보를 더욱 정확하고 빠르게 제공할 수 있도록 돕습니다.

 

웹스크래핑 주의점

웹 스크래핑은 서버의 부하를 초래할 수 있으므로, 사이트 소유자의 허락을 받는 것이 좋습니다.

그러나 어떤 사이트들은 스크래핑을 허용하는 경우가 있습니다.

예를 들어, Wikipedia나 Github 같은 경우에는 로봇 배제 규약을 통해 스크래핑을 허용하고 있습니다.

따라서 이러한 사이트들을 활용하여 스크래핑을 연습하는 것이 좋습니다.

그러나 이러한 사이트들도 사용 전에 로봇 배제 규약을 확인하고, 스크래핑에 대한 제한이 있는지 확인하는 것이 좋습니다.

또한 스크래핑을 이용하여 데이터를 가져오는 경우에는 해당 데이터의 사용에 대한 규정을 확인하고, 저작권 등의 법적 문제가 있는지 확인하는 것이 필요합니다.

아래는 스크래핑이 가능한 예시 사이트입니다.
Wikipedia: https://www.wikipedia.org/
Github: https://github.com/
Stack Overflow: https://stackoverflow.com/
Hacker News: https://news.ycombinator.com/
Medium: https://medium.com/

 

https://ko.wikipedia.org/wiki/%EB%8B%AC%EB%A6%AC%EA%B8%B0

 

달리기 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 구보는 여기로 연결됩니다. 다른 뜻에 대해서는 구보 (동음이의) 문서를 참고하십시오. 미국 해병대의 마라톤 대회 독일 프랑크푸르트 2004 마라톤 대회 달리기

ko.wikipedia.org

위키피디아 -> 달리기를 가지고 웹 스크래핑 구현 예제

1) 라이브러리 설치

BeautifulSoup 라이브러리와 requests 라이브러리를 사용합니다.

터미널에서 명령어로 설치

pip install beautifulsoup4

https://pypi.org/project/beautifulsoup4/

 

beautifulsoup4

Screen-scraping library

pypi.org

pip install requests

https://pypi.org/project/requests/

 

requests

Python HTTP for Humans.

pypi.org

2) import

import requests
from bs4 import BeautifulSoup

3) 웹 페이지 가져오기

url = "https://ko.wikipedia.org/wiki/달리기"
response = requests.get(url)
soup = BeautifulSoup(response.content, "html.parser")

4) 문서 제목 가져오기

title = soup.find("title").get_text()
print("문서 제목:", title)

5) 목차 가져오기

toc = soup.find("ul", class_="vector-toc-contents")
print("목차:", toc.get_text())

6) 첫번째 문단 가져오기

first_paragraph = soup.find("div", class_="mw-parser-output").find("p")
print("첫 번째 문단:", first_paragraph.get_text())

7) 첫번째 문단의 링크 가져오기

first_paragraph_links = first_paragraph.find_all("a")
print("첫 번째 문단 링크:")
for link in first_paragraph_links:
    print(link.get("href"))

8) 외부 링크 가져오기

external_links = soup.find("div", class_="mw-parser-output").find_all("a", class_="external")
print("외부 링크:")
for link in external_links:
    print(link.get("href"))

9) output:

 

웹스크래핑 결과

뭔가 나오긴 했으나 가독성이 너무 안 좋다. 결괏값이 좀 예쁘게 나오게 바꿔보자.

방법은 여러개가 있다.

1) Beautiful Soup 등의 파싱 라이브러리를 이용하여 HTML을 예쁘게 출력하는 방법

Beautiful Soup의 prettify() 함수를 이용하면 HTML 코드를 들여 쓰기를 통해 예쁘게 출력할 수 있습니다.

다음과 같은 코드로 변경

import requests
from bs4 import BeautifulSoup

# 웹 페이지 가져오기
url = "https://ko.wikipedia.org/wiki/달리기"
response = requests.get(url)
soup = BeautifulSoup(response.content, "html.parser")

# 문서 제목 가져오기
title = soup.find("title").get_text()
print("문서 제목:", title)

# 목차 가져오기
toc = soup.find("ul", class_="vector-toc-contents")
print("목차:")
print(toc.prettify())

# 첫 번째 문단 가져오기
first_paragraph = soup.find("div", class_="mw-parser-output").find("p")
print("첫 번째 문단:")
print(first_paragraph.prettify())

# 첫 번째 문단의 링크 가져오기
first_paragraph_links = first_paragraph.find_all("a")
print("첫 번째 문단 링크:")
for link in first_paragraph_links:
    print(link.get("href"))

# 외부 링크 가져오기
external_links = soup.find("div", class_="mw-parser-output").find_all("a", class_="external")
print("외부 링크:")
for link in external_links:
    print(link.get("href"))

output:

 

prettify()를 써서 웹스크래핑-HTML형태로 출력

2) 스크래핑한 데이터를 JSON 형식으로 저장하는 방법도 있습니다.

import json

# 데이터를 JSON 형식으로 저장
data = {
    "title": title,
    "toc": toc.get_text(),
    "first_paragraph": first_paragraph.get_text(),
    "first_paragraph_links": [link.get("href") for link in first_paragraph_links],
    "external_links": [link.get("href") for link in external_links]
}

with open("data.json", "w", encoding="utf-8") as f:
    json.dump(data, f, ensure_ascii=False, indent=4)# 데이터를 JSON 형식으로 저장
data = {
    "title": title,
    "toc": toc.get_text(),
    "first_paragraph": first_paragraph.get_text(),
    "first_paragraph_links": [link.get("href") for link in first_paragraph_links],
    "external_links": [link.get("href") for link in external_links]
}

with open("data.json", "w", encoding="utf-8") as f:
    json.dump(data, f, ensure_ascii=False, indent=4)# 데이터를 JSON 형식으로 저장
data = {
    "title": title,
    "toc": toc.get_text(),
    "first_paragraph": first_paragraph.get_text(),
    "first_paragraph_links": [link.get("href") for link in first_paragraph_links],
    "external_links": [link.get("href") for link in external_links]
}

with open("data.json", "w", encoding="utf-8") as f:
    json.dump(data, f, ensure_ascii=False, indent=4)

output:

 

 

json형태로 저장

3) 스크래핑한 데이터를 csv로 저장

import csv 

# CSV 파일로 저장하기
with open('data.csv', 'w', encoding='utf-8-sig', newline='') as f:
    writer = csv.writer(f)
    writer.writerow(['문서 제목', '목차', '첫 번째 문단', '첫 번째 문단 링크', '외부 링크'])
    writer.writerow([title, toc.get_text().strip(), first_paragraph.get_text().strip(),
                     ', '.join(link.get("href") for link in first_paragraph_links),
                     ', '.join(link.get("href") for link in external_links)])

print('data.csv 파일 저장 완료')

output:

 

csv저장

4) Pandas와 같은 데이터 분석 라이브러리를 사용하여 스크래핑한 데이터를 데이터프레임으로 변환하고, 이를 이용하여 다양한 형태의 예쁜 결과를 만들 수 있습니다.

예를 들어, 데이터프레임을 이용하여 그래프를 그리거나, 표를 만들 수 있습니다.

 

pip install pandas

pandas · PyPI

 

pandas

Powerful data structures for data analysis, time series, and statistics

pypi.org

from bs4 import BeautifulSoup
import pandas as pd

URL = "https://ko.wikipedia.org/wiki/달리기"
response = requests.get(URL)
soup = BeautifulSoup(response.content, "html.parser")

text_data = []
for paragraph in soup.find_all("p"):
    text_data.append(paragraph.get_text())

df = pd.DataFrame(text_data, columns=["본문"])
print(df)

output:

 

이 코드는 웹 페이지에서 모든 단락을 추출하여 text_data 리스트에 저장한 후,

이를 pd.DataFrame 함수를 사용하여 데이터프레임으로 변환합니다.

이렇게 추출한 텍스트 데이터를 Pandas로 처리하면, 각 단락의 길이나 단어의 빈도 등을 분석할 수 있습니다.
Pandas를 사용하여 웹 페이지에서 추출한 데이터를 분석할 수 있다.