진행상태를 보여주는 로직 -> from tqdm import trange
셀레니움 -> 원래 목적: 브라우저를 테스트하기 위해
-> 로그인할 때 수집할 때 사용
requests
get방식 -> Query String
post방식 -> Form Data
HTTP 상태 코드 – 200 ok 이면 성공
요청 시 봇이 아니라 브라우저라고 알려줌
-> response = requests.get(url, headers={"user-agent":"Mozilla/5.0"})
html 파일 읽어오기
-> pd.read_html(url, encoding="cp949")
결측 데이터 제거하기(axis 0:행, 1:열)
-> table[0].dropna()
데이터 프레임 합치기
-> pd.concat([df1, df2, df3])
중복데이터 제거
-> df.drop_duplicates()
과학적 기수법
-> 1.210000e+02 => 121
날짜 column의 첫 row값 확인
-> date = df.iloc[0]["날짜"]
파일로 저장하기
-> df.to_csv(file_name, index=False)
파일 읽어오기
-> pd.read_csv(file_name)
BeautifulSoup
soup.title
#The Dormouse's story
soup.title.name
#u'title'
soup.title.string
#u'The Dormouse's story'
soup.title.parent.name
#u'head'
soup.p
#
The Dormouse's story
soup.p['class']
#u'title'
soup.a
#Elsie
soup.find_all('a')
#[Elsie,
#Lacie,
#Tillie]
soup.find(id="link3")
#Tillie
html.find_all("a")[:3]
-> a태그 다 불러옴
soup.select(“a”)
-> 중요 a 태그 다 불러옴
find_all 과 select의 차이점
->
#find
soup.find('div').find('p')
#select --> 원하는 정보의 경로를 입력하여 데이터를 쉽게 추출할 수 있다.
soup.select_one('div > p')
종목 번호를 이용해 page에 따라 데이터를 읽어오는 함수
""" 는 이 두개 사이의 행들은 주석 처리되며, 함수의 docstring 으로 사용됩니다.
def get_day_list(item_code, page_no):
"""
일자별 시세를 페이지별로 수집
1) url을 만든다.
2) requests 를 통해 html 문서를 받아온다.
3) read_html을 통해 table 태그를 읽어온다.
4) 결측행을 제거
5) 데이터프레임 반환
"""
url = f"https://finance.naver.com/item/sise_day.naver?code={item_code}&page={page_no}"
response = requests.get(url, headers={"user-agent":"Mozilla/5.0"})
table = pd.read_html(response.text)[0]
return table.dropna()
일별 시세 수집
def get_item_list(item_code, item_name):
"""
일별 시세를 수집하는 함수
"""
item_list = []
prev_day = ""
page_no = 1
while True:
df_item = get_day_list(item_code, page_no)
last_day = df_item.iloc[-1]["날짜"]
print(page_no, last_day,end="|")
if last_day == prev_day:
break
item_list.append(df_item)
prev_day = last_day
page_no = page_no + 1
time.sleep(0.01)
df_day = pd.concat(item_list)
df_day["종목코드"] = item_code
df_day["종목명"] = item_name
cols = ['종목코드', '종목명', '날짜', '종가', '전일비', '시가', '고가', '저가', '거래량']
df_day = df_day[cols]
date = df_day.iloc[0]["날짜"]
file_name = f"{item_name}_{item_code}_{date}.csv"
df_day.to_csv(file_name,index = False)
return file_name
expand=True -> 데이터프레임으로 반환하는 기능
itemcode 숫자 앞의 0 이 지워진다면 dtype={"itemcode": np.object} 로 타입을 지정