自建爬蟲環境與Colab環境的應用

繼上篇"selenium 動態爬蟲的技巧"

一、檢查環境

conda info -e

二、進入環境

conda activate se2024

三、觀察
https://finance.yahoo.com/quote/2330.TW/chart/

https://query2.finance.yahoo.com/v8/finance/chart/2330.TW?period1=1726708800&period2=1726884000&interval=1m&includePrePost=true&events=div%7Csplit%7Cearn&&lang=en-US&region=US

interval=1m

1m 1分

2m 2分

5m 5分

1d 日

1wk 周

1mo 月


四、安裝套件

pip install requests
pip install numpy
pip install pandas
pip install matplotlib
pip install --upgrade mplfinance
conda install -c conda-forge mplfinance


五、錯誤訊息

requests.exceptions.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

多層JSON


六、資料欄位

欄位解釋:

timestamp:每一筆數據的時間戳記,這是自 1970 年 1 月 1 日 (Unix 時間) 以來的秒數。這個數字可以轉換成標準的日期和時間格式。

open:該分鐘的開盤價,即在該時間段內第一筆成交的價格。

high:該分鐘的最高價,即在該時間段內成交的最高價格。

low:該分鐘的最低價,即在該時間段內成交的最低價格。

close:該分鐘的收盤價,即在該時間段內最後一筆成交的價格。

volume:該分鐘內的成交量,即在該時間段內交易的股票數量。


6 條回復   |  直到 24天前 | 325 次瀏覽




熱門評論
  1. 1
    digitgeek 24天前 支持  0 | 反對  0

    import requests
    import pandas as pd
    # 定義 API 請求的 URL
    link = 'https://query2.finance.yahoo.com/v8/finance/chart/2330.TW?period1=1726708800&period2=1726884000&interval=1m&includePrePost=true&events=div%7Csplit%7Cearn&&lang=en-US&region=US'
    # 定義請求頭,模擬瀏覽器的 User-Agent
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36',
        'Accept-Language': 'en-US,en;q=0.9',
        'Accept-Encoding': 'gzip, deflate, br',
        'Connection': 'keep-alive'
    }
    # 發送 GET 請求,加入 headers
    r = requests.get(link, headers=headers)
    # 檢查請求是否成功
    if r.status_code == 200:
        # 解析 JSON 資料
        raw_data = r.json()
        # 提取所需的資料
        timestamps = raw_data['chart']['result'][0]['timestamp']
        indicators = raw_data['chart']['result'][0]['indicators']['quote'][0]
        # 建立 DataFrame
        data = pd.DataFrame({
            'timestamp': timestamps,
            'open': indicators['open'],
            'high': indicators['high'],
            'low': indicators['low'],
            'close': indicators['close'],
            'volume': indicators['volume']
        })
        # 儲存成 CSV
        data.to_csv('2330twA.csv', index=False, header=True)
        print("Data successfully fetched and saved to CSV.")
        
    else:
        print(f"Error: Unable to fetch data, status code {r.status_code}")


    1. 1
      digitgeek 24天前 支持  0 | 反對  0

      時間轉換

      import time
      time_s=1726708800
      intime=time.localtime(time_s) # 數值轉時間
      strtime=time.strftime("%Y-%m-%d %H:%M:%S",intime)
      print(strtime)



      import time
      time_d="2024-09-21 10:00:10"
      strtime=time.strptime(time_d,"%Y-%m-%d %H:%M:%S")
      timtime=int(time.mktime(strtime))
      print(timtime)


      1. 1
        digitgeek 24天前 支持  0 | 反對  0

        import requests
        import time
        import pandas as pd
        # 設定 變數
        start_time=1672538400
        end_time=1726884000
        # 轉換成日期格式
        start_time_str=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(start_time))
        end_time_str=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(end_time))
        print(f"抓取從{start_time_str}到{end_time_str}的數據")
        # URL 修改 加入 變數
        link = f'https://query2.finance.yahoo.com/v8/finance/chart/2330.TW?period1={start_time}&period2={end_time}&interval=1d&includePrePost=true&events=div%7Csplit%7Cearn&&lang=en-US&region=US'
        # f ===> format
        # link = 'https://query2.finance.yahoo.com/v8/finance/chart/2330.TW?period1={}&period2={}&interval=1d&includePrePost=true&events=div%7Csplit%7Cearn&&lang=en-US&region=US'.format(start_time,end_time)
        # 定義請求頭,模擬瀏覽器的 User-Agent
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36',
            'Accept-Language': 'en-US,en;q=0.9',
            'Accept-Encoding': 'gzip, deflate, br',
            'Connection': 'keep-alive'
        }
        # 發送 GET 請求,加入 headers
        r = requests.get(link, headers=headers)
        # 檢查請求是否成功
        if r.status_code == 200:
            # 解析 JSON 資料
            raw_data = r.json()
            # 提取所需的資料
            timestamps = raw_data['chart']['result'][0]['timestamp']
            indicators = raw_data['chart']['result'][0]['indicators']['quote'][0]
            # 建立 DataFrame
            data = pd.DataFrame({
                'timestamp': timestamps,
                'open': indicators['open'],
                'high': indicators['high'],
                'low': indicators['low'],
                'close': indicators['close'],
                'volume': indicators['volume']
            })
            
            # 將時間數值轉換可讀的時間格式
            data['timestamp']=pd.to_datetime(data['timestamp'],unit='s')
            
            # 儲存成 CSV
            data.to_csv('2330tw.csv', index=False, header=True)
            print("Data successfully fetched and saved to CSV.")
            
        else:
            print(f"Error: Unable to fetch data, status code {r.status_code}")


        1. 1
          digitgeek 24天前 支持  0 | 反對  0

          import pandas as pd
          # import numpy as np
          import matplotlib.pyplot as plt
          # 讀取csv
          data=pd.read_csv('2330tw.csv')
          # df=pd.DataFrame(data)
          print(data.head(2))
          plt.figure(figsize=(10,5)) # 畫布大小
          plt.plot(data.index,data['open'],label='open')
          plt.plot(data.index,data['close'],label='close')
          plt.title('2330 open close')
          plt.grid(True)
          plt.legend()
          plt.show()


          1. 1
            digitgeek 24天前 支持  0 | 反對  0

            import pandas as pd
            # import numpy as np
            import matplotlib.pyplot as plt
            # 讀取csv
            data=pd.read_csv('2330tw.csv')
            plt.figure(figsize=(10,5)) # 畫布大小
            plt.bar(data.index,data['volume'],label='volume')
            plt.title('2330 volume')
            plt.grid(True)
            plt.legend()
            plt.savefig('volume.png',format='png')
            plt.show()


            1. 1
              digitgeek 24天前 支持  0 | 反對  0

              import pandas as pd
              import matplotlib.pyplot as plt
              import mplfinance as mpf
              from datetime import datetime
              # 股票數據
              data=pd.read_csv('2330twA.csv')
              # 轉換為DataFrame並轉換時間戳
              df = pd.DataFrame(data)
              df['timestamp'] = pd.to_datetime(df['timestamp'], unit='s')
              df.set_index('timestamp', inplace=True)
              # K 線圖設置
              mpf.plot(
                  df, 
                  type='candle', # K 線圖
                  volume=True,   # 加上成交量
                  title='Stock Price Visualization', 
                  style='charles', 
                  ylabel='Price',
                  ylabel_lower='Volume'
              )
              # 使用 plt.savefig 儲存為 PNG 格式
              plt.savefig('stock_price.png', format='png')
              plt.show()




              登入後才可發表內容