從行業角度來說,通過一步一步剖析,目標就是簡易,新手入門requests網絡爬蟲及新手入門pandas數據剖析就能完成,文中關鍵為大家介紹Python網絡爬蟲抓取金融衍生品數據庫的經典案例,感興趣的小伙伴一起了解一下吧
哈嘍大家好政胤今日教給大家抓取金融衍生品數據和信息
每日任務介紹
最先,顧客原消費是獲得https://hq.smm.cn/copper網站里的價錢數據和信息(注:獲得的是平臺上的公開數據),如圖所示:
若以此網站為主要目標,就需要解決問題是“登陸”客戶,然后將價錢剖析為報表開展導出就可以。可是,事實上顧客主要目標是獲得“滬銅CU2206”的歷史價格查詢,盡管此網站也是有給出的數據,但需要“VIP”才能夠瀏覽,而VIP必須充錢...
數據的價值!!!
因為,客戶滿意度僅僅只是“滬銅CU2206”一種期貨歷史價格查詢,充錢VIP性價比低,因而,具體的目標和任務變成怎樣獲得的歷史價格查詢,總體目標變成各大網站有發布給出的數據的網站地址。而最終解決此問題,是有求于無所不能的搜索引擎^_^。發現了適宜的網址,且讀取數據難度系數也基本降到最低標準難度系數。
處理流程
1.網頁搜索網絡資源:這一步是所有每日任務完備的最難題(詳細不會太難),但是這里賣個關子,全篇不發布最后尋找網站,大伙兒試一試能不能獲取到,及其耗費多久^_^。
2.解析網站要求,最后尋找網站經剖析后,發覺讀取數據可以通過get的方法遞交主要參數。而要求的主要參數如下所示:/price?starttime=1638545822&endtime=1654357022&classid=48,看了就知有起始時間、截止時間的時間格式,及其商品id。再剖析headers,竟然連cookie都不用,表明并沒有流量劫持!并沒有流量劫持!并沒有流量劫持!不得不承認人品大爆發!
3.剖析回應數據和信息:因為回應信息是整齊的json格式數據和信息,使用pandas的read_json立即可以獲得dataframe格式的信息,該流程也從未有過難度系數。
代碼編寫
#author:zheng yin #contact:1278420339 qq.com """ 1.這是爬取滬銅的程序 2.該網站滬銅當月的數據實際請求地址是:'(實際網址)/price?starttime={starttime}&endtime={endtime}&classid={classid}' 2.1.starttime為起始日期的時間戳 2.2.endtime為結束日期的時間戳 2.3.classid為查詢商品的id 3.該網址可以直接發起請求獲取數據 我是政胤期待你的關注 """ import time from datetime import datetime import pathlib as pl import requests import pandas as pd class Spider: """ 爬取網站數據的爬蟲對象 """ def __init__(self,starttime:str=None,endtime:str=None,classid:int=48): """ 初始化對象屬性 :param starttime:數據的起始日期,文本日期格式,示例2022-1-1 :param endtime:數據的結束日期,文本日期格式,示例2022-1-1 :param classid:商品id,默認48 """ self.classid=classid#商品id self.data=pd.DataFrame()#初始化空dataframe self.data_file=pl.Path('./data/hutong.xlsx')#爬取的數據存儲文件 #列名字典 self.cols_dict={ 'createtime':'日期', 'classid':'商品', 'start':'開盤', 'end':'收盤', 'min':'最低', 'max':'最高', 'move':'漲跌', 'move_percent':'漲跌百分比' } #商品id字典 self.classid_dict={ 48:'CU2206' } #獲取爬取的開始時間與結束時間 self.starttime,self.endtime=self.make_starttime_endtime(starttime=starttime,endtime=endtime) #初始化需要爬取的url self.url='(實際地址)/price?starttime={starttime}&endtime={endtime}&classid={classid}' #初始化headers self.headers={ 'User-Agent':'Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,like Gecko)Chrome/99.0.4844.51 Safari/537.36', 'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'Accept-Encoding':'gzip,deflate,br', 'Accept-Language':'zh-CN,zh;q=0.9', } def make_starttime_endtime(self,starttime:str,endtime:str): """ 制作起始日期,邏輯如下; 1.如果有傳入日期,則根據傳入的日期,定義起始日期與結束日期 2.如果未傳入參數,則根據讀取到的歷史數據文件中的最大日期作為起始日期、以當前日期為結束日期 3.如果未讀取到歷史數據文件,或文件中的最大日期為空,則以2021-1-1作為起始日期,以當前日期作為結束日期 :param starttime:數據的起始日期,文本日期格式,示例2022-1-1 :param endtime:數據的結束日期,文本日期格式,示例2022-1-1 :return: """ self.read_data()#讀取歷史爬取數據 now=datetime.now()#獲取當前時間的時間戳整數部分 if endtime:#如果非空 year,month,day=endtime.split('-') endtime=int(now.replace(year=int(year),month=int(month),day=int(day)).timestamp()) else: endtime=int(now.timestamp()) if starttime: year,month,day=starttime.split('-') starttime=int(now.replace(year=int(year),month=int(month),day=int(day)).timestamp()) else: starttime=self.data['日期'].max() if pd.isnull(starttime):#如果開始日期是空值 starttime=int(now.replace(year=2021,month=1,day=1).timestamp()) else: starttime=int( now.replace(year=starttime.year,month=starttime.month,day=starttime.day).timestamp()) return starttime,endtime def read_data(self): """ 讀取歷史數據 :return: """ if self.data_file.is_file():#如果歷史數據文件存在 self.data=pd.read_excel(self.data_file) self.data['日期']=self.data['日期'].map(lambda x:x.date()) else:#如果歷史數據文件不存在,那么初始化一個只有列名的dataframe, self.data=pd.DataFrame(self.cols_dict.values()).set_index(0).T def crawl_data(self): """ 爬取數據 :return: """ retry_times=0 while retry_times<10:#重試10次 try: res=requests.get( self.url.format(starttime=self.starttime,endtime=self.endtime,classid=self.classid), headers=self.headers,timeout=30) if res.status_code==200:#如果返回狀態至為200,進行后續數據加工 data=pd.read_json(res.text)#json格式轉換為dataframe data['createtime']=data['createtime'].map(lambda x:datetime.fromtimestamp(x).date())#時間戳日期轉換為日期 data.rename(columns=self.cols_dict,inplace=True)#重命名列 data=data[self.cols_dict.values()]#截取需要的列 data['商品']=self.classid_dict.get(self.classid,'未知商品,請維護classid_dict字典')#轉換商品名 data.sort_values(by=['商品','日期'],ascending=True,inplace=True)#按日期升序排序 return data else: retry_times+=1 print(f'返回狀態碼是{res.status_code},等待5秒后重新發起請求') time.sleep(5) except Exception as e: retry_times+=1 print(f'請求發生錯誤,等待5秒后重新發起請求,錯誤信息:{e}') time.sleep(5) print('發起10次請求均未能獲得數據') return pd.DataFrame() def concat_and_write_data(self,data:pd.DataFrame): """ 合并數據,并將數據寫入文件 :param data:傳入需要合并的數據 :return: """ self.data=pd.concat([self.data,data])#合并數據 self.data=self.data.drop_duplicates(['日期','商品'],keep='last')#數據根據商品名稱與日期進行去重,每次保留最新的記錄 if not self.data_file.parent.is_dir():#檢查數據文件的目錄是否存在,如不存在則創建新目錄 self.data_file.parent.mkdir() self.data.to_excel(self.data_file,index=False,encoding='utf-8')#輸出數據為excel格式 def run(self): """ 運行程序 :return: """ data=spider.crawl_data()#運行爬取 if len(data)>0:#如果爬取到的數據不為空 self.concat_and_write_data(data) start=str(datetime.fromtimestamp(self.starttime))[:10] end=str(datetime.fromtimestamp(self.endtime))[:10] print(f'{start}至{end}數據爬取任務完成') def pivot_data(self): """ 將數據轉換為透視表式的格式 :return: """ data=self.data.copy() data['年月']=data['日期'].map(lambda x:f'{str(x)[:7]}') data['日']=data['日期'].map(lambda x:x.day) data=data.pivot_table(values='收盤',index='日',columns='年月',aggfunc='sum') data_mean=data.mean().to_frame().T data_mean.index=['平均值'] data=pd.concat([data,data_mean]) data.to_excel(self.data_file.parent.parent/'data.xlsx',encoding='utf-8') if __name__=='__main__': spider=Spider() spider.run() spider.pivot_data() print(spider.data)
因為網址并沒有流量劫持,且主要參數簡易,事實上任務通常是整體規劃一下下怎樣設計增量同步數據和信息的操作流程,詳細編碼如下所示:
匯總
從行業角度來說,通過一步一步剖析,目標就是簡易,新手入門requests網絡爬蟲及其新手入門pandas數據剖析就能完成(唯一難度系數在找到更好的總體目標)。可是換一個角度,從經濟效益來說,也是非常有用的,即減少了某網站高額的服務年費(注:也不是說服務年費不值,僅僅局限于要求僅僅只是CU2206一種數據和信息處時,性價比高過低),同時也防止了人工控制的繁雜,及其由此產生的不正確。用極小的培訓成本就可以解決極大地難題
綜上所述,這篇文章就給大家解答到這里了,希望可以給大家帶來幫助。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/128853.html
摘要:此外,還有一類行為,只有去中心化兌換協議才能做到。最后,去中心化兌換協議可以立刻自動支持新的代幣。去中心化兌換要求用戶管理自己基金的安全性,而相關工具目前尚不成熟。 原文:https://medium.com/@FEhrsam/w... 今天,去中心化兌換(decentralized exchange)仍處于早期,但是幾年后,它很可能會是區塊鏈生態中不可或缺的一環。 首先,去中心化兌...
摘要:補充說,每一個這類不同的云組件通常都是由單獨的一家公司來維護和部署的,出于競爭的考慮,這些公司往往會盡可能少地披露其服務的內部運營細節。是下周將在波士頓召開的更大范圍的展會的一個分會場。 當云計算越來越成為主流之時,各種嚴重的運營崩潰事故就可能出現,因為在云中,終端用戶和廠商的各種東西都在一起混搭、匹配或捆綁著,這就是一位研究人員所撰寫的一篇新論文的主張,該論文將在下周于美國波士頓召開的U...
閱讀 911·2023-01-14 11:38
閱讀 878·2023-01-14 11:04
閱讀 740·2023-01-14 10:48
閱讀 1982·2023-01-14 10:34
閱讀 942·2023-01-14 10:24
閱讀 819·2023-01-14 10:18
閱讀 499·2023-01-14 10:09
閱讀 572·2023-01-14 10:02