hyunyulhenry / quant_py

파이썬을 이용한 퀀트 투자 포트폴리오 만들기
171 stars 90 forks source link

11.2 티커 수집하기 오류 #54

Open NureongKim opened 1 month ago

NureongKim commented 1 month ago

안녕하세요. 너무 자주 질문드리는 것 같아 죄송할 따름입니다. 나름대로 해결해보려고 시도했는데 잘 안 돼서 문의드리게 되었습니다.

인베스팅닷컴 홈페이지가 많이 변경돼서 기존 11.2 티커 수집하기 코드와 많은 부분이 다른 것을 확인했습니다. 국가명 가져오는 부분부터 다른 것을 확인했는데 혹시 전 종목 크롤링 코드를 어떻게 수정해야 할 지 여쭙고 싶습니다.

NureongKim commented 1 week ago

왜인지 몇 개는 오류 나서 다 끌고 오지는 못하지만 아래 코드로 실행하면 9405개 중에 8927개는 가져오네요.

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
import pandas as pd
import time

# ChromeDriver 경로 설정
chrome_driver_path = "C:/Users/chromedriver.exe"  # 여기에 chromedriver 경로 설정. chromedriver 설치 방법 참고
service = Service(chrome_driver_path)

# WebDriver를 사용하여 브라우저 실행
driver = webdriver.Chrome(service=service)

# 데이터를 저장할 리스트 초기화
stocks_data = []

# 페이지를 순회하며 데이터 수집 (1페이지부터 314페이지까지)
for page in range(1, 315):
    # Investing.com 스크리너 페이지로 이동 (페이지 번호 포함)
    url = f"https://www.investing.com/stock-screener/?sp=country::5|sector::a|industry::a|exchange::a|equityType::ORD|last::a|price::a&page={page}"
    driver.get(url)

    # 페이지가 로드될 때까지 대기 (필요에 따라 sleep 시간을 조정하세요)
    time.sleep(5)

    # 테이블을 찾음
    try:
        table = driver.find_element(By.XPATH, "//*[@id='screenerTableWrapper']/table/tbody")

        # 테이블의 모든 행을 가져옴
        rows = table.find_elements(By.TAG_NAME, "tr")

        # 테이블의 각 행에서 데이터 추출
        for row in rows[1:]:
            # th 태그에서 'Company' 데이터를 가져옴
            company_data = row.find_element(By.TAG_NAME, "th").text.strip()

            # \n을 기준으로 Symbol과 Name을 분리
            symbol, name = company_data.split("\n")

            # 나머지 열 추출
            cols = row.find_elements(By.TAG_NAME, "td")
            stock = {
                "Name": name.strip(),
                "Symbol": symbol.strip(),
                "Exchange": cols[1].text.strip(),
                "Sector": cols[2].text.strip(),
                "Market Cap": cols[4].text.strip()
            }
            stocks_data.append(stock)

        print(f"Page {page} scraped successfully")

    except Exception as e:
        print(f"Error on page {page}: {e}")

# WebDriver 종료
driver.quit()

# 데이터프레임으로 변환
global_ticker = pd.DataFrame(stocks_data)

# 데이터프레임 출력
global_ticker