λ°μν
λ°μ΄ν° μμ§
ν¬λ‘€λ§ (Crawling)
ν¬λ‘€λ§(crawling)μ μλνλ μ€ν¬λ¦½νΈλ₯Ό μ¬μ©νμ¬ μΉ νμ΄μ§λ₯Ό νμνκ³ λ°μ΄ν°λ₯Ό μμ§νλ λ°©λ²μ λλ€.
- μ΄λ μΉ μ¬μ΄νΈ μ 체 λλ λ€μμ νμ΄μ§λ₯Ό νμνλ©΄μ λ°μ΄ν°λ₯Ό μΆμΆνλ κ³Όμ μΌλ‘, κ²μ μμ§μ ν¬λ‘€λ¬μ μ μ¬ν©λλ€.
- μλνλ μ€ν¬λ¦½νΈ: ν¬λ‘€λ¬λ νΉμ κ·μΉμ λ°λΌ μΉ νμ΄μ§λ₯Ό λ°©λ¬Ένκ³ , ν΄λΉ νμ΄μ§μ μ½ν μΈ λ₯Ό μμ§νλ μλνλ μ€ν¬λ¦½νΈμ λλ€.
- μ 체 μ¬μ΄νΈ λλ λ€μμ νμ΄μ§ νμ: ν¬λ‘€λ§μ μΌλ°μ μΌλ‘ μ 체 μΉ μ¬μ΄νΈλ₯Ό νμνκ±°λ, λ€μμ νμ΄μ§λ₯Ό μμ°¨μ μΌλ‘ λ°©λ¬Ένμ¬ λ°μ΄ν°λ₯Ό μμ§ν©λλ€.
- κ²μ μμ§μ ν¬λ‘€λ¬μ μ μ¬: κ²μ μμ§ ν¬λ‘€λ¬λ μΉ νμ΄μ§λ₯Ό μΈλ±μ±νμ¬ κ²μ κ²°κ³Όλ₯Ό μ 곡νλλ°, μ΄μ μ μ¬ν λ°©μμΌλ‘ λ°μ΄ν°λ₯Ό μμ§ν©λλ€.
μ€ν¬λν (Scrapping)
μ€ν¬λν(scraping)μ νΉμ μΉ νμ΄μ§μμ νμν λ°μ΄ν°λ₯Ό μΆμΆνλ λ°©λ²μ λλ€. μ΄λ μΉ ν¬λ‘€λ§μ νμ μ§ν©μΌλ‘, νΉμ λ°μ΄ν°λ§ μμ§νλ λ° μ§μ€ν©λλ€.
- νΉμ μΉ νμ΄μ§μμ νμν λ°μ΄ν° μΆμΆ: μ€ν¬λνμ μΉ νμ΄μ§μ νΉμ μμλ μ 보λ₯Ό μΆμΆνλ κ³Όμ μ λλ€. μλ₯Ό λ€μ΄, μ ν κ°κ²©, 리뷰, μ°λ½μ² μ 보 λ±μ μΆμΆν μ μμ΅λλ€.
- μΉ ν¬λ‘€λ§μ νμ μ§ν©: μ€ν¬λνμ ν¬λ‘€λ§μ μΌλΆλ‘μ, ν¬λ‘€λ¬κ° νμν μΉ νμ΄μ§μμ νΉμ λ°μ΄ν°λ₯Ό μΆμΆνλ μμ μ μλ―Έν©λλ€.
λ°μ΄ν° μμ§ μμ (Scrapping)
- Example Code
import requests
from bs4 import BeautifulSoup
# AI Hub νμ΄μ§ URL
url = 'https://www.aihub.or.kr/'
# μΉ νμ΄μ§ μμ²
response = requests.get(url) response.raise_for_status() # μμ²μ΄ μ±κ³΅νλμ§ νμΈ
# BeautifulSoup κ°μ²΄ μμ±
soup = BeautifulSoup(response.content, 'html.parser')
# μΈκΈ° λ°μ΄ν° TOP3 μΉμ
μ°ΎκΈ°
top3_section = soup.find('div', class_='secR')
# κ° λ°μ΄ν° νλͺ© μΆμΆ
data_list = top3_section.find_all('div', class_='list')
# λ°μ΄ν° μ λͺ© μΆμΆ titles = []
for data in data_list:
title = data.find('h3').get_text(strip=True)
clean_title = title.split(']')[-1].strip()
titles.append(clean_title)
# μΆμΆν λ°μ΄ν° μΆλ ₯
for idx, title in enumerate(titles, start=1):
print(f"TOP {idx}: {title}")
- Output
OUTPUT
TOP 1: κ°μ± λν λ§λμΉ
TOP 2: μμ μ΄λ―Έμ§ λ° μμμ 보 ν
μ€νΈ
TOP 3: νκ΅μ΄ μμ±
Crawling(ν¬λ‘€λ§) & Scrapping(μ€ν¬λν)μ μν λꡬ
requests
- κ°λ : HTTP μμ²μ 보λ΄κ³ μλ΅μ λ°κΈ° μν νμ΄μ¬ λΌμ΄λΈλ¬λ¦¬ μ λλ€.
- μ©λ: μΉ νμ΄μ§μ HTMLμ κ°μ Έμ€κ±°λ, API μμ²μ 보λ΄λ λ° μ¬μ©ν©λλ€.
BeautifulSoup
- κ°λ : HTML λ° XML λ¬Έμλ₯Ό νμ±νμ¬ μνλ λ°μ΄ν°λ₯Ό μΆμΆνκΈ° μν νμ΄μ¬ λΌμ΄λΈλ¬λ¦¬ μ λλ€.
- μ©λ: μΉ νμ΄μ§μμ νΉμ μμλ ν μ€νΈ λ°μ΄ν°λ₯Ό μΆμΆνλ λ° μ¬μ©ν©λλ€.
Scrapy
- κ°λ : ν¬λ‘€λ§ λ° μ€ν¬λνμ μν νμ΄μ¬ νλ μμν¬ μ λλ€.
- μ©λ: λκ·λͺ¨ μΉ ν¬λ‘€λ§ μμ μ ꡬ쑰νλ λ°©μμΌλ‘ μννλ λ° μ¬μ©. μ μ μΉ νμ΄μ§ ν¬λ‘€λ§μ κ°μ μ΄ μμ΅λλ€.
Selenium
- κ°λ : μΉ λΈλΌμ°μ μλνλ₯Ό μν νμ΄μ¬ λΌμ΄λΈλ¬λ¦¬ μ λλ€.
- μ©λ: μ€μ λΈλΌμ°μ λ₯Ό μ μ΄νμ¬ λμ μΈ μΉ νμ΄μ§μμ λ°μ΄ν°λ₯Ό μμ§νκ±°λ, λΈλΌμ°μ μνΈμμ©μ μλννλ λ° μ¬μ©ν©λλ€.
Example Code
Scrapping λΌμ΄λΈλ¬λ¦¬ μ¬μ© μμ
import requests
from bs4 import BeautifulSoup
# AI Hub νμ΄μ§ URL
url = 'https://www.aihub.or.kr/'
# μΉ νμ΄μ§ μμ²
response = requests.get(url)
response.raise_for_status() # μμ²μ΄ μ±κ³΅νλμ§ νμΈ
# BeautifulSoup κ°μ²΄ μμ±
soup = BeautifulSoup(response.content, 'html.parser')
# μΈκΈ° λ°μ΄ν° TOP3 μΉμ
μ°ΎκΈ°
top3_section = soup.find('div', class_='secR')
# κ° λ°μ΄ν° νλͺ© μΆμΆ
data_list = top3_section.find_all('div', class_='list')
# λ°μ΄ν° μ λͺ© μΆμΆ
titles = []
for data in data_list:
title = data.find('h3').get_text(strip=True)
clean_title = title.split(']')[-1].strip()
titles.append(clean_title)
# μΆμΆν λ°μ΄ν° μΆλ ₯
for idx, title in enumerate(titles, start=1):
print(f"TOP {idx}: {title}")
TOP 1: κ°μ²΄ κ° κ΄κ³μ± μΈμ§μ© νκ΅ν λΉμ λ°μ΄ν°
TOP 2: μβν νμ‘°μ μν νμ§-μ‘°μ λμ λ°μ΄ν°
TOP 3: μμ© μμ¨μ£Όνμ°¨ μΌκ° μλμ°¨ μ μ©λλ‘ λ°μ΄ν°
Requests λΌμ΄λΈλ¬λ¦¬ λ° BeautifulSoup μ¬μ© μμ
import requests
from bs4 import BeautifulSoup
# 1. μΉ νμ΄μ§ μμ²
url = 'https://ko.wikipedia.org/wiki/μν€λ°±κ³Ό:λλ¬Έ'
response = requests.get(url)
# 2. μμ²μ΄ μ±κ³΅νλμ§ νμΈ
if response.status_code == 200:
# 3. BeautifulSoup κ°μ²΄ μμ±
soup = BeautifulSoup(response.content, 'html.parser')
# 4. νμ΄μ§ μ λͺ© μΆμΆ
title = soup.find('h1', id='firstHeading').text
print(f"Title: {title}")
# 5. 첫 λ²μ§Έ λ¨λ½ μΆμΆ
first_paragraph = soup.find('p').text
print(f"First paragraph: {first_paragraph}")
else:
print(f"Failed to retrieve the web page. Status code: {response.status_code}")
Title: μν€λ°±κ³Ό:λλ¬Έ
First paragraph: μν€λ°±κ³Ό
Selenium λΌμ΄λΈλ¬λ¦¬ μ¬μ© μμ
!pip install selenium
from selenium import webdriver
from selenium.webdriver.common.by import By
# URL μ€μ
URL = "https://ko.wikipedia.org/wiki/μν€λ°±κ³Ό:λλ¬Έ"
# Chrome μ΅μ
μ€μ
options = webdriver.ChromeOptions()
options.add_argument("--headless") # λΈλΌμ°μ μ°½μ λμ°μ§ μμ
options.add_argument('--disable-dev-shm-usage')
options.add_argument("--no-sandbox")
# μΉ λλΌμ΄λ² μ€μ
driver = webdriver.Chrome(options=options)
try:
# μν€λ°±κ³Ό λλ¬Έ νμ΄μ§ μ΄κΈ°
driver.get(URL)
# "μ°λ¦¬ λͺ¨λκ° λ§λ€μ΄κ°λ μμ λ°±κ³Όμ¬μ "κ³Ό "λ¬Έμ μ΄ν λ΄μ©" μΆμΆ
main_content = driver.find_element(By.CSS_SELECTOR, "#mw-content-text > div.mw-content-ltr.mw-parser-output > div.main-box.main-top > div > p:nth-child(2)").text
print("Main Content:", main_content)
finally:
# μΉ λλΌμ΄λ² μ’
λ£
driver.quit()
Main Content: μ°λ¦¬ λͺ¨λκ° λ§λ€μ΄κ°λ μμ λ°±κ³Όμ¬μ
λ¬Έμ 674,592κ°μ μ΅κ·Ό κΈ°μ¬μ 1,814λͺ
Scrapy λΌμ΄λΈλ¬λ¦¬ μ¬μ© μμ
# @title
!pip install scrapy
# @title
!scrapy startproject wikipedia_scraper
# @title
# wikipedia_scraper/spiders/wikipedia_spider.py
import scrapy
class WikipediaSpider(scrapy.Spider):
name = "wikipedia"
start_urls = [
'https://ko.wikipedia.org/wiki/μν€λ°±κ³Ό:λλ¬Έ',
]
def parse(self, response):
main_content = response.css('#mw-content-text > div.mw-content-ltr.mw-parser-output > div.main-pane > div.main-pane-right > div.wikipedia-ko.main-recommended.main-box').get()
yield {
'main_content': main_content,
}
# @title
%%writefile -a wikipedia_scraper/wikipedia_scraper/settings.py
ROBOTSTXT_OBEY = False
import sys
import os
# νμ¬ μμ
λλ ν 리λ₯Ό κ°μ Έμ΅λλ€.
current_dir = os.getcwd()
# νλ‘μ νΈ λλ ν 리 μ€μ (wikipedia_scraper ν΄λμ μμ ν΄λ)
project_dir = os.path.join(current_dir, 'wikipedia_scraper')
# νλ‘μ νΈ λλ ν 리λ₯Ό PYTHONPATHμ μΆκ°ν©λλ€.
sys.path.append(project_dir)
!pwd
from scrapy.crawler import CrawlerProcess
from wikipedia_scraper.spiders.wikipedia_spider import WikipediaSpider
process = CrawlerProcess({
'USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
'FEEDS': {
'output.json': {
'format': 'jsonlines',
'encoding': 'utf8',
'store_empty': False,
'fields': None,
'indent': 4,
},
},
})
process.crawl(WikipediaSpider)
process.start()
# @title
!python run_scrapy.py
# @title
# μΆλ ₯λ¬Όμ μμκ² μΆλ ₯
import json
from pprint import pprint
data = []
with open('output.json', 'r') as f:
for line in f:
line = line.strip() # 곡백 μ κ±°
if line: # λΉ μ€ κ±΄λλ°κΈ°
try:
data.append(json.loads(line))
except json.JSONDecodeError as e:
print(f"Error decoding JSON: {e}")
pprint(data)
λ°μν
'π Data Analysis' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Data Analysis] κΈ°μ΄ ν΅κ³, μκ΄ & μΈκ³Όκ΄κ³ (0) | 2024.07.18 |
---|---|
[Data Analysis] λ°μ΄ν°μ μ’ λ₯μ μμ± & λ°μ΄ν° νμ (EDA) (0) | 2024.07.18 |
[Data Analysis] Data Analysis - λ°μ΄ν° λΆμ (0) | 2024.07.17 |
[Data Analysis] λ°μ΄ν° μ μ²λ¦¬ (Data Pre-Processing) (0) | 2024.07.12 |
[Data Analysis] λ°μ΄ν°μ νμ© λ° κ΅¬ν (0) | 2024.07.12 |