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