[아이티윌 빅데이터 52기] LAB 13 | 웹 페이지 데이터 수집하기
*모든 자료 저작권은 아이티윌 이광호 강사님

<작업 순서>
STEP 1. 라이브러리 불러오기
STEP 2. 데이터 요청하기
STEP 3. 데이터 확인하기
STEP 4. 불러온 데이터에 대해 객체 생성하기
STEP 5. 메뉴명, 메뉴 설명, 메뉴 이미지 데이터 가져오기
STEP 6. 데이터 프레임 생성을 위해 데이터 정제하기
STEP 7. 데이터 프레임 생성하기
STEP 8. 이미지 다운을 위한 파일 다운로드 함수 정의하기
STEP 9. 비동기식으로 다운로드 처리하기
========================================
STEP 1. 라이브러리 불러오기
import requests
from bs4 import BeautifulSoup
from pandas import DataFrame
STEP 2. 데이터 요청하기
#웹에 데이터 요청하기
with requests.Session() as session:
#세션 객체에 웹 브라우저 정보 (UserAgent) 주입 (웹서버가 파이썬 프로그램을 정상적인 웹 브라우저로 여기도록)
session.headers.update({"User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"
})
url = "https://data.hossam.kr/py/myfood.html"
r=session.get(url,stream=True) #이미지 파일 다운로드를 위해 stream=True 설정
print(r.url)
if r.status_code !=200:
msg ="[%d Error] %s 에러가 발생함" % (r.status_code,r.reason)
raise Exception(msg)
print(r) # HTTP 통신 상태 확인
STEP 3. 데이터 확인하기
r.encoding ='utf-8'
print(type(r.text))
r.text

STEP 4. 불러온 데이터에 대해 객체 생성하기
soup =BeautifulSoup(r.text)
print(type(soup))
soup

STEP 5. 메뉴명, 메뉴 설명, 메뉴 이미지 데이터 가져오기
food_title =soup.select("h2")
food_title
titles=[]
for title in food_title:
a=title.text.strip()
titles.append(a)
titles
===================
food_desc =soup.select("div.food-content p")
food_desc
descriptions=[]
for description in food_desc:
a=description.text.strip()
descriptions.append(a)
descriptions
====================
food_img =soup.select("div.img-wrapper img")
food_img
images=[]
for image in food_img:
a=image.get("src")
# print(image.get("src"))
images.append(a)
print(images)

STEP 6. 데이터 프레임 생성을 위해 데이터 정제하기
overview=[]
for i in range(0,len(titles)-1):
overall = {"title":titles[i],"descriptions":descriptions[i],"images":images[i]}
print(overall)
overview.append(overall)
print(overview)

STEP 7. 데이터 프레임 생성하기
df = DataFrame(overview)
df.to_excel("html 연구과제.xlsx")
df

STEP 8. 이미지 다운을 위한 파일 다운로드 함수 정의하기
-여기서 download 함수는 url 에 있는 파일을 get 해와서, target 으로 항는 파일 디렉토리에 저장하는 역할을 수행
def download(url,target):
session.headers.update({"User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"
})
try:
#이미지를 웹 서버에 요청
r=session.get(url,stream=True)
r.encoding = 'utf-8'
#서버가 보낸 그림 데이터를 가져와서 저장. 글자가 아닌 이미지 데이터기 떄문에 wb 모드로 저장
with open(target,"wb") as f:
f.write(r.raw.read())
print(target, "가 저장되었습니다")
#예외처리
except Exception:
print(target,"저장 실패", e)
STEP 9. 비동기식으로 다운로드 처리하기
- 현재 시각으로 된 새 폴더를 만든다.
- ThreadPoolExecutor로 스레드 풀을 열어 동시에 여러 다운로드 작업을 실행한다.
- overview에 담긴 각 아이템에서 이미지 URL을 꺼내 파일 경로를 만들고, download(url, path)를 비동기 제출한다.
import os
import datetime as dt
#비동기 처리 기능을 제공하는 모듈
from concurrent import futures
#다운로드 결과가 저장될 폴더 생성하기 (폴더 이름은 현재 시간으로 생성)
dirname = dt.datetime.now().strftime("%Y%m%d-%H%M%S")
os.mkdir(dirname)
#비동기 작업 내에서 이미지 다운로드 받기 - 비동기 병렬 작업을 시작 (여러개의 스레드를 만들어 여러 작업을 동시에 실행하는 역할)
with futures.ThreadPoolExecutor() as executor:
#이미지 정보를 하나씩 꺼내서 해당 이미지에 대한 파일 이름을 만들고, 해당 파일 경로를 기준으로 파일을 저장하는 download 함수를 실행 (함수와 그 함수에 필요한 파라미터를 전송하여 비동기 처리 되도록 함)
for i,v in enumerate(overview):
#저장될 파일 경로 문자열 생성
file_path = os.path.join(dirname, "%d.jpg" %i)
# 비동기 다운로드 요청
executor.submit(download,v['images'],file_path)

'빅데이터 국비 교육' 카테고리의 다른 글
| [아이티윌 빅데이터 52기] LAB 13 | 웹 페이지 데이터 수집하기 (0) | 2025.11.07 |
|---|---|
| [아이티윌 빅데이터 52기] LAB 13 | 파이썬 파이널 과제 | OpenAPI 연동 실습 (개인 작성 버전) (0) | 2025.11.07 |
| [아이티윌 빅데이터 52기] LAB 13 | 파이썬 파이널 과제 | OpenAPI 연동 실습 (선생님 버전) (0) | 2025.11.07 |
| [아이티윌 빅데이터 52기] LAB 12 | 웹 데이터 수집하기 | 네이버 트렌드 데이터 API (0) | 2025.11.05 |
| [아이티윌 빅데이터 52기] LAB 12 | 웹 데이터 수집하기 | 카카오 개발자 API | 책 검색 결과 수집 2 | 반복문으로 전체 데이터/표지 이미지 가져오기 (0) | 2025.11.05 |