# 4.4 Google Finance API

3.4小節的Google Finance個股資訊是直接爬網頁來的, 這邊要示範怎麼透過Google Finance API達到類似的效果.

```python
import requests
import json
from datetime import datetime, timedelta


GOOGLE_FINANCE_API_URL = 'http://finance.google.com/finance/info?client=ig&q='
GOOGLE_FINANCE_HISTORY_API_URL = 'http://www.google.com/finance/getprices?q='


def get_stock(query):
    # You can query for multiple stocks by splitting with ","
    resp = requests.get(GOOGLE_FINANCE_API_URL + query)
    if resp.status_code != 200:
        print('Invalid url or query param: ' + resp.url)
        return None
    else:
        # Need to remove the redundant chars '//' at the head of response
        return json.loads(resp.text.replace('//', ''))


def get_stock_history(stock_id, stock_mkt):
    resp = requests.get(GOOGLE_FINANCE_HISTORY_API_URL + stock_id + '&x=' + stock_mkt + '&i=86400&p=1M')
    ''' e.g.,
    EXCHANGE%3DTPE
    MARKET_OPEN_MINUTE=540
    MARKET_CLOSE_MINUTE=810
    INTERVAL=86400
    COLUMNS=DATE,CLOSE,HIGH,LOW,OPEN,VOLUME
    DATA=
    TIMEZONE_OFFSET=480
    a1488346200,186,188.5,186,188.5,46176000
    1,186,188.5,185,188,39914000
    2,184,185,184,184.5,28085000
    5,183.5,184.5,183.5,184,12527000
    ...
    '''
    index = -1
    records = resp.text.split('\n')
    for record in records:
        # 'a' means the start point of stock information
        if record.startswith('a'):
            index = records.index(record)
            break
    if index > 0:
        records = records[index:]
        # To transform the unix time to human readable time at the first line of stock info
        unix_time = int(records[0].split(',')[0][1:])
        init_time = datetime.fromtimestamp(unix_time)

        # To handle to first row
        first_row = records[0].split(',')
        first_row[0] = init_time

        history = list()
        history.append(first_row)

        # To handle the rest of stock records
        for record in records[1:]:
            if record:
                data = record.split(',')
                delta = int(data[0])
                data[0] = init_time + timedelta(days=delta)
                history.append(data)
        return history
    else:
        return None


def main():
    query = 'TPE:2330'
    print('Real time stock price for ' + query)
    stocks = get_stock(query)
    print(stocks[0])
    print('\n')
    stock_id = '2330'
    stock_mkt = 'TPE'
    print('Stock price history for ' + stock_mkt + ":" + stock_id)
    print('(Date, Close, High, Low, Open, Volume)')
    history = get_stock_history(stock_id, stock_mkt)
    for hist in history:
        print(hist[0].strftime("%Y/%m/%d"), hist[1:])


if __name__ == '__main__':
    main()
```

輸出結果:

```
Real time stock price for TPE:2330
{'id': '674465', 't': '2330', 'e': 'TPE', 'l': '207.00', 'l_fix': '207.00', 'l_cur': 'NT$207.00', 's': '0', 'ltt': '1:30PM GMT+8', 'lt': 'May 26, 1:30PM GMT+8', 'lt_dts': '2017-05-26T13:30:02Z', 'c': '0.00', 'c_fix': '0.00', 'cp': '0.00', 'cp_fix': '0.00', 'ccol': 'chb', 'pcls_fix': '207'}


Stock price history for TPE:2330
(Date, Close, High, Low, Open, Volume)
2017/04/28 ['194.5', '194.5', '193', '193.5', '34837000']
2017/05/02 ['196.5', '199', '195.5', '198.5', '44102000']
2017/05/03 ['198', '198.5', '197', '198', '25702000']
2017/05/04 ['198', '199', '197', '198.5', '22076000']
2017/05/05 ['197.5', '198.5', '197', '197', '17022000']
2017/05/08 ['202.5', '202.5', '199', '199', '36514000']
2017/05/09 ['203.5', '207', '203.5', '205.5', '48047000']
2017/05/10 ['205.5', '206', '204', '204', '28296000']
2017/05/11 ['207.5', '208.5', '204', '204.5', '43692000']
2017/05/12 ['206', '207', '205', '205', '24996000']
2017/05/15 ['206', '206', '204', '204', '25655000']
2017/05/16 ['204.5', '205', '203.5', '205', '33212000']
2017/05/17 ['204', '204', '203', '203', '21558000']
2017/05/18 ['203.5', '204', '201.5', '202.5', '22448000']
2017/05/19 ['203', '204.5', '202.5', '203.5', '16483000']
2017/05/22 ['205', '205', '203', '203.5', '13714000']
2017/05/23 ['205', '207', '204.5', '205', '19988000']
2017/05/24 ['205.5', '206', '205', '205', '13378000']
2017/05/25 ['207', '207', '205.5', '206', '22311000']
2017/05/26 ['207', '207', '205', '205', '32492000']

Process finished with exit code 0
```

原始碼[點我](https://github.com/yotsuba1022/web-crawler-practice/blob/master/ch4/google_finance_api.py)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://clu.gitbook.io/python-web-crawler-note/44-google-finance-api.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
