python 調(diào)用API接口 獲取和解析 Json數(shù)據(jù)
任務(wù)背景:
調(diào)用API接口數(shù)據(jù),抽取我們所需類型的數(shù)據(jù),并寫入指定mysql數(shù)據(jù)庫。
先從宏觀上看這個(gè)任務(wù),并對(duì)任務(wù)進(jìn)行分解:
step1:需要學(xué)習(xí)python下的通過url讀取數(shù)據(jù)的方式;
step2:數(shù)據(jù)解析,也是核心部分,數(shù)據(jù)格式從python角度去理解,是字典?列表?還是各種嵌套?
step3:連接mysql數(shù)據(jù)庫,將數(shù)據(jù)寫入。
從功能上看,該數(shù)據(jù)獲取程序可以分為3個(gè)方法,即step1對(duì)應(yīng)方法request_data(),step2對(duì)應(yīng)方法parse_data(),step3對(duì)應(yīng)data_to_db()。
第一輪,暫不考慮異常,只考慮正常狀態(tài)下的功能實(shí)現(xiàn)。
1、先看request_data():
import requests def request_data(url): req = requests.get(url, timeout=30) # 請(qǐng)求連接 req_jason = req.json() # 獲取數(shù)據(jù) return req_jason
入?yún)ⅲ簎rl地址;return:獲取到的數(shù)據(jù)。
2、然后看parse_data():
不同的API接口下的數(shù)據(jù)格式各不相同,需要先理清,打開之后密密麻麻一大串,有的可能連完整的一輪數(shù)據(jù)間隔在哪都不知道,這時(shí)候可以巧用符號(hào){ [ , ] }輔助判斷。
梳理之后,發(fā)現(xiàn)本接口下的數(shù)據(jù)格式為,最外層為字典,我們所需的數(shù)據(jù)在第一個(gè)key“data”下,data對(duì)應(yīng)的value為列表,列表中的每個(gè)元素為字典,字典中的部分鍵值
即為我們需要的內(nèi)容。這樣,就明確了我們的數(shù)據(jù)結(jié)構(gòu)為字典套列表,列表再套字典的格式,最后一層的字典還存在一鍵多值(比如“weather”)的情況。
當(dāng)然,還有懶人方法,就是百度json在線解析格式化。
摘取部分?jǐn)?shù)據(jù)如下:{'data':[{'timestamp_utc':'2020-08-31T08:00:00','weather':{'icon':'c02d','code':802,wind_dir':336,'clouds_hi':0,'precip':0.0625},{'timestamp_utc':'2020-08-31T08:00:00','weather':{'icon':'c02d','code':802,},wind_dir':336,'clouds_hi':0,'precip':0.0625],'city_name':'Dianbu','lon':117.58,'timezone':'Asia/Shanghai','lat':31.95,'country_code':'CN'}
def parse_data(req_jason): data_trunk = req_jason[’data’]# 獲取data鍵值下的列表 time_now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') #獲取當(dāng)前時(shí)刻 for i in range(len(data_trunk)): data_unit = data_trunk[i] # 依次獲取列表下第i個(gè)元素即字典 del data_unit[’weather’] # 刪除該字典中不需要的一鍵多值的key和value,不刪除的話會(huì)影響后續(xù)的dataframe轉(zhuǎn)換,但是,如果該鍵值需要的話,需要采取其他處理方式 df = pd.DataFrame([data_unit]) # 將刪除鍵值后的字典轉(zhuǎn)為datafrme list_need = [’timestamp_utc’, ’wind_dir’, ’precip’,’clouds_hi’] # 列出我們需要的列 df_need = df[list_need] # 保留df中需要的列 10 df_need.insert(0, ’update_time’, time_now) #表格中還需額外增加獲取數(shù)據(jù)的當(dāng)前時(shí)間,并且需要放在dataframe的第一列
備注:數(shù)據(jù)插入數(shù)據(jù)庫,有兩種方式,一種是采用insert的sql語句,采用字典的形式插入,另一種是采用dataframe的方式,采用pandas中的to_sql方法。本案例選擇了后者,所以在數(shù)據(jù)解析時(shí),將字典數(shù)據(jù)轉(zhuǎn)成dataframe格式。
入?yún)ⅲ韩@取到的數(shù)據(jù);return值:無
運(yùn)行以后,發(fā)現(xiàn)這樣的程序存在一些問題:就是這個(gè)for循環(huán)括起來的過多,導(dǎo)致寫數(shù)據(jù)庫時(shí)是一條條寫入而不是一整塊寫入,會(huì)影響程序效率,所以需要對(duì)程序進(jìn)行如下修改:
def parse_data(req_jason): data_trunk = req_jason[’data’]# 獲取data鍵值下的列表 time_now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') #獲取當(dāng)前時(shí)刻 for i in range(len(data_trunk)): data_unit = data_trunk[i] # 依次獲取列表下第i個(gè)元素即字典 del data_unit[’weather’] # 刪除該字典中不需要的一鍵多值的key和value,不刪除的話會(huì)影響后續(xù)的dataframe轉(zhuǎn)換,但是,如果該鍵值需要的話,需要采取其他處理方式 df = pd.DataFrame(data_trunk) # 將刪除鍵值后的整個(gè)列表套字典轉(zhuǎn)為datafrme list_need = [’timestamp_utc’, ’wind_dir’, ’precip’,’clouds_hi’] # 列出我們需要的列 df_need = df[list_need] # 保留df中需要的列 df_need.insert(0, ’update_time’, time_now) #表格中還需額外增加獲取數(shù)據(jù)的當(dāng)前時(shí)間,并且需要放在dataframe的第一列
也就是從第7行之后跳出循環(huán);
如果覺得for循環(huán)影響整體美觀,也可以用map代替,將代碼第4/5/6行改為如下代碼,不過性能上來說可能還是for循環(huán)更好,具體對(duì)比可看其他博主的測(cè)試,或者自己測(cè)試下運(yùn)行時(shí)間。
map(data_trunk.pop, [’weather’])
3. 最后就是data_to_sql():
def data_to_sql(df): table = ’request_data_api’ engine = create_engine('mysql+pymysql://' + ’root’ + ':' + ’123’ + '@' + ’localhost’ + ':' + ’3306’ + '/' + ’test’ + '?charset=utf8') df.to_sql(name=table, con=engine, if_exists=’append’, index=False, index_label=False)
入?yún)ⅲ篸ataframe類型數(shù)據(jù)。
當(dāng)當(dāng)當(dāng),正常部分已完成,就下來就需要想象各種異常以及處理對(duì)策。
第二輪,想象各種異常以及異常的記錄與處理對(duì)策。
1.讀取url后,獲取不到數(shù)據(jù) → 休息幾秒,嘗試再次重連獲取
2.連接數(shù)據(jù)庫異常 → 數(shù)據(jù)庫可能關(guān)閉,嘗試重新ping,
3.寫入數(shù)據(jù)庫的內(nèi)容為空 → 記錄異常,放棄入庫
第三輪,讓程序定時(shí)跑起來。
方法一:在代碼中采用apscheduler下的cron功能(trigger=’cron‘,類似linux下的crontab)實(shí)現(xiàn)定時(shí)運(yùn)行(當(dāng)然,apscheduler還有另一種trigger=‘interval’模式);
方法二:在linux下的crontab增加定時(shí)任務(wù)。
具體可以看別的帖子。
以上就是python 調(diào)用API接口 獲取和解析 Json數(shù)據(jù)的詳細(xì)內(nèi)容,更多關(guān)于python 解析數(shù)據(jù)的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. Jsp中request的3個(gè)基礎(chǔ)實(shí)踐2. Django程序的優(yōu)化技巧3. XML入門的常見問題(一)4. IntelliJ IDEA 統(tǒng)一設(shè)置編碼為utf-8編碼的實(shí)現(xiàn)5. jsp EL表達(dá)式詳解6. Django ORM實(shí)現(xiàn)按天獲取數(shù)據(jù)去重求和例子7. chat.asp聊天程序的編寫方法8. Python多線程操作之互斥鎖、遞歸鎖、信號(hào)量、事件實(shí)例詳解9. idea設(shè)置自動(dòng)導(dǎo)入依賴的方法步驟10. 怎樣才能用js生成xmldom對(duì)象,并且在firefox中也實(shí)現(xiàn)xml數(shù)據(jù)島?
