상세 컨텐츠

본문 제목

세계 주식시장 데이터 크롤링하기 (3) - 파이썬 beautifulsoup

카테고리 없음

by Financial Solution 2022. 1. 31. 09:37

본문

https://financialsolution.tistory.com/86

 

세계 주식시장 데이터 크롤링하기 (2)

https://financialsolution.tistory.com/75 세계 주식시장 데이터 크롤링하기 (1) 단순히 세계 주식시장의 현재 지수만 아는 건 쉽습니다. Investing.com이나, 아니면 단순히 네이버증권에서도 주요 주식시장 지

financialsolution.tistory.com

앞에서 HTML 구조를 분석했다면, 이 HTML 언어를 우리가 원하는 데이터 셋 = 엑셀 으로 만드는 작업을 파이썬으로 하는 과정입니다.

 

여기서 파이썬에서 필요한 모듈은 Beautifulsoup (HTML에서 우리가 원하는 것을 뽑아낼 수 있게 해 주는) 그리고 엑셀로 저장하기 전 Table 으로 만들기 위한 Pandas 입니다. 대부분의 크롤링은 Beautifulsoup 만 이해하면 끝날 수 있을 것입니다.

 

1단계 - 타겟 URL의 구조를 확인했으면, 불러올 URL 리스트를 만들고 거기서 HTML을 잘 가져오는지 테스트

    targeturl = "https://www.ishares.com/us/products/" + etfcode + "/"
    print(targeturl)
    req = urllib.request.Request(targeturl, headers={'User-Agent': 'Chrome/66.0.3359.181'})
    data = urllib.request.urlopen(req).read()
    bs = BeautifulSoup(data, 'html.parser')

    datadict = {}
    datadict['etfcode'] = etfcode
    # ETF이름 가져오기
    datadict['etfname'] = etflist[urlcodelist.index(etfcode)]

2단계 - HTML에서 키워드 뽑아내기, 뽑아서 Dictionary 에 넣기

    res_name = bs.find("h1",{"class":"product-title "})
    print(res_name)
    if res_name == None:
        res_name = bs.find("h1",{"class":"product-title sticky-font-normal en_US"})
    if res_name == None:
        res_name = bs.find("h1", {"class": "product-title sticky-font-text en_US"})
    if res_name == None:
        res_name = bs.find("h1", {"class": "product-title font-medium sticky-font-13px en_US"})
    try: datadict['name'] = res_name.get_text(strip='true')
    except: datadict['name'] = "Fail"

    res_tr1 = bs.find("td",{"class":"oneYearAnnualized"})
    datadict['tr1'] = res_tr1.get_text(strip='true')
    res_tr3 = bs.find("td",{"class":"threeYearAnnualized"})
    datadict['tr3'] = res_tr3.get_text(strip='true')
    res_tr5 = bs.find("td",{"class":"fiveYearAnnualized"})
    datadict['tr5'] = res_tr5.get_text(strip='true')

3단계 - Datadict 를 csv 파일 형태로 저장

    cols = ['etfcode','etfname','ticker','name','tr1','tr3','tr5','per','pbr','NAV','expense']
    df = df[cols]
    print(df)
    df.to_csv(nowDate + 'iShares.csv', encoding='euc_kr')

추가 - 크롤링을 막기 위해서인지, 크롤링을 하면 데이터를 안 보내주는 웹사이트들이 있는데 이 경우는 sleep 넣어서 해결. 그래도 안 되면 sleep을 더 길게 가져가고, 그래도 안 되면 아마추어 레벨은 아님...

def valueFactorGet(i):
    try:
        return parseiShares(i)
    except Exception as e:
        print(e)
        sleep(3)

        try: return parseiShares(i)
        except:
            print('sleep' + i)
            sleep(8)
            try:
                return parseiShares(i)
            except:
                print('sleep' + i)
                dic = {}
                dic['etfcode'] = i
                return dic
반응형