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