第十屆鐵人賽 flask-restful DAY30-搞懂 Requests 與 lxml

筆者怎麼開始flask-restful的

30天的flask-restful終於要告一段落了,今天來談談筆者怎麼接觸flask-restful

由於筆者自己有在記錄金融資訊,如如股價、匯率等,但是都是手動查詢網站在一筆一筆的紀錄在txt內,由於近年來自動化盛行,所以筆者想說也就寫個工具來記錄。

而為什麼挑上flask-restful呢?就如同第一天告訴大家的,flask-restful的簡潔可以讓開發者專注在商業邏輯上的開發,就這樣展開flask-restful之旅。

介紹requests

花了30天介紹flask-restful後再來介紹如何將自動化爬網站整進專案中,所以首先先介紹爬網頁的工具requests

安裝requests

首先不外乎就是安裝函式庫了,這裡就不廢話了,若是不知道怎麼安裝的請看以下例子。

$ pip install requests

使用requests

安裝完就可以小試身手了,所以先試試以下例子。

        response = requests.get(
            'http://www.twse.com.tw/exchangeReport'
            '/STOCK_DAY?response=html&date='
            + date + "&stockNo=0050")

這是筆者透過台灣證券交易所公開資訊網站上抓取台灣五十0050的相關資料網頁,透過requests.get可以取得網頁相關內容回傳回來,所以接下來就是要解析response.content的內容了。

解析xml

因為回來的資訊一定是html,所以接下來要來解析取得的資料,並取得我們所需要的資訊。

除非讀者爬的是api,不過api應該不需要特別去爬。

介紹lxml

這裡筆者用來解析取得資料的工具是xml,所以第一步不外乎是安裝lxml了。

安裝lxml

這裡不外乎就是透過pip安裝了,如果不熟的讀者請看以下例子:

$ pip install lxml

介紹xpath

這部分主要是將上一個步驟所取得的response.content放到lxml內解析產生xml的結構即可,例如以下例子:

        html = etree.HTML(response.content)
        stockList = []
        for item in html.xpath('/html/body/div/table/tbody/tr'):
            # item[0].text->日期
            # item[3].text->開盤價
            # item[4].text->最高價
            # item[5].text->最低價
            # item[6].text->收盤價
            # item[7].text->漲跌價差
            # item[1].text->成交股數
            # item[2].text->成交金額
            # 日期民國轉西元
            year = int(item[0].text.split('/')[0]) + 1911
            month = int(item[0].text.split('/')[1])
            day = int(item[0].text.split('/')[2])
            itemDate = datetime.datetime(year, month, day)
            if (maxDate < itemDate):
                stockList.append(
                    StockModel(itemDate.strftime('%Y%m%d'), float(item[3].text),
                               float(item[4].text), float(item[5].text),
                               float(item[6].text), float(item[7].text),
                               round(
                                   int(item[1].text.replace(',', '')) / 1000),
                               round(int(item[2].text.replace(',', '')) / 1000)))
        if (len(stockList) > 0):
            StockModel.save_list_to_db(stockList)

雖然我們取的xml的結構對我們幫助很大,但是我們只是需要其中的一些資訊,所以這部份透過xpath直接取的我們想要的資料,例如上述例子中我們在乎的是股價相關資訊,而其資料是利用table來存放的,所以我們就透過xpath/html/body/div/table/tbody/tr取的我們所要的每個column的內容,再來上述例子是將其內容整理最後存放到sqlite內。

實際解析網頁內容

由於每一個網站的結構都不一樣,所以想要擷取所需的資料不外乎就是要去了解該網站的結構,知道想要的資料放置於那裡之後再透過xpath選取想要的資料後整理存放到資料庫內,接下來再透過flask-restful實作GET的方法來返還資料給client端,如此就可以自己擁有一個股價api網站了。

小結

30天一轉眼就過了,感謝大家的支持與陪伴讓筆者可以完成這些內容,謝謝各位。

發佈留言

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