1. 程式人生 > >使用BeautifulSoup爬取外匯資料及用法整理

使用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對應內容