Shopping Cart

購物車內沒有任何商品。

強大的 HTTP 請求套件 requests – get/post-Python 套件使用(五)

一、前言

與 web 互動上,在 python 中都是用 requests 為主要套件。透過 requests 可以對 HTTP 發送請求,抓取網頁的資料。因為它目前不是 python 預設套件,所以我們開始前需要先安裝:

pip install requests

在 request 使用上主要分成兩種邏輯:get/post。(雖然還有 Put、Delete、 head…等,但本文先以常見的這兩種為主要介紹)

立即訂閱電子報,掌握最新資訊!

    稱呼

    電子郵件

    以下非必填,但若您願意分享,我們將能推送更精準的內容給您

    投資經驗

    是否為理工科背景、工程師或有寫程式的經驗?

    有興趣的主題
    量化交易台股期貨海外期貨虛擬貨幣美股

    有興趣的量化交易軟體/平台
    不清楚MultiChartsTradingViewPythonXQ

    想透過量化交易達成甚麼目的?
    不確定自動交易選股回測投資績效量化自己的投資方法想找現成的策略套用

    還有什麼想詢問的?

    20241111 1920 400
    20241111 978 258


    二、requests.get(url=””)

    get 的邏輯是對網頁提出一個請求,這類的請求細節又大概分兩種:「不帶條件的」和「有帶條件的」。

    1. 不帶條件的:

    通常網址很單純,就是個 https:// xxx 然後就沒了,這類的大概都是一些狀態確認或是基礎資料而已,以全世界最大的幣安交易所為例,取得最簡單的交易所資訊就可以直接打他們 API。

    # 後面json表示用json解析後回傳
    print(requests.get(url="https://api.binance.com/api/v3/exchangeInfo").json()) 

    結果如下

    ...False, 'filters': [{'filterType': 'PRICE_FILTER', 'minPrice': '0.00100000', 'maxPrice': '10000.00000000', 'tickSize': '0.00100000'}, {'filterType': 'PERCENT_PRICE', 'multiplierUp': '5', 'multiplierDown': '0.2', 'avgPriceMins': 5}, {'filterType': 'LOT_SIZE', 'minQty': '0.10000000', 'maxQty': '90000.00000000', 'stepSize': '0.10000000'}, {'filterType': 'MIN_NOTIONAL', 'minNotional': '10.00000000', 'applyToMarket': True, 'avgPriceMins': 5}, {'filterType': 'ICEBERG_PARTS', 'limit': 10}, {'filterType': 'MARKET_LOT_SIZE', 'minQty': '0.00000000', 'maxQty': '7317.16184850', 'stepSize': '0.00000000'}, {'filterType': 'TRAILING_DELTA', 'minTrailingAboveDelta': 10, 'maxTrailingAboveDelta': 2000, 'minTrailingBelowDelta': 10, 'maxTrailingBelowDelta': 2000}, {'filterType': 'MAX_NUM_ORDERS', 'maxNumOrders': 200}, {'filterType': 'MAX_NUM_ALGO_ORDERS', 'maxNumAlgoOrders': 5}], 'permissions': ['SPOT']}]}

    往往我們要的可能不止基本資料,會對需要的對方稍微提出一些基本需求,這時候就得靠下一個了:

    2. 有帶條件的:(query)

    url = "https://api.binance.com/api/v3/exchangeInfo?symbol=BNBBTC"
    print(requests.get(url=url).json())
    """
    結果:
    {"timezone":"UTC","serverTime":1654293535998,"rateLimits":[{"rateLimitType":"REQUEST_WEIGHT","interval":"MINUTE","intervalNum":1,"limit":1200},{"rateLimitType":"ORDERS","interval":"SECOND","intervalNum":10,"limit":50},{"rateLimitType":"ORDERS","interval":"DAY","intervalNum":1,"limit":160000},{"rateLimitType":"RAW_REQUESTS","interval":"MINUTE","intervalNum":5,"limit":6100}],"exchangeFilters":[],"symbols":[{"symbol":"BNBBTC","status":"TRADING","baseAsset":"BNB","baseAssetPrecision":8,"quoteAsset":"BTC","quotePrecision":8,"quoteAssetPrecision":8,"baseCommissionPrecision":8,"quoteCommissionPrecision":8,"orderTypes":["LIMIT","LIMIT_MAKER","MARKET","STOP_LOSS_LIMIT","TAKE_PROFIT_LIMIT"],"icebergAllowed":true,"ocoAllowed":true,"quoteOrderQtyMarketAllowed":true,"allowTrailingStop":true,"isSpotTradingAllowed":true,"isMarginTradingAllowed":true,"filters":[{"filterType":"PRICE_FILTER","minPrice":"0.00000100","maxPrice":"100000.00000000","tickSize":"0.00000100"},{"filterType":"PERCENT_PRICE","multiplierUp":"5","multiplierDown":"0.2","avgPriceMins":5},{"filterType":"LOT_SIZE","minQty":"0.00100000","maxQty":"100000.00000000","stepSize":"0.00100000"},{"filterType":"MIN_NOTIONAL","minNotional":"0.00010000","applyToMarket":true,"avgPriceMins":5},{"filterType":"ICEBERG_PARTS","limit":10},{"filterType":"MARKET_LOT_SIZE","minQty":"0.00000000","maxQty":"13613.81240931","stepSize":"0.00000000"},{"filterType":"TRAILING_DELTA","minTrailingAboveDelta":10,"maxTrailingAboveDelta":2000,"minTrailingBelowDelta":10,"maxTrailingBelowDelta":2000},{"filterType":"MAX_NUM_ORDERS","maxNumOrders":200},{"filterType":"MAX_NUM_ALGO_ORDERS","maxNumAlgoOrders":5}],"permissions":["SPOT","MARGIN"]}]}
    
    """

    get 的類型通常在爬蟲上很常用,因為爬蟲往往比較少會需要帶個人資料,但是進階一點的動態網頁,可能就很難單純只用網址就可以取得相關資料,故這時候也可能會需要對於其網頁進行一些研究與分析。

    而上述例子中,連接在網址後面的 「?symbol=BNBBTC」就是所謂的 query,這類相當於我們送請求給網站或是對應的 API 時,跟他們說一些篩選條件,但這類的做法並不適合將一些私人安全金鑰等等的資訊帶在網址上一起給。

    所以就有了安全性較高的另一種作法:post。

    Py 101209161710
    Py 101209161711

    二、requests.post(url=””, data={‘key’:’value’})

    以下以取得期交所的資料為範例:

    觀察期交所網站會發現:https://www.taifex.com.tw/cht/3/totalTableDate

    它更改日期並沒有讓網址變動,這時候就得去找對應的網頁api了,若是當日資料,我們能輕易取得。如果是歷史資料,該怎麼操作呢?

    下列的案例帶大家操作一遍取得特定日期資料的方式,即使是歷史資料,也能順利爬出資料。

    python_requests_101112271430

    預計取得2021/10/13資料,按下 F12 找到 Network。

    按下F12會出現的畫面

    下圖中可以發現,在這裡無法顯示歷史數據,因此要用「post」取得過往資料。拉到底下找需要運用的資料。

    程式碼顯示此處無法顯示歷史數據

    上圖的紅框處就是我們需要的 code。

    url = 'https://www.taifex.com.tw/cht/3/totalTableDate'
    payload = {
        'queryType': 1,
        'goDay': '',
        'doQuery': 1,
        'dateaddcnt': '',
        'queryDate': "2021/10/16",
    }
    res_json = requests.post(url, payload)
    
    soup = BeautifulSoup(res_json.content, 'html.parser').find_all('table')
    print(soup)

    因為爬蟲的做法在其他文章提到過囉,這邊就不重新解釋,輸入以上程式碼就能取得相關資料。

    至於內部資料的處理,資料處理的邏輯都是一樣的,可以根據自己的需求,參考前面章節提到方法做整理囉!

    小結:

    基本上可以切成:

    • get + None
    • get + query
    • post + data

    這三種方式,去與網頁們互動,隨著各位的能力提升,會發現爬蟲很多時候只是一個手段,更即時、更大量、更精確的資料,都會需要去讀每間公司的 API文件。

    他們對於API還會有 header加密帶私鑰的安全作法,這類型的任務往往表示這些是對方公司開出來給大家用的,適合更高頻率、高需求的使用情境,而這種類型的資料往往也會是需要被大量分析的囉!

    掌握 get、post 的概念後,未來還有 session. websockets 類的交互方式等著各位去學習與發掘!這篇大概就到這邊囉!如果有任何心得或是想討論的歡迎於底下留言!謝謝大家!


    加入LINE社群量化交易討論群」無壓力討論與分享!

    加入Discord 「量化交易討論群」即時獲取實用的資源!

    Write Together 101306261122
    Write Together 101306261121
    RoWay
    RoWay

    多年投資經驗的兩岸三地操盤手,曾任海外資產管理公司交易平台的產品經理、與各外商投資公司合作開發各式交易策略與系統。

    擅長用Python執行資料蒐集、整理、分析與交易;也善於用Multicharts、MetaTrader等系統建構並回測期貨、期權、區塊鏈策略進而完成投資組合管理。

    文章: 28

    發佈留言

    發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *