iT邦幫忙

2021 iThome 鐵人賽

DAY 7
0
自我挑戰組

BeautifulSoup網頁爬蟲佐Django伺服器框架附AWS雲端運算服務系列 第 7

[Day 7] 餐前濃湯 pt.4-資料內文取得及儲存

上一篇我們提到了如何觀察並且取出我們要的資料
也成功地把資料取出來了
這一篇我們將要對資料做最後的加工,把td tag去掉,並且把數據儲存下來
廢話不多說,咱們累狗~

濃湯的最後步驟-內文取得

經過了好幾步驟的層層分析,乙女解剖後
我們終於來到了最後的步驟啦
到底我們要怎麼把td內的資料取出來呢,非常簡單
我們把找出來的屬性標籤後面加上.getText()
就可以取得裡面的數據啦
像是我們上一篇找出了tr tag裡面有許多td tag
我們可以把所有的td tag內的數據取出來,放進一個list
這樣就可以只取出我們要的數據啦

所以這裡,我們需要修改我們的for loop程式碼
改成如下所示:

for i in tr_tag:
    td_tag = i.find_all("td")
    if len(td_tag) == 3 or len(td_tag) == 5:
        inner = []
        for j in td_tag:
            inner.append(j.getText())
        print(inner)

這裡主要修改的就是if condition後的code
假設符合了我們上一篇提到的條件,我們就把所有的td tag內數據取處並存到一個list內
最後我們把他print出來確認結果
於是我們的結果就會變成如下所示

最後,我們再依照網頁上面的格式,把它存成一個dict就好了
三格的部分分配是:['會計項目', '金額', '%']
五格部分分配則是:['會計項目', '金額', '預測金額', '年度財務預測達成率%', '截至第2季止財務預測季達成率%']
由於三格跟五格的做法是不一樣的,所以我們把if condition給拆開個別做處理
這個部分的code我們就不細講了,直接上程式碼

import requests
import json
from bs4 import BeautifulSoup
url = 'https://mops.twse.com.tw/mops/web/ajax_t163sb01'
data={
        'co_id': '1201',
        'queryName': 'co_id',
        'inputType': 'co_id',
        'isnew': 'true',
        'TYPEK': 'all',
        'encodeURIComponent': '1',
        'step': '1',
        'firstin': '1',
        'off': '1',
        'year': None,
        'season': None
}
headers = {
    #'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36',
}
res = requests.post(url=url,data=data,headers=headers)
soup = BeautifulSoup(res.text, 'html.parser')
tr_tag = soup.find_all("tr", {"class": ["odd", "even"]})
data_table = {} #公司財務報表
balance_sheet = {} #負債表
income_statement = {} #損益表
for i in tr_tag:
    td_tag = i.find_all("td")
    if len(td_tag) == 3: #三個td tag代表為負債表資料
        inner = []
        for j in td_tag:
            inner.append(j.getText())
        balance_sheet[inner[0]] = {'金額': inner[1], '百分比': inner[2]}
    if len(td_tag) == 5: #五個td tag代表為損益表資料
        inner = []
        for j in td_tag:
            inner.append(j.getText())
        income_statement[inner[0]] = {'金額': inner[1], '預測金額': inner[2], '年度財務預測達成率': inner[3], '截至第2季止財務預測季達成率': inner[4]}
data_table['公司代號'] = 1201
data_table['負債表'] = balance_sheet
data_table['損益表'] = income_statement
print("公司代號: {}".format(data_table['公司代號'])) #format內的大括弧代表輸入變數
print("負債表:")
for i in data_table['負債表']:
	print("{} {}".format(i, data_table['負債表'][i]))
print("損益表:")
for i in data_table['損益表']:
	print("{} {}".format(i, data_table['損益表'][i]))

好的一定有人會問,啊你dict key用中文可以喔
當然可以,這就是python的厲害之處
不過接下來上vagrant或aws時可能要調整一下環境,之後我們會再詳細講解
一樣我們執行看一下結果

這樣我們就把資料完美的撈出來啦~

好的,我們這碗美麗的餐前濃湯經過了四篇總算是喝完了
下一篇我們將會進入全新的章節-django
想知道django是做啥的,跟jungle到底有沒有關係
咱們下回分解~


上一篇
[Day 6] 餐前濃湯 pt.3-BeautifulSoup,第二型態
下一篇
[Day 8] 第一主餐-django說明及環境安裝
系列文
BeautifulSoup網頁爬蟲佐Django伺服器框架附AWS雲端運算服務30

尚未有邦友留言

立即登入留言