본문 바로가기
코딩 연습/코딩배우기

파이썬 크롤링(Crawling) 연습 - BeautifulSoup 객체를 모듈로 만들어서 사용해보기

by good4me 2020. 10. 27.

goodthings4me.tistory.com

 

■ 파이썬(Python) BeautifulSoup의 객체를 반환하는 모듈을 만들어서 사용해보기

- 연습 대상 사이트 : 네이버 금융 페이지에서 주가를 추출해서 저장해보기

▷ 모듈 : beautifulsoup.py

# url, headers, params를 인자로 전달하면 BeautifulSoup 객체를 return하는 function 만들기

import requests
from bs4 import BeautifulSoup

def get_bs_obj(url, headers = None, params = None):
    result = requests.get(url, headers = headers, params = params)
    soup = BeautifulSoup(result.content, 'html.parser')
    return soup
    

 

▷ 네이버 금융의 증시 시가를 추출하기 위한 함수 만들기 (위의 eautifulsoup.py 사용)

from beautifulsoup import get_bs_obj

# company_code를 받아서 price를 리턴하는 함수
def get_price(company_code):
    url = 'https://finance.naver.com/item/main.nhn' #?code=005930'
    params = {
        'code': company_code,
    }
    
    # BeautifulSoup 객체 생성 (모듈 이용)
    soup = get_bs_obj(url, params = params)
    
    # 찾는 종목코드가 없으면 None 리턴
    # AttributeError: 'NoneType' object has no attribute 'find'
    try:
        company_name = soup.find('div', {'class':'h_company'}).find('h2')
        company_name = company_name.text  ## 회사명
    except:
        return None
    
    
    no_today = soup.find('p', {'class':'no_today'})
    #print(no_today)
    blind = no_today.find('span', {'class':'blind'})  ## 주가 금액 부분
    price = blind.text
    
    return company_name, price

good4me.co.kr

 

▷ get_price() 함수에 종목코드를 전달(리스트 참조)하여 "회사명, 코드, 주가" 데이터 추출하고, 저장해보기

codes = ['005930', '051900', '036570', '000672', '051905', '003240', '051910']

# codes 리스트의 종목코드를 찾아서 파일로 저장하기
for code in codes:
    result = get_price(code)  # 함수 호출
    if result == None:
        print('None')
        continue
    name, price = result
    
    write_list = name + '$' + code + '$' + price + '\n'  ## 저장데이터
    
    with open('kosdaq.txt', 'a') as f:
        f.write(str(write_list))
        
    print(write_list)



[실행 결과]

삼성전자$005930$59,800

LG생활건강$051900$1,543,000

엔씨소프트$036570$782,000

None
LG생활건강우$051905$715,000

태광산업$003240$691,000

LG화학$051910$632,000

 

 

[참고] 한입에 크롤링 - Kyeongrok Kim

 

댓글