주가 크롤링하기
다음과 같이 네이버 증권 페이지에서 종목코드 별로 상장회사와 주가를 확인하는 결과를 출력해보자.
가져오고 싶은 정보는 웹페이지에서 다음과 같다.
getSoup 함수
- 크롤링하려는 대상의 url을 작성한다. 그런데 다음과 같이 종목코드별로 웹페이지가 다름을 알 수 있다.
- 따라서 getSoup의 인자로 com_code(종목번호)를 받고, 이를 url 끝에 결합하도록 했다.
- UserAgent 라이브러리로 custom_header 작성 : 크롤링하는 사용자 정보를 서버에 전달
- 이전 예제와 동일하게 req 객체에 웹의 데이터를 가져와 저장
- soup 객체에 html 데이터를 텍스트로 변환
- return 값을 soup으로 한다
getPrice 함수
- com_code(종목번호)를 인자로 받아, 바로 getSoup 함수를 실행시켜 그 결과를 soup 에 담는다
- soup.select_one("p.no_today") : p 태그에서 no_today를 클래스로 가지는 값만 가져와 no_today 에 저장
- no_today에서 span 태그의 blind 클래스 값만 가져와, 텍스트로 변환한 후 price 에 저장
- price 값을 return
main 함수
- 데이터를 가져오고 싶은 종목 코드를 com_code 리스트에 넣어준다.
- 종목명은 com_names 리스트에 넣어준다.
- price (주가) 이름의 빈 리스트를 만든다.
- 반복문으로, com_code 리스트의 요소를 받아 getPrice() 함수로 주가를 받아오고
- 주가를 price 리스트에 추가한다.
- 마지막으로 df 객체에 종목코드, 회사 이름, 주가 값에 대한 리스트를 결합하여 데이터 프레임을 생성한다
- print(df) 하면 끝!
🧑💻 전체 코드
import requests
from bs4 import BeautifulSoup
import pandas as pd
from fake_useragent import UserAgent
def getPrice(com_code):
soup = getSoup(com_code)
no_today = soup.select_one("p.no_today")
price = no_today.select_one("span.blind").get_text()
#print(price)
return price
def getSoup(com_code):
url = "https://finance.naver.com/item/main.naver?code="+com_code
ua = UserAgent()
# 기존 user-agent와 원리는 같음. 다만, 이런 라이브러리가 존재한다! 정도로만 확인해주세요!
headers = {'user-agent' : ua.ie}
req = requests.get(url)
soup = BeautifulSoup(req.text, "html.parser")
return soup
return soup
def main():
com_codes = ["030200", "005930"]
com_names = ["KT", "삼성전자"]
prices = []
for code in com_codes:
price = getPrice(code)
prices.append(price)
df = pd.DataFrame({"종목코드":com_codes, "상장회사": com_names, "주가": prices})
print(df)
if __name__ == "__main__":
main()
🧑💻 또다른 크롤링 방법(참고)
import requests
from bs4 import BeautifulSoup
import pandas as pd
com_codes = ["030200", "005930"]
com_names = ["KT", "삼성전자"]
com_price = []
def makeDf(all_list):
df = pd.DataFrame({"code":com_codes, "name": com_names, "price": com_price})
return df
def crawler(soup):
price = soup.find("div", class_="today").find ("span", class_="blind")
com_price.append(price.text)
return None
def main():
custom_header = {
'referer' : 'https://finance.naver.com/item/main.naver?',
'user-agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
}
main_url = "https://finance.naver.com/item/main.naver?"
for i in com_codes:
url = main_url+"code="+i
req = requests.get(url, headers = custom_header)
soup = BeautifulSoup(req.text, "html.parser")
result = crawler(soup)
final_df = makeDf(result)
return print(final_df)
if __name__ == "__main__":
main()
"""
1. 코드번호 가져오기
2. for i in [코드번호]:
url = "~/000000"
"""
728x90
'Programming Basics' 카테고리의 다른 글
[크롤링] 셀레늄(selenium) 활용 ; 구글 검색 후 이미지 다운로드 (0) | 2023.08.08 |
---|---|
[웹 크롤링] 주식 일별 시세를 데이터프레임으로 저장하기 (0) | 2023.08.05 |
[웹 크롤링] 벅스에서 Top 100 노래 제목 크롤링하기 (0) | 2023.08.04 |
[웹 크롤링] 네이버 연합뉴스의 타이틀 크롤링 (0) | 2023.08.04 |
[웹 크롤링] 로컬 html 파일에서 데이터 가져오기 (0) | 2023.08.04 |