INVESTAR / StockAnalysisInPython

456 stars 412 forks source link

chap4 질문 있습니다. #39

Closed Eom-taeseon closed 3 years ago

Eom-taeseon commented 3 years ago

4.4.4장 전체 페이지 읽어오기에서

df = pd.DataFrame()
sise_url = 'https://finance.naver.com/item/sise_day.nhn?code=068270'  
for page in range(1, int(last_page)+1):
    page_url = '{}&page={}'.format(sise_url, page)  
    df = df.append(pd.read_html(page_url, header=0)[0])

이 부분에서 아래와 같은 오류가 뜹니다.

ValueError Traceback (most recent call last)

in 3 for page in range(1, int(last_page)+1): 4 page_url = '{}&page={}'.format(sise_url, page) ----> 5 df = df.append(pd.read_html(page_url, header=0)[0]) ~\anaconda3\lib\site-packages\pandas\util\_decorators.py in wrapper(*args, **kwargs) 294 ) 295 warnings.warn(msg, FutureWarning, stacklevel=stacklevel) --> 296 return func(*args, **kwargs) 297 298 return wrapper ~\anaconda3\lib\site-packages\pandas\io\html.py in read_html(io, match, flavor, header, index_col, skiprows, attrs, parse_dates, thousands, encoding, decimal, converters, na_values, keep_default_na, displayed_only) 1084 ) 1085 validate_header_arg(header) -> 1086 return _parse( 1087 flavor=flavor, 1088 io=io, ~\anaconda3\lib\site-packages\pandas\io\html.py in _parse(flavor, io, match, attrs, encoding, displayed_only, **kwargs) 915 break 916 else: --> 917 raise retained 918 919 ret = [] ~\anaconda3\lib\site-packages\pandas\io\html.py in _parse(flavor, io, match, attrs, encoding, displayed_only, **kwargs) 896 897 try: --> 898 tables = p.parse_tables() 899 except ValueError as caught: 900 # if `io` is an io-like object, check if it's seekable ~\anaconda3\lib\site-packages\pandas\io\html.py in parse_tables(self) 215 list of parsed (header, body, footer) tuples from tables. 216 """ --> 217 tables = self._parse_tables(self._build_doc(), self.match, self.attrs) 218 return (self._parse_thead_tbody_tfoot(table) for table in tables) 219 ~\anaconda3\lib\site-packages\pandas\io\html.py in _parse_tables(self, doc, match, attrs) 545 546 if not tables: --> 547 raise ValueError("No tables found") 548 549 result = [] ValueError: No tables found

어떻게 해결하면 좋을까요?

INVESTAR commented 3 years ago

2021년 1월부터 네이버 금융에서 User-agent 정보가 없는 웹 스크레이핑을 차단했기 때문에 팬더스의 read_html() 함수를 사용할 때에도 기존처럼 단순히 URL만 인자로 넘겨줘서는 안 되고 아래처럼 requests.get() 함수로 읽은 전체 HTML 텍스트를 인자로 넘겨줘야 합니다.

변경 전 df = df.append(pd.read_html(page_url, header=0)[0])

변경 후 df = df.append(pd.read_html(requests.get(page_url , headers={'User-agent': 'Mozilla/5.0'}).text)[0])

Eom-taeseon commented 3 years ago

문제 해결 됐습니다. 감사합니다 :)

p.s. 194쪽의 목차가 오타난 것 같습니다. 4.5.3 셀트리온 캔들 차트로 씌어져야할 것 같은데 4.4.3 셀트리온 캔들 차트라고 써져있네요.

INVESTAR commented 3 years ago

알려주신대로 4.5.3 셀트리온 캔들 차트로 표시되는 게 맞습니다. 다음 인쇄(5쇄)에서 수정하겠습니다.