使用BeautifulSoup爬取外匯資料及用法整理
# -*- coding: utf-8 -*-
import requests
import pandas as pd
from bs4 import BeautifulSoup
#from lxml import etree
#import time
#from time import sleep
url = 'http://quote.fx678.com/exchange/WH'
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36' }
response=requests.get(url,headers=headers)
soup=BeautifulSoup(response.content)
item_list=soup.find_all('td')#找到網頁表格中的所有內容
num=len(item_list)
print(num)
352
names=[] #存放外匯產品的名稱
price_new=[] #外匯產品的最新價格
price_change=[] #外匯產品漲跌值
price_percentage=[] #外匯產品的漲跌幅度
price_high=[] #外匯產品當日最高價
price_low=[] #外匯產品當日最低價
price_yesterday=[] #外匯產品昨日收盤價
time_update=[] #更新時間
for i in range(0,num,8):#從0位置開始,每隔7個位置就是產品名稱
names.append(item_list[i].text)
for i in range(1,num,8):#從1位置開始,每隔7個位置就是產品j價格
price_new.append(item_list[i].text)
for i in range(2,num,8):#從2位置開始,每隔7個位置就是產品漲跌值
price_change.append(item_list[i].text)
for i in range(3,num,8):#從3位置開始,每隔7個位置就是產品漲跌幅度
price_percentage.append(item_list[i].text)
for i in range(4,num,8):#從4位置開始,每隔7個位置就是產品當日最高價
price_high.append(item_list[i].text)
for i in range(5,num,8):#從5位置開始,每隔7個位置就是產品當日最低價
price_low.append(item_list[i].text)
for i in range(6,num,8):#從6位置開始,每隔7個位置就是產品昨日收盤時價
price_yesterday.append(item_list[i].text)
for i in range(7,num,8):#從7位置開始,每隔7個位置就是產品價格更新時間
time_update.append(item_list[i].text)
item_dict={'names':names,'price_new':price_new,'price_change':price_change,'price_percentage':price_percentage,'price_high':price_high,\
'price_low':price_low,'price_yesterday':price_yesterday,'time_update':time_update}
df=pd.DataFrame(item_dict)
df
.dataframe thead tr:only-child th {
text-align: right;
}
.dataframe thead th {
text-align: left;
}
.dataframe tbody tr th {
vertical-align: top;
}
names | price_change | price_high | price_low | price_new | price_percentage | price_yesterday | time_update | |
---|---|---|---|---|---|---|---|---|
0 | 美元指數 | -0.25 | 91.33 | 90.95 | 91.01 | -0.27% | 91.26 | 21:00:51 |
1 | 歐元美元 | 0.0040 | 1.2210 | 1.2146 | 1.2201 | 0.33% | 1.2161 | 21:00:51 |
2 | 英鎊美元 | 0.0050 | 1.3992 | 1.3895 | 1.3982 | 0.36% | 1.3932 | 21:00:50 |
3 | 美元日元 | -0.28 | 109.47 | 109.10 | 109.15 | -0.26% | 109.43 | 21:00:51 |
4 | 澳元美元 | 0.0013 | 0.7584 | 0.7557 | 0.7578 | 0.17% | 0.7565 | 21:00:51 |
5 | 美元瑞郎 | -0.0010 | 0.9849 | 0.9817 | 0.9823 | -0.10% | 0.9833 | 21:00:50 |
6 | 美元加元 | -0.0013 | 1.2871 | 1.2821 | 1.2831 | -0.10% | 1.2844 | 21:00:51 |
7 | 美元港元 | 0.0011 | 7.8483 | 7.8460 | 7.8473 | 0.01% | 7.8462 | 21:00:51 |
8 | 美元在岸人民幣 | -0.0056 | 6.3369 | 6.3185 | 6.3210 | -0.09% | 6.3266 | 21:00:08 |
9 | 美元離岸人民幣 | -0.0125 | 6.3315 | 6.3083 | 6.3098 | -0.20% | 6.3223 | 21:00:51 |
10 | 紐元加元 | 0.0012 | 0.9093 | 0.9061 | 0.9090 | 0.13% | 0.9078 | 21:00:51 |
11 | 歐元紐元 | 0.0016 | 1.7258 | 1.7178 | 1.7222 | 0.09% | 1.7206 | 21:00:51 |
12 | 澳元日元 | -0.06 | 82.92 | 82.61 | 82.72 | -0.07% | 82.78 | 21:00:51 |
13 | 澳元紐元 | -0.0004 | 1.0729 | 1.0694 | 1.0697 | -0.04% | 1.0701 | 21:00:51 |
14 | 澳元加元 | 0.0007 | 0.9733 | 0.9711 | 0.9723 | 0.07% | 0.9716 | 21:00:51 |
15 | 瑞郎日元 | -0.15 | 111.39 | 110.88 | 111.14 | -0.14% | 111.29 | 21:00:51 |
16 | 澳元瑞郎 | 0.0006 | 0.7458 | 0.7435 | 0.7444 | 0.08% | 0.7438 | 21:00:51 |
17 | 英鎊加元 | 0.0047 | 1.7953 | 1.7860 | 1.7941 | 0.26% | 1.7894 | 21:00:51 |
18 | 歐元英鎊 | -0.0004 | 0.8751 | 0.8697 | 0.8726 | -0.05% | 0.8730 | 21:00:51 |
19 | 加元瑞郎 | 0.0000 | 0.7673 | 0.7650 | 0.7656 | 0.00% | 0.7656 | 21:00:51 |
20 | 英鎊日元 | 0.19 | 152.73 | 151.98 | 152.64 | 0.12% | 152.45 | 21:00:51 |
21 | 歐元日元 | 0.12 | 133.25 | 132.69 | 133.19 | 0.09% | 133.07 | 21:00:51 |
22 | 歐元瑞郎 | 0.0027 | 1.1989 | 1.1957 | 1.1984 | 0.23% | 1.1957 | 21:00:51 |
23 | 紐元日元 | -0.01 | 77.44 | 77.15 | 77.33 | -0.01% | 77.34 | 21:00:51 |
24 | 英鎊瑞郎 | 0.0038 | 1.3761 | 1.3684 | 1.3735 | 0.28% | 1.3697 | 21:00:51 |
25 | 紐元瑞郎 | 0.0010 | 0.6967 | 0.6934 | 0.6959 | 0.14% | 0.6949 | 21:00:51 |
26 | 加元日元 | -0.12 | 85.31 | 85.01 | 85.08 | -0.14% | 85.19 | 21:00:51 |
27 | 英鎊澳元 | 0.0036 | 1.8473 | 1.8384 | 1.8451 | 0.20% | 1.8415 | 21:00:51 |
28 | 歐元澳元 | 0.0024 | 1.6111 | 1.6058 | 1.6100 | 0.15% | 1.6076 | 21:00:51 |
29 | 英鎊紐元 | 0.0027 | 1.9759 | 1.9690 | 1.9737 | 0.14% | 1.9710 | 21:00:51 |
30 | 歐元加元 | 0.0035 | 1.5656 | 1.5602 | 1.5655 | 0.22% | 1.5620 | 21:00:51 |
31 | 美元波蘭茲羅提 | 0.0027 | 3.7395 | 3.7329 | 3.7361 | 0.07% | 3.7334 | 13:32:43 |
32 | 美元墨西哥比索 | -0.053 | 18.894 | 18.773 | 18.794 | -0.28% | 18.847 | 21:00:51 |
33 | 美元匈牙利福林 | 0.41 | 275.76 | 275.29 | 275.72 | 0.15% | 275.31 | 13:32:43 |
34 | 美元土耳其里拉 | -0.0203 | 4.0884 | 4.0580 | 4.0613 | -0.50% | 4.0816 | 21:00:51 |
35 | 美元南非蘭特 | -0.076 | 12.466 | 12.354 | 12.364 | -0.61% | 12.440 | 21:00:50 |
36 | 美元捷克朗 | 0.027 | 23.706 | 23.666 | 23.695 | 0.11% | 23.668 | 13:32:44 |
37 | 美元丹麥克朗 | -0.0195 | 6.1339 | 6.1020 | 6.1062 | -0.32% | 6.1257 | 21:00:51 |
38 | 美元挪威 | -0.0338 | 7.9927 | 7.9335 | 7.9391 | -0.42% | 7.9729 | 21:00:51 |
39 | 美元盧布 | 0.152 | 63.034 | 62.138 | 62.569 | 0.24% | 62.417 | 21:00:51 |
40 | 美元瑞典 | 0.0137 | 8.6205 | 8.5348 | 8.5787 | 0.16% | 8.5650 | 21:00:51 |
41 | 美元新幣 | -0.0035 | 1.3291 | 1.3248 | 1.3254 | -0.26% | 1.3289 | 21:00:51 |
42 | 紐幣美元 | 0.0016 | 0.7088 | 0.7056 | 0.7085 | 0.23% | 0.7069 | 21:00:51 |
43 | 比特幣美元 | 8.77 | 4153.62 | 4019.65 | 4081.77 | 0.22% | 4073.00 | 13:38:42 |
soup.find_all()方法介紹 ,soup.find()與之基本類似,只是返回的是第一個值
find_all( name , attrs , recursive , text , **kwargs )
soup.find_all(‘b’) #查詢所有的b標籤,返回列表
soup.find_all(re.compile(“^b”)) # 正則表示式
soup.find_all([“a”, “b”]) #傳入列表引數,找到所有的a標籤和b標籤
soup.find_all(id=’link2’) #傳入id是link2的引數,Beautiful Soup會搜尋每個tag的”id”屬性
soup.find_all(href=re.compile(“elsie”)) #傳入正則表示式,查詢所有的href標籤內容中含有 elsie 的內容
soup.find_all(href=re.compile(“elsie”), id=’link1’) # 多層過濾,除了href進行限定之外,對id標籤的內容也做了限定
soup.find_all(“div”, class_=”sister”) #最常用的查詢技巧,這裡之所以加‘_=’是因為‘class’不僅是html中的tag,也是python語法的關鍵詞,其他的不用加下劃線
data_soup.find_all(attrs={“data-foo”: “value”}) # 針對html5裡面的data- 進行的專項查詢
soup.find_all(text=”Elsie”) # 對text內容進行查詢
soup.find_all(text=[“Tillie”, “Elsie”, “Lacie”]) # 列表形式進行查詢,與上面name類似
soup.find_all(text=re.compile(“Dormouse”)) # 正則表示式形式,與上面類似
soup.find_all(“a”, limit=2) # 找到前兩個a標籤, limit用來限定次數
我們在寫 CSS 時,標籤名不加任何修飾,類名前加點,id名前加 #,在這裡我們也可以利用類似的方法來篩選元素,用到的方法是soup.select(),返回型別是list
(1)通過標籤名查詢
soup.select(‘title’)
(2)通過類名查詢
soup.select(‘.sister’)
(3)通過 id 名查詢
soup.select(‘#link1’)
(4)組合查詢
組合查詢即和寫 class 檔案時,標籤名與類名、id名進行的組合原理是一樣的,例如查詢 p 標籤中,id 等於 link1的內容,二者需要用空格分開
soup.select(‘p #link1’)
(5)屬性查詢
查詢時還可以加入屬性元素,屬性需要用中括號括起來,注意屬性和標籤屬於同一節點,所以中間不能加空格,否則會無法匹配到。
soup.select(‘a[class=”sister”]’)
soup.select(‘a[href=”http://example.com/elsie”]’)
get_text()方法可以用來獲取內容,請看下面程式碼:
soup = BeautifulSoup(html.text, ‘lxml’)
print (type(soup.select(‘title’)))
print (soup.select(‘title’)[0].get_text()) # 獲取第一個title標籤的對應內容
for title in soup.select(‘title’):
print (title.get_text()) # 獲取列表中的title對應內容