Py / Python網頁資料擷取與分析班-筆記 9/6

主要內容

_下載台銀匯率與格式化輸出、輸出儲存成CSV檔

_反反爬蟲加上headers參數偽裝瀏覽器


1.下載台銀匯率與格式化輸出、輸出儲存成CSV檔

資料來源:台灣銀行牌告匯率

老師的範例是透過個別的class取得資料

但是class是可以共用的,所以要找出順序的規則

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import requests
from bs4 import BeautifulSoup

html = requests.get("https://rate.bot.com.tw/xrt?Lang=zh-TW")
html.encoding="utf-8"

sp = BeautifulSoup(html.text, "html.parser")
data_name=sp.find_all("div","hidden-phone print_show")
data1 = sp.find_all("td","rate-content-cash text-right print_hide")
data2 = sp.find_all("td","rate-content-sight text-right print_hide")
print("幣別,現金買入,現金賣出,即期買入,即期賣出")
s="幣別,現金買入,現金賣出,即期買入,即期賣出\n"
for i in range(0,len(data_name)):
    print(data_name[i].text.strip()+","+data1[i*2].text+","
          +data1[i*2+1].text+","+data2[i*2].text.strip()+","
          +data2[i*2+1].text.strip())
    s+="{},{},{},{},{}\n".format(data_name[i].text.strip(),
                                 data1[i*2].text,data1[i*2+1].text,
                                 data2[i*2].text.strip(),
                                 data2[i*2+1].text.strip())
print(s)
# f=open("rate.csv","w")
# f.write(s)
# f.close()

 

我的取得方式

因為資料是寫在table裡的每一列(tr)裡的儲存格(td)

所以找出表格裡的tr所在,再取出td的資料即可

然後除了寫入csv檔之外,也寫入excel檔

需要留意的部分是第一個td裡面還有div

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import requests
from bs4 import BeautifulSoup

html = requests.get("https://rate.bot.com.tw/xrt?Lang=zh-TW")
html.encoding="utf-8"

sp = BeautifulSoup(html.text, "html.parser")
# print(len(sp.find("tbody").find_all("tr")))
# print(sp.find("tbody").find_all("tr")[0].find_all("td")[0].find("div","visible-phone print_hide").text.strip())
# print(sp.find("tbody").find_all("tr")[0].find_all("td")[1].text.strip())
# print(sp.find("tbody").find_all("tr")[0].find_all("td")[2].text.strip())
# print(sp.find("tbody").find_all("tr")[0].find_all("td")[3].text.strip())
# print(sp.find("tbody").find_all("tr")[0].find_all("td")[4].text.strip())

s="幣別,現金買入,現金賣出,即期買入,即期賣出\n"
data=[]
cols=["幣別","現金買入","現金賣出","即期買入","即期賣出"]
index=[]

for i in range(0,len(sp.find("tbody").find_all("tr"))):
    d1=sp.find("tbody").find_all("tr")[i].find_all("td")[0].find("div","visible-phone print_hide").text.strip()
    d2=sp.find("tbody").find_all("tr")[i].find_all("td")[1].text.strip()
    d3=sp.find("tbody").find_all("tr")[i].find_all("td")[2].text.strip()
    d4=sp.find("tbody").find_all("tr")[i].find_all("td")[3].text.strip()
    d5=sp.find("tbody").find_all("tr")[i].find_all("td")[4].text.strip()
    print(d1,d2,d3,d4,d5)
    s+="{},{},{},{},{}\n".format(d1,d2,d3,d4,d5)
    data.append([d1,d2,d3,d4,d5])
    index.append(i+1)

f=open("rate_0905-21.csv","w")
f.write(s)
f.close()

import pandas as pd

df = pd.DataFrame(data,index,cols)
print(df)
df.to_excel("rate_0905-21.xlsx")

 

2.反反爬蟲加上headers參數偽裝瀏覽器

有的網站會透過檢查request裡的headers,來判斷是否為瀏覽器

因此,可以在request時,設定headers的”user-agent”資料

headers = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36"}
html = requests.get("https://www.google.com.tw/search?q="+x,headers=headers)