91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python 實現調用API接口 獲取和解析 Json數據

發布時間:2020-10-30 15:13:02 來源:億速云 閱讀:1971 作者:Leah 欄目:開發技術

python 實現調用API接口 獲取和解析 Json數據?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

1、先看request_data():

 import requests
 def request_data(url): 
 req = requests.get(url, timeout=30) # 請求連接
 req_jason = req.json() # 獲取數據
 return req_jason 

入參:url地址;return:獲取到的數據。

2、然后看parse_data():

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

梳理之后,發現本接口下的數據格式為,最外層為字典,我們所需的數據在第一個key“data”下,data對應的value為列表,列表中的每個元素為字典,字典中的部分鍵值

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

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

摘取部分數據如下:{"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") #獲取當前時刻
 for i in range(len(data_trunk)):
  data_unit = data_trunk[i] # 依次獲取列表下第i個元素即字典
  del data_unit['weather'] # 刪除該字典中不需要的一鍵多值的key和value,不刪除的話會影響后續的dataframe轉換,但是,如果該鍵值需要的話,需要采取其他處理方式
  df = pd.DataFrame([data_unit]) # 將刪除鍵值后的字典轉為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) #表格中還需額外增加獲取數據的當前時間,并且需要放在dataframe的第一列

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

入參:獲取到的數據;return值:無

運行以后,發現這樣的程序存在一些問題:就是這個for循環括起來的過多,導致寫數據庫時是一條條寫入而不是一整塊寫入,會影響程序效率,所以需要對程序進行如下修改:

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,不刪除的話會影響后續的dataframe轉換,但是,如果該鍵值需要的話,需要采取其他處理方式
 df = pd.DataFrame(data_trunk) # 將刪除鍵值后的整個列表套字典轉為datafrme
 list_need = ['timestamp_utc', 'wind_dir', 'precip','clouds_hi'] # 列出我們需要的列
 df_need = df[list_need] # 保留df中需要的列
 df_need.insert(0, 'update_time', time_now) #表格中還需額外增加獲取數據的當前時間,并且需要放在dataframe的第一列

也就是從第7行之后跳出循環;

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

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)

入參:dataframe類型數據。

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

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

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

2.連接數據庫異常 → 數據庫可能關閉,嘗試重新ping,

3.寫入數據庫的內容為空 → 記錄異常,放棄入庫

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

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

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

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

漳州市| 马尔康县| 交城县| 兴山县| 农安县| 城步| 龙泉市| 中宁县| 平利县| 徐闻县| 乌拉特后旗| 嘉黎县| 通辽市| 夏邑县| 凤冈县| 克什克腾旗| 郴州市| 建水县| 府谷县| 昌江| 康平县| 营口市| 抚远县| 江安县| 重庆市| 阿尔山市| 庄河市| 阜康市| 福泉市| 建宁县| 藁城市| 张掖市| 新田县| 义乌市| 景泰县| 安仁县| 湾仔区| 莱州市| 祥云县| 育儿| 阿巴嘎旗|