激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語言編程技術(shù)及教程分享平臺!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - python 調(diào)用API接口 獲取和解析 Json數(shù)據(jù)

python 調(diào)用API接口 獲取和解析 Json數(shù)據(jù)

2020-09-29 00:22蝦米堡 Python

這篇文章主要介紹了python 如何調(diào)用API接口 獲取和解析 Json數(shù)據(jù),幫助大家更好的理解和使用python,感興趣的朋友可以了解下

任務(wù)背景:

調(diào)用API接口數(shù)據(jù),抽取我們所需類型的數(shù)據(jù),并寫入指定mysql數(shù)據(jù)庫。

先從宏觀上看這個任務(wù),并對任務(wù)進行分解:

step1:需要學(xué)習python下的通過url讀取數(shù)據(jù)的方式;

step2:數(shù)據(jù)解析,也是核心部分,數(shù)據(jù)格式從python角度去理解,是字典?列表?還是各種嵌套?

step3:連接mysql數(shù)據(jù)庫,將數(shù)據(jù)寫入。

從功能上看,該數(shù)據(jù)獲取程序可以分為3個方法,即step1對應(yīng)方法request_data(),step2對應(yīng)方法parse_data(),step3對應(yīng)data_to_db()。

第一輪,暫不考慮異常,只考慮正常狀態(tài)下的功能實現(xiàn)。

1、先看request_data():

?
1
2
3
4
5
import requests
def request_data(url):
req = requests.get(url, timeout=30) # 請求連接
req_jason = req.json() # 獲取數(shù)據(jù)
return req_jason

入?yún)ⅲ簎rl地址;return:獲取到的數(shù)據(jù)。

2、然后看parse_data():

不同的API接口下的數(shù)據(jù)格式各不相同,需要先理清,打開之后密密麻麻一大串,有的可能連完整的一輪數(shù)據(jù)間隔在哪都不知道,這時候可以巧用符號{ [ , ] }輔助判斷。

梳理之后,發(fā)現(xiàn)本接口下的數(shù)據(jù)格式為,最外層為字典,我們所需的數(shù)據(jù)在第一個key“data”下,data對應(yīng)的value為列表,列表中的每個元素為字典,字典中的部分鍵值

即為我們需要的內(nèi)容。這樣,就明確了我們的數(shù)據(jù)結(jié)構(gòu)為字典套列表,列表再套字典的格式,最后一層的字典還存在一鍵多值(比如“weather”)的情況。

當然,還有懶人方法,就是百度json在線解析格式化。

摘取部分數(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"}

?
1
2
3
4
5
6
7
8
9
def parse_data(req_jason):
 data_trunk = req_jason['data']# 獲取data鍵值下的列表
 time_now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") #獲取當前時刻
 for i in range(len(data_trunk)):
  data_unit = data_trunk[i] # 依次獲取列表下第i個元素即字典
  del data_unit['weather'] # 刪除該字典中不需要的一鍵多值的key和value,不刪除的話會影響后續(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ù)的當前時間,并且需要放在dataframe的第一列

備注:數(shù)據(jù)插入數(shù)據(jù)庫,有兩種方式,一種是采用insert的sql語句,采用字典的形式插入,另一種是采用dataframe的方式,采用pandas中的to_sql方法。本案例選擇了后者,所以在數(shù)據(jù)解析時,將字典數(shù)據(jù)轉(zhuǎn)成dataframe格式。

入?yún)ⅲ韩@取到的數(shù)據(jù);return值:無

運行以后,發(fā)現(xiàn)這樣的程序存在一些問題:就是這個for循環(huán)括起來的過多,導(dǎo)致寫數(shù)據(jù)庫時是一條條寫入而不是一整塊寫入,會影響程序效率,所以需要對程序進行如下修改:

?
1
2
3
4
5
6
7
8
9
10
def parse_data(req_jason):
 data_trunk = req_jason['data']# 獲取data鍵值下的列表
 time_now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") #獲取當前時刻
 for i in range(len(data_trunk)):
  data_unit = data_trunk[i] # 依次獲取列表下第i個元素即字典
  del data_unit['weather'] # 刪除該字典中不需要的一鍵多值的key和value,不刪除的話會影響后續(xù)的dataframe轉(zhuǎn)換,但是,如果該鍵值需要的話,需要采取其他處理方式
 df = pd.DataFrame(data_trunk) # 將刪除鍵值后的整個列表套字典轉(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ù)的當前時間,并且需要放在dataframe的第一列

也就是從第7行之后跳出循環(huán);

如果覺得for循環(huán)影響整體美觀,也可以用map代替,將代碼第4/5/6行改為如下代碼,不過性能上來說可能還是for循環(huán)更好,具體對比可看其他博主的測試,或者自己測試下運行時間。

?
1
map(data_trunk.pop, ['weather'])

3. 最后就是data_to_sql():

?
1
2
3
4
5
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ù)。

當當當,正常部分已完成,就下來就需要想象各種異常以及處理對策。

第二輪,想象各種異常以及異常的記錄與處理對策。

1.讀取url后,獲取不到數(shù)據(jù) → 休息幾秒,嘗試再次重連獲取

2.連接數(shù)據(jù)庫異常 → 數(shù)據(jù)庫可能關(guān)閉,嘗試重新ping,

3.寫入數(shù)據(jù)庫的內(nèi)容為空 → 記錄異常,放棄入庫

第三輪,讓程序定時跑起來。

方法一:在代碼中采用apscheduler下的cron功能(trigger='cron‘,類似linux下的crontab)實現(xiàn)定時運行(當然,apscheduler還有另一種trigger=‘interval'模式);

方法二:在linux下的crontab增加定時任務(wù)。

具體可以看別的帖子。

以上就是python 調(diào)用API接口 獲取和解析 Json數(shù)據(jù)的詳細內(nèi)容,更多關(guān)于python 解析數(shù)據(jù)的資料請關(guān)注服務(wù)器之家其它相關(guān)文章!

原文鏈接:https://www.cnblogs.com/xiamibao/p/13589798.html

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 久久久久久久久久久久网站 | 欧美日韩精品一区二区三区在线观看 | 国av在线 | 7777欧美 | 国产午夜精品久久久久久久蜜臀 | 一区二区三区视频在线观看 | 国产精品视频久久久 | 中文字幕网址 | 九九黄色| 91九色蝌蚪国产 | 国产成人强伦免费视频网站 | 日韩视频精品 | 日本高清无遮挡 | 免费看成年人网站 | 国产电影av在线 | 国产人成精品综合欧美成人 | 久久黄色影院 | av在线收看 | 国产一区二区三区四区五区精品 | 国产精品爱久久久久久久 | 久草手机视频在线观看 | 国产深夜福利视频在线播放 | 久久久久亚洲精品 | 国产精品99久久99久久久二 | 91短视频在线免费观看 | gril hd| 欧美日韩精品一区二区三区蜜桃 | 97久久人人超碰caoprom | 欧美18videos性处按摩 | www.com超碰| 玩偶姐姐在线观看免费 | 日韩一级电影在线观看 | 日韩在线观看免费 | 狠狠干夜夜操 | 久久久久久久爱 | 香蕉成人在线视频 | 视频一区二区中文字幕 | 日本一区二区高清不卡 | 天堂精品在线 | 日本人乱人乱亲乱色视频观看 | 看毛片电影 |