네이버 금융 크롤링
네이버 금융 사이트는 주식들과 주식들의 정보를 제공한다.
주식 관련 정보를 가져와 적절히 가공해 투자에 사용해보자.
어떤 옵션을 표시할 지 설정해주자.
옵션을 선택하면 주식 명과 선택한 옵션에 대한 정보를 보여준다.
옵션을 선택하고 적용하기 버튼을 누르면 URL이 변경되지 않고 화면만 바뀐다.
이런 경우 개발자 도구에서 네트워크 옵션을 사용하자.
네트워크 옵션이 켜진 상태에서 적용하기 버튼을 누르면 사이트가 서버와 어떤 정보를 주고받았는지 확인할 수 있다.
여기서 제일 위에 위치한 옵션을 살펴보자.
클라이언트가 서버에 요청한 URL을 얻을 수 있다.
요청한 URL은 우리가 선택한 옵션이 반영된 정보를 보여주니, 이 URL을 사용해 크롤링을 진행하면 된다. (페이징 처리도 이쪽 URL을 사용해서 처리하고, URL Decoder를 사용해 줘야 한다)
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
from bs4 import BeautifulSoup
import requests
import time
import pyautogui
import os
import urllib.request
import openpyxl
# 꺼짐 방지
chrome_options = Options()
chrome_options.add_experimental_option("detach", True)
# 불필요한 에러메세지 없애기
chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"])
# 크롬드라이버 매너저를 통해 드라이버를 설치, 서비스를 만들어낸다
service = Service(executable_path=ChromeDriverManager().install())
driver = webdriver.Chrome(service = service, options=chrome_options)
#---- selenium 기본설정 끝----#
wb = openpyxl.Workbook()
ws = wb.create_sheet('코스피')
ws.append(['종목명', 'per','roe', 'pbr', '유보율'])
lastpage = int(pyautogui.prompt("몇 페이지까지 가져올까요? (1페이지 = 50개)"))
for i in range(1,lastpage+1):
url = f"https://finance.naver.com/sise/field_submit.naver?menu=market_sum&returnUrl=http://finance.naver.com/sise/sise_market_sum.naver?&page={i}&fieldIds=per&fieldIds=roe&fieldIds=pbr&fieldIds=reserve_ratio"
response = requests.get(url)
html = response.text
soup = BeautifulSoup(html, 'html.parser')
trs = soup.select("table.type_2 > tbody >tr[onmouseover]")
for tr in trs:
# 클래스 정보가 없을 때 nth-child 사용
name = tr.select_one('td:nth-child(2)').text
per = tr.select_one('td:nth-child(7)').text
roe = tr.select_one('td:nth-child(8)').text
pbr = tr.select_one('td:nth-child(9)').text
reserve_ratio = tr.select_one('td:nth-child(10)').text
# NA이면 가져오지 않음
if per != 'N/A' and roe != 'N/A' and pbr != 'N/A' and reserve_ratio != 'N/A':
per = float(per.replace(',', ''))
roe = float(roe.replace(',', ''))
pbr = float(pbr.replace(',', ''))
reserve_ratio = float(reserve_ratio.replace(',', ''))
print(name, per, roe, pbr, reserve_ratio)
ws.append([name, per, roe, pbr, reserve_ratio])
wb.save("naverfinancial/코스피분석.xlsx")
웹사이트를 분석하다 보면 클래스 정보가 명확하지 않거나 없는 경우가 있다.
이 경우 nth-child 옵션을 사용하거나 해당 태그의 부모 태그와 부모의 부모 태그 등을 사용해 해당 태그를 최대한 특정하도록 하자.
클래스가 있으면 편하게 특정할 수 있지만, 없는 경우도 위의 조건들을 사용하면 쉽게 특정할 수 있다.
나머지 작업은 항상 하던대로.. 이전에 진행한 크롤링과 크게 다른 점이 없다.
개발자 도구의 네트워크 탭을 크롤링에 사용할 수 있는 점과, 클래스 정보가 제한적일 때 태그를 특정할 수 있는 방법을 기억하자.
반응형
'Web > Web Scraping' 카테고리의 다른 글
네이버 지도 크롤링 (0) | 2022.09.25 |
---|---|
크롤링에서 POST 요청이 필요한 경우 (0) | 2022.09.24 |
이미지 크롤링 (2) | 2022.09.21 |
쿠팡 상품 크롤링 (0) | 2022.09.20 |
네이버 뉴스 크롤링 (0) | 2022.09.18 |
댓글
이 글 공유하기
다른 글
-
네이버 지도 크롤링
네이버 지도 크롤링
2022.09.25 -
크롤링에서 POST 요청이 필요한 경우
크롤링에서 POST 요청이 필요한 경우
2022.09.24 -
이미지 크롤링
이미지 크롤링
2022.09.21 -
쿠팡 상품 크롤링
쿠팡 상품 크롤링
2022.09.20