INVESTAR / StockAnalysisInPython

456 stars 413 forks source link

5.3.9 json을 이용한 업데이트 페이지수 수정관련해서.. #109

Open Junghun79 opened 2 years ago

Junghun79 commented 2 years ago

100페이지를 하려고 100으로 수정한뒤에 DBUpate를 해보고있는데 100까지 카운트는 되지만 실제 데이터를 읽어오는건 1page의 10일치만 가져오더라구요. 혹시 이건 어떤걸 수정해봐야할까요?

INVESTAR commented 2 years ago

먼저 read_naver() 함수의 5번째 줄과 19번째 줄에서 웹 페이지를 읽어올 때 requests.get() 함수의 인자로 브라우저 정보를 넘겨주셨는지 확인해 보시기 바랍니다.

브라우저 정보를 잘 넘겨주셨는데도 불구하고 10일치 데이터만 가져온다면 아래 코드에서 제가 "# ←" 표시를 해둔 것처럼 print() 함수로 일일이 데이터를 찍어가면서 원인을 찾아보셔야 할 것 같습니다.

    def read_naver(self, code, company, pages_to_fetch):
        """네이버에서 주식 시세를 읽어서 데이터프레임으로 반환"""
        try:
            url = f"http://finance.naver.com/item/sise_day.nhn?code={code}"
            html = BeautifulSoup(requests.get(url,
                headers={'User-agent': 'Mozilla/5.0'}).text, "lxml")
            pgrr = html.find("td", class_="pgRR")
            if pgrr is None:
                return None
            s = str(pgrr.a["href"]).split('=')
            lastpage = s[-1] 
            df = pd.DataFrame()
            pages = min(int(lastpage), pages_to_fetch)
            print("company :", company)    # ←
            print("lastpage :", lastpage)      # ←
            print("pages_to_fetch :", pages_to_fetch)  # ←         
            for page in range(1, pages + 1):
                pg_url = '{}&page={}'.format(url, page)
                df = df.append(pd.read_html(requests.get(pg_url,
                    headers={'User-agent': 'Mozilla/5.0'}).text)[0])                                          
                tmnow = datetime.now().strftime('%Y-%m-%d %H:%M')
                print('[{}] {} ({}) : {:04d}/{:04d} pages are downloading...'.
                    format(tmnow, company, code, page, pages), end="\r")
            df = df.rename(columns={'날짜':'date','종가':'close','전일비':'diff'
                ,'시가':'open','고가':'high','저가':'low','거래량':'volume'})
            df['date'] = df['date'].replace('.', '-')
            df = df.dropna()
            df[['close', 'diff', 'open', 'high', 'low', 'volume']] = df[['close',
                'diff', 'open', 'high', 'low', 'volume']].astype(int)
            df = df[['date', 'open', 'high', 'low', 'close', 'diff', 'volume']]
            print("\n", df.head(), "\n", df.tail(), "\n", df.describe())  # ←
        except Exception as e:
            print('Exception occured :', str(e))
            return None
        return df

정상적인 경우에는 아래처럼 표시가 될 것입니다.

company : 동화약품
lastpage : 634
pages_to_fetch : 100
[2021-10-04 21:12] 동화약품 (000020) : 0100/0100 pages are downloading...
          date   open   high    low  close  diff    volume
1  2021.10.01  18100  20100  18000  19600  1750   9217856
2  2021.09.30  19600  21450  17550  17850   700  16811805
3  2021.09.29  16100  19200  15950  18550  2050  10756122
4  2021.09.28  17650  19600  16450  16500  1550   6178907
5  2021.09.27  17650  18600  17050  18050   100   2982393
           date  open  high   low  close  diff  volume
9   2017.09.11  8760  9090  8730   8940   230  141043
10  2017.09.08  8890  8900  8710   8710   160   87628
11  2017.09.07  8710  8880  8710   8870   270   87084
12  2017.09.06  8670  8840  8590   8600   110  129728
13  2017.09.05  8810  8850  8670   8710    90  108670
                open          high           low         close         diff        volume
count   1000.000000   1000.000000   1000.000000   1000.000000  1000.000000  1.000000e+03
mean   12249.910000  12552.000000  11967.980000  12227.735000   273.030000  5.767250e+05
std     4454.623077   4710.937543   4241.911377   4422.843864   443.280348  1.763314e+06
min     4900.000000   5170.000000   4800.000000   4985.000000     0.000000  7.387000e+03
25%     9340.000000   9467.500000   9150.000000   9320.000000    50.000000  7.396775e+04
50%    10650.000000  10850.000000  10350.000000  10600.000000   150.000000  1.587910e+05
75%    14950.000000  15150.000000  14700.000000  14900.000000   300.000000  3.705312e+05
max    30350.000000  34450.000000  29150.000000  30300.000000  5900.000000  1.811075e+07
[2021-10-04 21:12] #0001 동화약품 (000020) : 1000 rows > REPLACE INTO daily_price [OK]

만일 read_naver() 함수에서 df를 찍어봤을 때에도 이상이 없다면 replace_into_db() 함수 내부에서 DB에 데이터를 기록하는 과정에서 이상이 있을 수 있으므로 해당 함수 내부에서도 디버깅용 데이터를 찍어보면서 원인을 찾아보시기 바랍니다.