[LG U+ 5기]/Project

[2월][3주차] 💹삼성전자 종가 분석 프로젝트 (크롤링/BeautifulSoup)

jjanggun0930 2025. 2. 18. 18:00

2025.02.17 월요일

 

크롤링이 데이터를 찾는 작업이라면, 스크래핑은 데이터를 추출하는 작업.

크롤링은 스크래핑의 첫 번째 단계가 될 수 있다.

ex) 웹사이트 전체를 크롤링해 필요한 페이지를 발견한 후, 해당 페이지에서 데이터를 스크래핑

 

크롤링과 스크래핑은 '원하는 데이터를 모을수 있다'는 점이 비슷.

BUT, 웹 크롤링은 웹 페이지 링크를 타고 계속해서 탐색을 이어나가지만, 

웹 스크래핑은 데이터 추출을 원하는 대상이 명확하여 특정 웹사이트만을 추적한다는 차이점 !

 

웹 크롤링

: 페이지를 모아 분류하고 검색 결과에 내가 찾는 키워드와 연관된 링크들만 모아 볼 수 있도록 작동.

 

웹 스크래핑 

: 상품의 가격, 주식정보, 뉴스 등 원하는 데이터가 명확하며, 흩어져 있는 해당 데이터를 자동으로 추출하여 전달.

 

robots.txt

웹 사이트 소유자가 크롤러에게 제공하는 지침서로, 크롤러가 접근할 수 있는 영역과 접근할 수 없는 영역을 명확하게 정의해놓은 파일 !!

 

robots.txt 파일의 역할

크롤링 제한 / 서버 부하 감소 / 사이트 맵 제공

 

User-agent : 크롤러를 식별하는 부분. 특정 크롤러 또는 모든 크롤러에 대한 지침을 제공

Disallow : 크롤링을 금지할 디렉토리, 페이지를 지정

Allow : (Disallow와 함께 사용될 때) 크롤링을 허용할 디렉토리, 페이지를 지정

Sitemap : 사이트 맵 파일의 위치를 제공 

User-agent: Mediapartners-Google          => google 크롤러에게 적용
Disallow: /screener/insider/                      => 접근 금지
Allow: /caas/                                             => 접근 가능

 

request : 서버에 데이터 요청

response : 서버가 요청 데이터를 보내줌

 

파이썬 + 뷰티풀수프 : 데이터 속에서 원하는 데이터 찾기

 

HTML 구성

<html>
 <head></head>
 <body> 사용자 화면 내용
  <p></p>
  <h1></h1>
  <img src = "">
  <input type = ""/>
  <div id = ""  class = "" ></div><span></span>
       class ="" : 주로 CSS를 지정
       class = "f_gb b_gb bg_color" 
        id = ""     : 주로 Javascript 에서 태그를 다룰 때..
 </body>
</html>

 

  • 웹 크롤링 : 페이지 변화 
  • 웹 스크래핑 : 데이터 마이닝 작업 => URL => 웹 페이지 구조 => 뷰티풀숩
    • URL 요청 라이브러리 => request

+ 실습 프로젝트 

 

1. 크롤링할 url 을 BeautifulSoup으로 html 만들기 

stock_url = 'https://finance.yahoo.com/quote/005930.KS/history/'

# 웹 페이지 요청 : requests.get()
res = requests.get(stock_url)
#=> <Response [429]>

# 응답에서 HTML 문서만 가져오기 : requests.text
html = res.text
#=> 'Edge: Too Many Requests'

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36',
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7'
    }
# User-Agent 는 모질라 / 애플웹킷 / 크롬 / 사파리를 통해 가능
# accept 는 허용하는 것

# stock_url를 그냥 요청하는 것이 아니라, 헤더를 담아 요청
res = requests.get(stock_url, headers = headers)
html = res.text

soup = BeautifulSoup(html, 'html.parser')

 

2. 해당 페이지에서 내가 찾고자 하는 요소 파악 

* 날짜 / 종가 찾기

soup.find_all('td', class_ = first_class)
'''
 <td class="yf-1jecxey">59,100.00</td>,
 <td class="yf-1jecxey">58,699.75</td>,
 <td class="yf-1jecxey">19,838,511</td>,
 <td class="yf-1jecxey">Oct 29, 2024</td>,
 <td class="yf-1jecxey">58,000.00</td>,
 <td class="yf-1jecxey">59,600.00</td>...
 '''

 

+ find => 한 개 찾기

+ find_all => 요청에 맞는 모든 요소 찾기 

 

3. 내가 원하는 형식에 맞게 바꾸기

# 2024년 11월 17일 : Feb 17, 2024 - Feb 17, 2025
# 52,000원 : 52,000.00

# YYYY년 MM월 DD일인 형식으로 날짜(Date) 처리 : 
# strftime('%Y년 %m월 %d일')
datef = pd.to_datetime(soup.find_all('td', class_ = first_class)[0].text).strftime('%Y년 %m월 %d일')
#=> '2025년 02월 17일'

# .00을 '원'으로 대체하여 종가(Close) 처리 :
# replace('.00','원')
closeP = soup.find_all('td', class_ = first_class)[4].text.replace('.00','원')
#=> '55,900원'

 

 + 전체 for 문으로 돌려서 적용

 

4. 시계열 시각화 진행