本文的文字及圖片來源于網路,僅供學習、交流使用,不具有任何商業用途,著作權歸原作者所有,如有問題請及時聯系我們以作處理,
以上文章來源于小鵬友的資料分析之路,作者 小鵬友
網址:https://chl.cn/?lishi
界面:
可以看出,網站上有2006至今的歷史匯率資料,點擊進“2020-9-30”入下個界面:
進入新的網頁后,可以看到本人需要的爬取的資料:人民幣兌美元匯率(其它匯率留給大家自主爬取),
對比兩個時間(2020-9-30和2020-9-29)的網頁url,發現只有id不同,而且只差1,說明可以根據id號遞增來回圈爬取不同日期的匯率,
https://chl.cn/?id=7511 #2020-9-29https://chl.cn/?id=7512 #2020-9-30
接下來,決議人民幣兌美元匯率(中間價)的原始碼:
第一,在chrome打開該網址,選擇一個日期點擊進入,然后按F12,滑鼠點擊右上角的箭頭,再把箭頭移動到需要爬取的匯率上,觀察右邊的原始碼,滑鼠再次移動到對應的原始碼上,右鍵->edit as HTML,就可以看到具體的原始碼了,
第二,可以用re庫,正則匹配出需要的內容:
https://chl.cn/?id=7511 #2020-9-29
https://chl.cn/?id=7512 #2020-9-30
上述代碼匹配到的內容如下(以2020-9-30為例),可以看出,美元匯率存放在list[0]中(其它部分匯率也可以匹配得到),
用以下代碼可以進一步匹配到2020-9-30的美元匯率6.8101
最后,就是實實在在地敲代碼去爬了,如果爬取2016年至今每天的匯率資料,時間會有點久,所以本文就只爬取了2019年5月6日(即id=5001)至今的匯率資料,效果如下:
全部代碼:
import pandas as pd import numpy as np import requests import re import time import datetime def CHNtime2strtime(CHNtime): ''' 功能:中文時間轉字串時間 傳入:一個中文時間,如“2020年9月30號” 回傳:字串時間,如“2020-9-30” ''' CHNtime_list = re.findall(r'[\u4e00-\u9fa5]+',CHNtime) for i in CHNtime_list: if i != '日': CHNtime = CHNtime.replace(str(i),'-') else: CHNtime = CHNtime.replace(str(i),'') return CHNtime def diff_days(str_time): ''' 功能:計算過去某天時間與今天的天數差,比如“2020-9-29”距離今天(2020-9-30)相差1天 傳入:一字串時間,如“2020-9-30” 回傳:天數差(數值型) ''' date_time = datetime.datetime.strptime(str_time,'%Y-%m-%d') now_time = datetime.datetime.now() diff_time = now_time - date_time days = diff_time.days return days t = [] # 時間 dollar = [] # 美元 i = 5000 # 本文從id=5001(即2019-5-6)開始爬取 while True: # 設定死回圈 i += 1 # 回圈一次,id+1 # 請求頭 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; \ Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36' } # 網址 url = 'https://chl.cn/?id={}'.format(str(i)) # 請求回應 r = requests.get(url,headers=headers) r.encoding = "utf-8" s = r.text try: #設定拋出例外,因為有些id,如id=7001,網頁就不存在 rate_list = re.findall(r'<td><a href="https://www.cnblogs.com/hhh188764/archive/2020/10/09/.*?">(.*?)</a>/人民幣</td><td>(.*?)</td>',s) tt = re.findall(r'<h1>(.*?)匯率</h1>',s)[0] #日期 strtime = CHNtime2strtime(tt) #中文時間轉字串時間 t.append(datetime.datetime.strptime(strtime,'%Y-%m-%d')) dollar.append(rate_list[0][1]) #美元 days = diff_days(strtime) # 計算天數差 print(tt,'爬取成功!') print('當天距離現在相差:',days,'天') if days == 0: #死回圈終止條件:天數差為0時,即代表爬取到今天 break except: # 如果爬取的url不存在,那么時間與匯率就用控制代替 t.append(np.nan) dollar.append(np.nan) print('id = ',i,' ',np.nan) time.sleep(0.2) #為了防止爬取的速度過快,設定睡眠時間為0.2s df = pd.DataFrame() # 生產一個DataFrame用來存放資料 df['time'] = t df['人民幣兌美元匯率'] = dollar df.dropna(inplace=True) # 將缺失值刪去 df.to_excel('歷史人民幣兌美元匯率.xlsx',index=False) #在目前檔案夾上生成excel檔案 print('歷史人民幣兌美元匯率.xlsx 檔案生成成功!')
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/164778.html
標籤:其他
上一篇:C 和 C++ 打起來了!曾今最親密的伙伴到現今的不爽?
下一篇:咕咕咕
