| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
Tags
- On-memory file system
- cs231n
- C++
- file system
- CPP
- Machine Learning
- SQLD
- Seoul National University
- Operating System
- Process
- paper review
- computer vision
- Gentoo2
- Robocup@Home 2026
- System Call
- DFS
- do it! 알고리즘 코딩테스트: c++편
- Optimization
- Linux
- Data Science
- Baekjoon
- ROS2
- deep learning
- 밑바닥부터 시작하는 딥러닝2
- Multimedia
- RNN
- Humble
- Python
- BFS
- CNN
Archives
- Today
- Total
newhaneul
[Advanced Python Programming] Lecture 16. Web Scrapping 본문
4. University Study/Advanced Python Programming
[Advanced Python Programming] Lecture 16. Web Scrapping
뉴하늘 2026. 5. 27. 01:50728x90
포스팅은 인하대학교 허혜선 교수님의 [202601-EEC3408-001] 고급파이썬프로그래밍을 수강하고 공부한 내용을 정리하기 위한 포스팅입니다.
1. 웹 스크래핑과 HTML 파싱의 이해
- 웹 스크래핑: 웹사이트의 HTML 규칙을 파악하여 원하는 데이터를 자동으로 추출하는 기술이다.
- HTML 파싱: 웹 페이지의 원본 HTML 텍스트를 분석하여 구조를 파악하고, 필요한 정보(URL, 텍스트 등)만 골라내는 과정을 뜻한다.
- GET 방식 데이터 요청: URL 주소 뒤에 ?변수명=값 형태(예: code=005930)를 붙여서 서버에 특정 데이터를 요청하는 방식이다. 상장코드에 따라 동적으로 다른 주식 정보 페이지를 생성할 때 주로 사용된다.
2. 정규 표현식 (Regular Expression) 핵심 문법
정규 표현식은 특정한 규칙을 가진 문자열의 집합을 표현하고 추출하기 위한 일종의 공식이다. 텍스트 메타문자를 조합하여 복잡한 패턴을 간단하게 찾아낼 수 있다.
A. 기본 메타문자
- [] (대괄호): 대괄호 안의 문자들 중 하나와 매칭된다 (OR 의미). 예컨대 [Yy]esterday는 'Yesterday'와 'yesterday'를 모두 찾는다.
- - (하이픈): 범위를 지정한다. [0-9]는 숫자 전체, [a-zA-Z]는 알파벳 전체, [가-힣]은 한글 전체를 의미한다.
- . (마침표): 줄 바꿈 기호를 제외한 모든 문자 1개와 매칭된다. 만약 일반적인 마침표 기호 자체를 찾고 싶다면 [.] 또는 \. 형태로 사용해야 한다.
B. 반복 관련 메타문자
- +: 앞의 문자가 1번 이상 반복해서 나타날 때 사용한다. 예컨대 [0-9]+는 연속된 숫자를 한 번에 묶어서 추출한다.
- *: 앞의 문자가 0번부터 무한대까지 반복될 때 사용한다. 문자가 아예 없거나 여러 개 있는 경우를 모두 포함한다.
- {m, n} (중괄호): 반복 횟수를 직접 지정한다. [0-9]{3,4}는 숫자가 3자리에서 4자리 연속으로 나오는 패턴을 뜻한다.
- ?: 앞의 문자가 0번 또는 1번만 나타남을 의미한다.
C. 그룹화 및 특수 문자 처리
- () (소괄호): 특정 패턴을 하나로 묶어주는 그룹화 역할을 한다. 파이썬의 re.findall()과 함께 사용하면 소괄호로 감싸인 영역의 데이터만 추출되어 튜플 형태로 반환된다.
- \ 또는 ₩ (역슬래시): 메타문자 고유의 기능을 없애고 일반 문자(예: [, * 기호 자체)로 인식하게 만들 때 앞에 붙여준다.
3. 웹 스크래핑 실습 예제 분석
LAB 1: 이벤트 당첨자 아이디 추출 (re.findall)
특정 웹 페이지에 게시된 당첨자 명단에서 codo***, outb7***과 같이 뒤에 별표가 붙은 아이디 패턴만 추출하는 실습이다.
- 사용 패턴: r"([A-Za-z0-9]+\*\*\*)"
- 해석: 알파벳이나 숫자가 최소 1글자 이상 나오고 뒤이어 문자 그대로의 별표(*) 3개가 붙어있는 영역을 찾되, 소괄호 안의 아이디 영역만 리스트로 반환받아 출력한다.
import re
import urllib.request
url = "https://goo.gl/U7mSQl"
html = urllib.request.urlopen(url)
html_contents = str(html.read())
id_results = re.findall(r"([A-Za-z0-9]+\*\*\*)", html_contents)
for result in id_results:
print(result)
codo***
outb7***
dubba4***
multicuspi***
crownm***
triformo***
spania***
magazin***
presby***
trophody***
nontr***
enranck***
canc***
uncanker***
wrymo***
non***
luminat***
oblig***
anna***
LAB 2: 특허 문서 zip 파일 주소 추출 및 자동 다운로드
구글 특허 정보 페이지에서 다운로드 가능한 모든 .zip 파일의 URL 주소를 추출하여 저장하는 구조이다.
- 사용 패턴: r"(http)(.+)(zip)"
- 주의점: 소괄호 그룹이 3개로 나누어져 있으므로 re.findall 실행 시 ('http', '보충주소', 'zip') 형태의 튜플 데이터가 생성된다. 따라서 실제 완성된 URL 문자열로 활용하기 위해 "".join(url) 연산으로 결합해주어야 한다.
- 다운로드 기법: urllib.request.urlretrieve(full_url, file_name) 함수를 실행하여 실제 웹상의 파일을 로컬 컴퓨터로 다운로드한다.
import urllib.request
import re
url = "https://www.google.com/googlebooks/uspto-patents-grants-text.html"
html = urllib.request.urlopen(url)
html_contents = str(html.read().decode('utf-8'))
url_list = re.findall(r"(http)(.+)(zip)", html_contents)
for url in url_list:
print(url)
full_url = "".join(url)
print(full_url)
('http', '://storage.googleapis.com/patents/grant_full_text/2015/ipg150106.', 'zip')
http://storage.googleapis.com/patents/grant_full_text/2015/ipg150106.zip
('http', '://storage.googleapis.com/patents/grant_full_text/2015/ipg150113.', 'zip')
http://storage.googleapis.com/patents/grant_full_text/2015/ipg150113.zip
('http', '://storage.googleapis.com/patents/grant_full_text/2015/ipg150120.', 'zip')
http://storage.googleapis.com/patents/grant_full_text/2015/ipg150120.zip
('http', '://storage.googleapis.com/patents/grant_full_text/2015/ipg150127.', 'zip')
http://storage.googleapis.com/patents/grant_full_text/2015/ipg150127.zip
LAB 3: 네이버 주식 시세 정보 HTML 파싱
네이버 금융의 삼성전자 주가 페이지 소스에서 화면에는 보이지 않지만 HTML 내부에 숨겨진 <dl class="blind"> 영역 안의 주식 데이터를 정규식으로 파싱하는 실습이다.
import urllib.request
import re
url = "http://finance.naver.com/item/main.nhn?code=005930"
html = urllib.request.urlopen(url)
html_contents = str(html.read().decode('utf-8'))
stock_results = re.findall("(\<dl class=\"blind\"\>)([\s\S]+?)(\<\/dl\>)", html_contents)
samsung_stock = stock_results[0]
samsung_index = samsung_stock[1]
index_list = re.findall("(\<dd\>)([\s\S]+?)(\<\/dd\>)", samsung_index)
for index in index_list:
print(index[1])
2026년 05월
26일 16시
10분 기준 장마감
종목명 삼성전자
종목코드 005930 코스피
현재가 299,000 전일대비 상승 6,500
플러스
2.22 퍼센트
전일가 292,500
시가 298,000
고가 302,000
상한가 380,000
저가 297,500
하한가 205,000
거래량 21,773,154
거래대금 6,533,787백만728x90
'4. University Study > Advanced Python Programming' 카테고리의 다른 글
| [Advanced Python Programming] Lecture 15. Web Crawling (0) | 2026.05.27 |
|---|---|
| [Advanced Python Programming] Lecture 13. Data Visualization (0) | 2026.05.25 |
| [Advanced Python Programming] Lecture 12. Pandas (0) | 2026.05.24 |
| [Advanced Python Programming] 중간고사 암기 (0) | 2026.04.17 |
| [Advanced Python Programming] Lecture 11. Numpy (0) | 2026.04.17 |