欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python如何實(shí)現(xiàn)API的調(diào)用詳解

 更新時(shí)間:2022年05月17日 10:52:35   作者:張峰π_π  
Web?API是網(wǎng)站的一部分,用于與使用非常具體的URL請(qǐng)求特定信息的程序交互,下面這篇文章主要給大家介紹了關(guān)于python實(shí)現(xiàn)API的快速調(diào)用指南,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

在日常工作中,可能需要結(jié)合網(wǎng)上現(xiàn)在的一些API或者公司提供的數(shù)據(jù)接口來(lái)得到相應(yīng)的數(shù)據(jù)或者實(shí)現(xiàn)對(duì)應(yīng)的功能。

因此API的調(diào)用和數(shù)據(jù)接口的訪問(wèn)都是做數(shù)據(jù)分析的一個(gè)常用操作,如何快速實(shí)現(xiàn)API和數(shù)據(jù)接口的調(diào)用,網(wǎng)上一般提供很多語(yǔ)言版本,但追根溯源采取的方式都是利用HTTP請(qǐng)求的方式來(lái)進(jìn)行實(shí)現(xiàn)的。由于本人常用Python,本篇文章也主要采用Python來(lái)作為工具來(lái)進(jìn)行介紹如何操作。

API

API:簡(jiǎn)單來(lái)說(shuō)就是一組協(xié)議、一個(gè)工具或者一組規(guī)則,定義不同應(yīng)用程序之間的通信方法,把具體實(shí)現(xiàn)的過(guò)程隱藏起來(lái),只暴露必須調(diào)用的部分給開(kāi)發(fā)者使用。

上面的定義比較官方,這里簡(jiǎn)單舉個(gè)例子來(lái)說(shuō)明一下,比如在現(xiàn)在外面的麥當(dāng)勞等快餐店都采取手機(jī)線上下單,前臺(tái)拿餐的過(guò)程。而在這個(gè)過(guò)程,作為消費(fèi)者通常在手機(jī)上選好對(duì)應(yīng)的餐品然后點(diǎn)擊下單付款,然后等待前臺(tái)叫號(hào)拿餐即可。而這個(gè)過(guò)程具體怎么實(shí)現(xiàn)的我們并不知道,整個(gè)過(guò)程有對(duì)應(yīng)的app或者小程序通信到廚房數(shù)據(jù),然后廚師制作出餐。而這個(gè)APP和小程序就充當(dāng)對(duì)應(yīng)的API功能。

舉一個(gè)簡(jiǎn)單的例子,一個(gè)社交平臺(tái)它每天收到各種語(yǔ)言的評(píng)論信息,而作為對(duì)應(yīng)的分析人員面對(duì)復(fù)雜的語(yǔ)言數(shù)據(jù)處理,是一個(gè)大難題,有人可能說(shuō)開(kāi)發(fā)一個(gè)模型來(lái)實(shí)現(xiàn)翻譯整合功能,這個(gè)方法雖然聽(tīng)起來(lái)可行但是成本代價(jià)高,其次為了解決一個(gè)問(wèn)題,而又去開(kāi)發(fā)一個(gè)比較困難的問(wèn)題。這個(gè)與原本的目標(biāo)偏離越來(lái)越遠(yuǎn),這個(gè)時(shí)候就可以借助國(guó)內(nèi)比較成熟的翻譯平臺(tái)API,直接處理現(xiàn)有的數(shù)據(jù)。這樣相對(duì)而言成本代價(jià)小,更便捷也更能快速實(shí)現(xiàn)現(xiàn)有的目標(biāo)。而API的作用在這里就毋庸置疑了。

數(shù)據(jù)接口

數(shù)據(jù)接口: 簡(jiǎn)單來(lái)說(shuō)就是一組封裝的數(shù)據(jù)集口令,就是按照對(duì)應(yīng)的規(guī)則發(fā)送相應(yīng)的參數(shù),然后返回對(duì)應(yīng)的相關(guān)數(shù)據(jù)信息。API的調(diào)用和數(shù)據(jù)接口的這兩個(gè)在日常調(diào)用時(shí)很類似的,相對(duì)而言API的范圍更寬廣,實(shí)現(xiàn)的功能也比較多,而數(shù)據(jù)接口日常充當(dāng)?shù)木褪且粋€(gè)取數(shù)工具比較多。

就比如說(shuō)大型電商公司公司一般用統(tǒng)一的SKU來(lái)對(duì)商品進(jìn)行管理,而比如這家公司是作為一個(gè)品牌商,它會(huì)在不同平臺(tái)上面進(jìn)行售賣,而在這些平臺(tái)上面映射的商品標(biāo)識(shí)ID就不同于公司的SKU。因?yàn)楣镜腟KU不僅基于商品而且還考慮各個(gè)地方倉(cāng)庫(kù)以及產(chǎn)品的各個(gè)型號(hào),而這個(gè)映射相對(duì)而言就比較復(fù)雜。

而在處理不同平臺(tái)的數(shù)據(jù)人員一般也不能直接使用公司的數(shù)據(jù)庫(kù)來(lái)對(duì)商品進(jìn)行分析,因?yàn)轭w粒度太細(xì),分析起來(lái)比較復(fù)雜困難,這個(gè)時(shí)候就可以根據(jù)對(duì)應(yīng)功能的要求讓開(kāi)發(fā)在現(xiàn)有系統(tǒng)是開(kāi)發(fā)一個(gè)單獨(dú)的數(shù)據(jù)接口提供相應(yīng)的公司,避免直接請(qǐng)求數(shù)據(jù)庫(kù)過(guò)程復(fù)雜等相應(yīng)信息。但數(shù)據(jù)接口相對(duì)實(shí)時(shí)的數(shù)據(jù)庫(kù)存在一定的延遲。

API的調(diào)用和數(shù)據(jù)接口的調(diào)用

API和數(shù)據(jù)接口通過(guò)前面的舉例論述,大致理解起來(lái)也比較簡(jiǎn)單,而具體怎么實(shí)現(xiàn)API的調(diào)用和數(shù)據(jù)接口的調(diào)用這里簡(jiǎn)單介紹一下。

簡(jiǎn)單來(lái)說(shuō)API的調(diào)用和接口的調(diào)用都是類似一個(gè)HTTP請(qǐng)求,而調(diào)用最主要就是根據(jù)相應(yīng)的規(guī)則將請(qǐng)求方式、請(qǐng)求頭、URL、以及請(qǐng)求體封裝好然后發(fā)送請(qǐng)求,就可以實(shí)現(xiàn)相應(yīng)的調(diào)用。

但數(shù)據(jù)接口和API兩個(gè)的調(diào)用相比較而言來(lái),一般數(shù)據(jù)接口比較簡(jiǎn)單,很多情況下數(shù)據(jù)接口是在公司內(nèi)網(wǎng)數(shù)據(jù)訪問(wèn)所以請(qǐng)求信息比較簡(jiǎn)單,而API大多是第三方企業(yè)開(kāi)發(fā)對(duì)外的服務(wù)屬于一種商業(yè)服務(wù),相對(duì)而言為了保證請(qǐng)求的安全,考慮的更為全面,加入了AK、SK、簽名、時(shí)間戳等信息比較復(fù)雜。

而追本溯源這兩個(gè)調(diào)用都是類似HTTP請(qǐng)求,具體調(diào)用大致差不多,主要就是API調(diào)用中包含的請(qǐng)求參數(shù)的信息更多。而具體怎么實(shí)現(xiàn)下面將簡(jiǎn)單的介紹一下。

調(diào)用的基礎(chǔ)-請(qǐng)求方法

一般而言,常見(jiàn)的HTTP請(qǐng)求調(diào)用方式有很多,這方面的資源比較多,可以網(wǎng)上自己查閱,這里就簡(jiǎn)單說(shuō)說(shuō)常見(jiàn)的兩種請(qǐng)求方法。

GET 請(qǐng)求

GET請(qǐng)求簡(jiǎn)單來(lái)說(shuō)就是從服務(wù)器上獲取資源,可以載入到瀏覽器的緩存中。

POST 請(qǐng)求

POST請(qǐng)求一般而言以表單形式向服務(wù)器發(fā)送請(qǐng)求,請(qǐng)求參數(shù)包含在請(qǐng)求體當(dāng)中可能導(dǎo)致資源的創(chuàng)建和改變。POST請(qǐng)求的信息不能緩存在瀏覽器中。
這兩個(gè)請(qǐng)求方法說(shuō)起來(lái)很簡(jiǎn)單,但最重要的一點(diǎn)就是了解這兩種請(qǐng)求的區(qū)別,從而為接口的設(shè)計(jì)和API的使用更加熟悉。

GET和POST請(qǐng)求的區(qū)別

1.GET請(qǐng)求請(qǐng)求長(zhǎng)度最多1024kb,POST對(duì)請(qǐng)求數(shù)據(jù)沒(méi)有限制。這一點(diǎn)原因是很多時(shí)候GET請(qǐng)求把對(duì)應(yīng)的信息放在URL中,而URL的長(zhǎng)度有限,導(dǎo)致GET請(qǐng)求的長(zhǎng)度也受到一定的限制。而POST請(qǐng)求相應(yīng)的參數(shù)信息放在請(qǐng)求體body中所以一般不受長(zhǎng)度限制。

2.POST請(qǐng)求比GET更安全一些,因?yàn)镚ET請(qǐng)求中URL包含了相應(yīng)的信息,頁(yè)面會(huì)被瀏覽器緩存,其他人可以看到相應(yīng)的信息。

3.GET產(chǎn)生一個(gè)TCP數(shù)據(jù)包,POST產(chǎn)生兩個(gè)TCP數(shù)據(jù)包。

GET請(qǐng)求的時(shí)候?qū)eader、data一起發(fā)送出去,然后服務(wù)器響應(yīng)返回200。而POST則是先發(fā)送header,等待服務(wù)器響應(yīng)100,然后發(fā)送data,最后服務(wù)器響應(yīng)返回200.但在這里注意,POST請(qǐng)求分為兩次,但是請(qǐng)求體body是緊隨在header之后發(fā)送的,所以這之間時(shí)間可以微乎不計(jì)。

4.GET請(qǐng)求只支持URL編碼,而POST相對(duì)而言有多種編碼方式。

5.GET請(qǐng)求參數(shù)是通過(guò)URL傳遞的,多個(gè)參數(shù)以&連接,POST請(qǐng)求放在request body中。

6.GET請(qǐng)求只支持ASCII字符,而POST沒(méi)有限制。

一般而言瀏覽器輸入網(wǎng)址可以直接訪問(wèn)的一般是GET請(qǐng)求。

Python實(shí)現(xiàn)GET請(qǐng)求和POST請(qǐng)求

上面大篇幅的介紹了一些數(shù)據(jù)接口、API相關(guān)知識(shí)以及請(qǐng)求方法,使用起來(lái)比較簡(jiǎn)單,下面可以大致熟悉一下相應(yīng)的請(qǐng)求方式。一般直接使用Python的request庫(kù)就可以。

GET請(qǐng)求

import request
# GET請(qǐng)求發(fā)送的參數(shù)一定要是字典的形式,可以發(fā)送多個(gè)參數(shù)。
# 發(fā)送格式:{'key1':value1', 'key2':'value2', 'key3', 'value3'}
# 樣例不能運(yùn)行
url ='http://www.xxxxx.com'
params = {'user':'lixue','password':111112333}
requests.get(url,data = parms)

POST請(qǐng)求

POST請(qǐng)求一般有三種提交形式:application/x-www-form-urlencoded、multipart/form-data、application/json.

具體查看是三種的哪一種請(qǐng)求方式:谷歌瀏覽器檢查 → Network →選擇加載文件 → Headers → Reuqest Headers → Content-Type

具體編碼方式為下面三種,可以了解具體的請(qǐng)求實(shí)現(xiàn),一般公司內(nèi)部的數(shù)據(jù)接口設(shè)置了局域網(wǎng)所以有的可以不需要加header。

POST請(qǐng)求的三種提交形式

1.最常見(jiàn)的post提交數(shù)據(jù)以form表單為主:application/x-www-form-urlencoded

import request
data={'k1':'v1','k2':'v2'}
headers= {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36'}
requests.post(url,headers = headers,data=data)

2.以json格式提交數(shù)據(jù):application/json

data = {'user':'lixue','password':12233}
data_json = json.dumps(params)
requests.post(url,headers = headers,data = data_json)

3.一般用來(lái)傳文件(爬蟲很少用到):multipart/form-data

files = {'files':open('c://xxx.txt','rb')}
requests.post(url = url,headers = headers,files = files)

一個(gè)簡(jiǎn)單API請(qǐng)求的實(shí)例

通過(guò)上面簡(jiǎn)單的介紹,對(duì)于具體請(qǐng)求大致了解,這里搜集了一個(gè)簡(jiǎn)單的API聚合中心,提供了很多挺好用的功能。下面以這個(gè)簡(jiǎn)單API的作一個(gè)簡(jiǎn)單的示范API地址。

這個(gè)小實(shí)例采取的是天氣API接口獲取近15天的天氣。在使用這個(gè)API之前記得獲取相應(yīng)的apiKey和查看具體的使用文檔。這個(gè)API網(wǎng)站一般對(duì)相應(yīng)API提供一定的免費(fèi)次數(shù),可以充當(dāng)學(xué)習(xí)使用,而且支持GET和POST請(qǐng)求。剛好可以適合練手。

GET請(qǐng)求

params = {
    "apiKey":'換成你的apikey',
    "area":'武漢市',
}
url = 'https://api.apishop.net/common/weather/get15DaysWeatherByArea'
response = requests.get(url,params)
print(response.text)

POST請(qǐng)求

這里的POST請(qǐng)求也就是對(duì)應(yīng)上面的最常見(jiàn)的post提交數(shù)據(jù)以form表單為主:application/x-www-form-urlencoded

url = 'https://api.apishop.net/common/weather/get15DaysWeatherByArea'
params = {
    "apiKey":'換成你的apikey',
    "area":'武漢市武昌區(qū)',
}
response = requests.post(url,params)
print(response.text)

在調(diào)用這種API接口一般都需要進(jìn)行一個(gè)狀態(tài)碼等返回信息測(cè)試,檢查請(qǐng)求是否正常,可以按照下面的給出參考。

params = {
    "apiKey":'換成你的apikey,
    "area":'武漢市',
}
url = 'https://api.apishop.net/common/weather/get15DaysWeatherByArea'
response = requests.post(url,params)
print(response.text)
if response.status_code != 200:
    raise ConnectionError(f'{url} status code is {response.status_code}.')
response = json.loads(response.content)
if 'desc' not in response.keys():
    raise ValueError(f'{url} miss key msg.')
if response['desc'] != '請(qǐng)求成功':
    print(11)

數(shù)據(jù)提取

其實(shí)API的調(diào)用很簡(jiǎn)單,但其中最核心的其實(shí)是返回信息中數(shù)據(jù)的抽取,一般而言返回的信息都是json形式,需要從中用字典鍵值對(duì)方式提取數(shù)據(jù),下面這塊根據(jù)請(qǐng)求的數(shù)據(jù)返回相應(yīng)的信息并提取出來(lái),獲取信息后面將會(huì)展示。

import requests
import pandas as pd 
import numpy as np
import json
def get_url(area):
    url = 'https://api.apishop.net/common/weather/get15DaysWeatherByArea'
    params = {
        "apiKey":'換成你的apikey',
        "area":area,
    }
    response = requests.get(url,params)
    if response.status_code != 200:
        raise ConnectionError(f'{url} status code is {response.status_code}.')
    response = json.loads(response.content)
    if 'desc' not in response.keys():
        raise ValueError(f'{url} miss key msg.')
    if response['desc'] != '請(qǐng)求成功':
        print(11)
    return response
def  extract_data(web_data):
    data= web_data['result']['dayList']
    weather_data = pd.DataFrame(columns = ['city','daytime','day_weather','day_air_temperature','day_wind_direction','day_wind_power',                                           'night_weather','night_air_temperature','night_wind_direction','night_wind_power'])
    for i in range(len(data)):
        city = data[i]["area"]
        daytime = data[i]["daytime"]
        daytime = daytime[:4]+'-'+daytime[4:6]+'-'+daytime[-2:]
        day_weather = data[i]["day_weather"]
        day_air_temperature = data[i]['day_air_temperature']
        day_wind_direction = data[i]["day_wind_direction"]
        day_wind_power = data[i]['day_wind_power']
        night_weather = data[i]['night_weather']
        night_air_temperature = data[i]["night_air_temperature"]
        night_wind_direction = data[i]['night_wind_direction']
        night_wind_power = data[i]["night_wind_power"]
        c = {"city": city,"daytime": daytime,"day_weather":day_weather,"day_air_temperature":day_air_temperature,
             "day_wind_direction":day_wind_direction,"day_wind_power":day_wind_power,"night_weather":night_weather,
             "night_air_temperature":night_air_temperature,"night_wind_direction":night_wind_direction,
             "night_wind_power":night_wind_power}
        weather_data = weather_data.append(c,ignore_index = True)
    weather_data.to_excel(r"C:\Users\zhangfeng\Desktop\最近十五天天氣.xlsx",index = None)
    return weather_data
if __name__ == '__main__':
    print("請(qǐng)輸入對(duì)應(yīng)的城市")
    web_data = get_url(input())
    weather_data = extract_data(web_data)

部分結(jié)果如下圖:

數(shù)據(jù)接口實(shí)例

在日常學(xué)習(xí)中數(shù)據(jù)接口的使用可能相對(duì)較少,數(shù)據(jù)接口的應(yīng)用場(chǎng)景大多數(shù)情況下是應(yīng)用在公司內(nèi)部調(diào)取數(shù)據(jù)的情況下比較多,所以一般很少見(jiàn)到,這里展示工作中遇到的兩個(gè)數(shù)據(jù)接口的使用,由于工作考慮,展示的代碼屬于樣例,并不能調(diào)用。可以參考一下調(diào)用實(shí)現(xiàn)以及規(guī)范。

POST請(qǐng)求調(diào)用數(shù)據(jù)接口

# 銷售狀態(tài)查詢
def id_status(id_dir):
    id_data = pd.read_excel(id_dir,sheet_name="Sheet1") 
    id_data.columns = ['shop', 'Campaign Name','Ad Group Name','Item Id']  # 方便后期處理更改列名
    id_data["Item Id"] = id_data["Item Id"].astype(str)
    id_list = list(id_data['Item Id'])
    print(len(id_list))
    id_list = ','.join(id_list)
    if isinstance(id_list, int):
        id_list = str(id_list)
    id1 = id_list.strip().replace(',', ',').replace(' ', '')
    request_url = "http://xxx.com"
    # 通過(guò)item_id查詢id狀態(tài)
    params = {
        "item_id":id1,
    }
    data_json = json.dumps(params) # 屬于POST第二種請(qǐng)求方式
    response = requests.post(request_url, data = data_json)
    print(response.text)
    if response.status_code != 200:
        raise ConnectionError(f'{request_url} status code is {response.status_code}.')
    response = json.loads(response.content)
    if 'message' not in response.keys():
        raise ValueError(f'{request_url} miss key msg.')
    if response['message'] != 'ok':
        print(11)
    data= response['result']
    ad_data = pd.DataFrame(columns = ['Item Id','saleStatusName'])
    for j in range(len(data)):
        item_id =data[j]["item_id"]
        saleStatusName = data[j]['saleStatusName']
        c = {"Item Id": item_id,
         "saleStatusName": saleStatusName,
         }
        ad_data = ad_data.append(c,ignore_index = True)
    total_data = pd.merge(ad_data,id_data,on ='Item Id', how ='left')
    df_column =  ['shop', 'Campaign Name','Ad Group Name','Item Id','saleStatusName']
    total_data = total_data.reindex(columns=df_column)
    return total_data

GET請(qǐng)求調(diào)用數(shù)據(jù)接口

### 庫(kù)存數(shù)據(jù)查詢
def Smart_investment_treasure(investment_dir):
    product_data = pd.read_excel(investment_dir,sheet_name="product")
    if len(product_data)>0:
        product_data['商品ID']=product_data['商品ID'].astype(str)
        product_list=list(product_data['商品ID'])
        product_id = ','.join(product_list)
    else:
        product_id='沒(méi)有數(shù)據(jù)' 
    return product_id    
def stock_query(investment_dir):
        product_data = pd.read_excel(investment_dir,sheet_name="product")
    if len(product_data)>0:
        product_data['商品ID']=product_data['商品ID'].astype(str)
        product_list=list(product_data['商品ID'])
        product_id = ','.join(product_list)
    else:
        product_id='沒(méi)有數(shù)據(jù)' 
    if isinstance(product_id, int):
        product_id = str(id)
    product_id = product_id.strip().replace(',', ',').replace(' ', '')
    request_url = "http://xxx.com"
    # 通過(guò)ali_sku查詢erpsku
    params = {
        "product_id":product_id,
    }
    
    response = requests.get(request_url, params) #屬于GET請(qǐng)求
    if response.status_code != 200:
        raise ConnectionError(f'{request_url} status code is {response.status_code}.')
    response = json.loads(response.content)
    if 'msg' not in response.keys():
        raise ValueError(f'{request_url} miss key msg.')
    if response['msg'] != 'success':
        print(11)
    data= response['data']['data']
    # requestProductId = id.split(',')
    id_state=[]
    overseas_stock=[]
    china_stock=[]
    id_list=[]
    for j in range(len(data)):
        inventory_data= data[j]['list']
        overseas_inventory=0
        ep_sku_list=[]
        sea_test=0
        china_inventory=0
        test="paused"
        id_test=""
        id_test=data[j]['product_id']
        for i in range(len(inventory_data)):
            if inventory_data[i]["simple_code"] in ["FR","DE","PL","CZ","RU"] and inventory_data[i]["erp_sku"] not in ep_sku_list:
                overseas_inventory+=inventory_data[i]["ipm_sku_stock"]
                ep_sku_list.append(inventory_data[i]["erp_sku"])
                sea_test=1
            elif inventory_data[i]["simple_code"] == 'CN':
                china_inventory+=int(inventory_data[i]["ipm_sku_stock"])
        if overseas_inventory>30:
            test="open"
        elif overseas_inventory==0 and china_inventory>100:
            test="open"
        id_list.append(id_test)
        overseas_stock.append(overseas_inventory)
        china_stock.append(china_inventory)           
        id_state.append(test)
    c={"id":id_list,
       "id_state":id_state,
       "海外倉(cāng)庫(kù)存":overseas_stock,
       "國(guó)內(nèi)大倉(cāng)":china_stock
       }
    ad_data=pd.DataFrame(c)
    return ad_data

幾種常見(jiàn)API調(diào)用實(shí)例

百度AI相關(guān)API

百度API是市面上面比較成熟的API服務(wù),在大二期間由于需要使用一些文本打標(biāo)簽和圖像標(biāo)注工作了解了百度API,避免了重復(fù)造輪子,當(dāng)時(shí)百度API的使用比較復(fù)雜,參考文檔很多不規(guī)范,之前也寫過(guò)類似的百度API調(diào)用極其不穩(wěn)定,但最近查閱了百度API參考文檔,發(fā)現(xiàn)目前的調(diào)用非常簡(jiǎn)單。

通過(guò)安裝百度開(kāi)發(fā)的API第三方包,直接利用Python調(diào)包傳參即可使用非常簡(jiǎn)單。這里展示一個(gè)具體使用,相應(yīng)安裝第三方庫(kù)官方文檔查閱。

'''
第三方包名稱:baidu-aip 
百度API 
""" 你的 APPID AK SK """
APP_ID = '你的 App ID'
API_KEY = '你的 Api Key'
SECRET_KEY = '你的 Secret Key'
參考文檔:https://ai.baidu.com/ai-doc/NLP/tk6z52b9z
'''
from aip import AipNlp
APP_ID = 'xxxxxx'
API_KEY = '換成你的apikey'
SECRET_KEY = '換成你的SECRET_KEY'
client = AipNlp(APP_ID, API_KEY, SECRET_KEY)
text = "我還沒(méi)飯吃"
# 調(diào)用文本糾錯(cuò) 
client.ecnet(text)

百度地圖API

這個(gè)API當(dāng)時(shí)為了設(shè)計(jì)一個(gè)推薦體系引入經(jīng)緯度換算地址,這樣為數(shù)據(jù)計(jì)算帶來(lái)極大的方便,而且對(duì)于一般人來(lái)說(shuō)文本地址相比經(jīng)緯度信息更加直觀,然后結(jié)合Python一個(gè)第三方包實(shí)現(xiàn)兩個(gè)地址之間經(jīng)緯度計(jì)算得出相對(duì)的距離。

# https://lbsyun.baidu.com/
# 計(jì)算校驗(yàn)SN(百度API文檔說(shuō)明需要此步驟)
import pandas as pd
import numpy as np
import warnings
import requests
import urllib
import hashlib
import json
from geopy.distance import geodesic
location = input("輸入所在的位置\n")  # "廣州市天河區(qū)"
ak = "ak1111" # 參照自己的應(yīng)用
sk = "sk111111" # 參照自己的應(yīng)用
url = "http://api.map.baidu.com"
query = "/geocoding/v3/?address={0}&output=json&ak={1}&callback=showLocation".format(location, ak)
encodedStr = urllib.parse.quote(query, safe="/:=&?#+!$,;'@()*[]")
sn = hashlib.md5(urllib.parse.quote_plus(encodedStr + sk).encode()).hexdigest()
# 使用requests獲取返回的json
response = requests.get("{0}{1}&sn={2}".format(url, query, sn))
data1=response.text.replace("showLocation&&showLocation(","").replace(")","")
data = json.loads(data1)
print(data)
lat = data["result"]["location"]["lat"]
lon = data["result"]["location"]["lng"]
print("緯度: ", lat, " 經(jīng)度: ", lon)
distance=geodesic((lat,lon), (39.98028,116.30495))
print("距離{0}這個(gè)位置大概{1}".format(location, distance))

有道API

在網(wǎng)上查閱了很多API,前面介紹的幾種API,他們攜帶的請(qǐng)求參數(shù)信息相對(duì)比較簡(jiǎn)單,調(diào)用實(shí)現(xiàn)和基礎(chǔ)請(qǐng)求沒(méi)啥區(qū)別,這里找了一個(gè)相對(duì)而言比較多的請(qǐng)求參數(shù)的API,相對(duì)而言這種API數(shù)據(jù)付費(fèi)API,它的安全性以及具體的實(shí)現(xiàn)都相對(duì)復(fù)雜,但是更適合商用。下面可以簡(jiǎn)單看看。

import requests
import time
import hashlib
import uuid
youdao_url = 'https://openapi.youdao.com/api'   # 有道api地址
translate_text = "how are you!"
input_text = ""
# 當(dāng)文本長(zhǎng)度小于等于20時(shí),取文本
if(len(translate_text) <= 20):
    input_text = translate_text    
# 當(dāng)文本長(zhǎng)度大于20時(shí),進(jìn)行特殊處理
elif(len(translate_text) > 20):
    input_text = translate_text[:10] + str(len(translate_text)) + translate_text[-10:]

uu_id = uuid.uuid1()
now_time = int(time.time())
app_id = '1111111'
app_key = '11111111111'
sign = hashlib.sha256((app_id + input_text + str(uu_id) + str(now_time) + app_key).encode('utf-8')).hexdigest()   # sign生成
data = {
    'q':translate_text,   # 翻譯文本
    'from':"en",   # 源語(yǔ)言
    'to':"zh-CHS",   # 翻譯語(yǔ)言
    'appKey':app_id,   # 應(yīng)用id
    'salt':uu_id,   # 隨機(jī)生產(chǎn)的uuid碼
    'sign':sign,   # 簽名
    'signType':"v3",   # 簽名類型,固定值
    'curtime':now_time,   # 秒級(jí)時(shí)間戳
}
r = requests.get(youdao_url, params = data).json()   # 獲取返回的json()內(nèi)容
print("翻譯后的結(jié)果:" + r["translation"][0])   # 獲取翻譯內(nèi)容

翻譯后的結(jié)果:你好!

這個(gè)API調(diào)用中引用了幾個(gè)真正商用中的一些為了安全性等設(shè)置的驗(yàn)證信息,比如uuid、sign、timestamp,這幾個(gè)在API調(diào)用中也是老生常談的幾個(gè)概念,是比較全面的。下面簡(jiǎn)單介紹一下。

uuid

uuid碼:UUID是一個(gè)128比特的數(shù)值,這個(gè)數(shù)值可以通過(guò)一定的算法計(jì)算出來(lái)。為了提高效率,常用的UUID可縮短至16位。UUID用來(lái)識(shí)別屬性類型,在所有空間和時(shí)間上被視為唯一的標(biāo)識(shí)。一般來(lái)說(shuō),可以保證這個(gè)值是真正唯一的任何地方產(chǎn)生的任意一個(gè)UUID都不會(huì)有相同的值。使用UUID的一個(gè)好處是可以為新的服務(wù)創(chuàng)建新的標(biāo)識(shí)符。是一種獨(dú)特的唯一標(biāo)識(shí)符,python 第三方庫(kù)uuid 提供對(duì)應(yīng)的uuid生成方式,有以下的幾種 uuid1(),uuid3(),uuid4(),uuid5()上面采用的是uuid1()生成,還可以使用uuid4()生成。具體的使用方法 可以參考這篇博客。

sign

sign:一般為了防止被惡意抓包,通過(guò)數(shù)字簽名等保證API接口的安全性。為了防止發(fā)送的信息被串改,發(fā)送方通過(guò)將一些字段要素按一定的規(guī)則排序后,在轉(zhuǎn)化成密鑰,通過(guò)加密機(jī)制發(fā)送,當(dāng)接收方接受到請(qǐng)求后需要驗(yàn)證該信息是否被篡改過(guò),也需要將對(duì)應(yīng)的字段按照同樣的規(guī)則生成驗(yàn)簽sign,然后在于后臺(tái)接收到的進(jìn)行比對(duì),可以發(fā)現(xiàn)信息是否被串改過(guò)。在上面的例子利用hashlib.sha256()來(lái)進(jìn)行隨機(jī)產(chǎn)生一段密鑰,最后使用.hexdigest()返回最終的密鑰。

curtime:引入一個(gè)時(shí)間戳參數(shù),保證接口僅在一分鐘內(nèi)有效,需要和客戶端時(shí)間保持一致。避免重復(fù)訪問(wèn)。

有道API的sign構(gòu)造可以到對(duì)應(yīng)的官方文檔查看一下。因?yàn)槊糠NAPI的簽名構(gòu)造大體都有很多不是相同的。所以一般以官方文檔為主,這里對(duì)于簽名的一些原理,個(gè)人只是大致了解,有想詳細(xì)了解,可以自己查閱資料學(xué)習(xí)。

常用API分享

上面大致介紹了幾種API的使用,但各有不同,但都是基于構(gòu)造HTTP請(qǐng)求按照一定規(guī)則來(lái)實(shí)現(xiàn)的,下面補(bǔ)充一些可以練手也比較好用的API地址,大家可以用來(lái)平常數(shù)據(jù)獲取以及學(xué)習(xí)參考。網(wǎng)上的API特別多,這里只是幾個(gè),有興趣自己可以去了解,然后比較好用可以留言評(píng)論區(qū)分享出來(lái)。

1.聚合數(shù)據(jù)

2.百度大腦

3.apishop

4.百度地圖

5.騰訊地圖

6.有道翻譯

總結(jié)

其實(shí)最近發(fā)現(xiàn)博客很久沒(méi)更新,可能還是因?yàn)樽约簯幸约澳芰τ邢薏恢涝搶懯裁?,但上半年工作以及生活中發(fā)現(xiàn),寫作其實(shí)是一個(gè)很好的東西,可以把自己的想法記錄下來(lái),雖然可能很不成熟,但是其實(shí)對(duì)于自己的成長(zhǎng)是很有幫助,寫多了也就熟了,而且現(xiàn)在快餐式的互聯(lián)網(wǎng),讓我們中斷了很多思考,尤其是工作后發(fā)現(xiàn),平常還是要多思考,多寫作,也可以沉淀自己,后續(xù)會(huì)慢慢更新博客,但是頻率可能不是很高,但是會(huì)慢慢多加入自己的思考和邏輯以及一些歸納,因?yàn)榘l(fā)現(xiàn)之前的博客太不成熟了哈哈哈。次也是一次成長(zhǎng)吧,然后本人是在學(xué)數(shù)據(jù)分析數(shù)據(jù)挖掘的一個(gè)菜鳥,博客中可能出現(xiàn)的問(wèn)題,希望大家積極指出,然后相互學(xué)習(xí)。

相關(guān)文章

  • Python 高效編程技巧分享

    Python 高效編程技巧分享

    工作中經(jīng)常要處理各種各樣的數(shù)據(jù),遇到項(xiàng)目趕進(jìn)度的時(shí)候自己寫函數(shù)容易浪費(fèi)時(shí)間。Python 中有很多內(nèi)置函數(shù)幫你提高工作效率。
    2020-09-09
  • python數(shù)組轉(zhuǎn)換為矩陣的方法實(shí)現(xiàn)

    python數(shù)組轉(zhuǎn)換為矩陣的方法實(shí)現(xiàn)

    本文主要介紹了python數(shù)組轉(zhuǎn)換為矩陣的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • python強(qiáng)大的hook函數(shù)使用及應(yīng)用場(chǎng)景

    python強(qiáng)大的hook函數(shù)使用及應(yīng)用場(chǎng)景

    鉤子函數(shù)(hook function)是把我們自己實(shí)現(xiàn)的hook函數(shù)在某一時(shí)刻掛接到目標(biāo)掛載點(diǎn)上,這篇文章主要介紹了python強(qiáng)大的hook函數(shù)使用及應(yīng)用場(chǎng)景,需要的朋友可以參考下
    2023-05-05
  • python實(shí)現(xiàn)水仙花數(shù)實(shí)例講解

    python實(shí)現(xiàn)水仙花數(shù)實(shí)例講解

    這篇文章主要介紹了python實(shí)現(xiàn)水仙花數(shù)實(shí)例講解,有正在學(xué)習(xí)python的同學(xué)可以跟著小編一起來(lái)學(xué)習(xí)下水仙花數(shù)怎么用python計(jì)算吧
    2021-03-03
  • 學(xué)習(xí)和使用python的13個(gè)理由

    學(xué)習(xí)和使用python的13個(gè)理由

    在本篇文章里小編給大家整理了關(guān)于學(xué)習(xí)和使用python的13個(gè)理由以及相關(guān)知識(shí)點(diǎn),需要的朋友們參考下。
    2019-07-07
  • Python模塊的加載講解

    Python模塊的加載講解

    今天小編就為大家分享一篇關(guān)于Python模塊的加載講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • Python基礎(chǔ)學(xué)習(xí)之深淺拷貝問(wèn)題及遞歸函數(shù)練習(xí)

    Python基礎(chǔ)學(xué)習(xí)之深淺拷貝問(wèn)題及遞歸函數(shù)練習(xí)

    在實(shí)際工作中,經(jīng)常涉及到數(shù)據(jù)的傳遞。這篇文章主要為大家介紹了Python的一些基礎(chǔ)學(xué)習(xí):深拷貝與淺拷貝問(wèn)題、遞歸函數(shù)的練習(xí),需要的朋友可以參考一下
    2021-12-12
  • 通過(guò)實(shí)例解析Python return運(yùn)行原理

    通過(guò)實(shí)例解析Python return運(yùn)行原理

    這篇文章主要介紹了通過(guò)實(shí)例解析Python return運(yùn)行原理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • python?datetime模塊詳解

    python?datetime模塊詳解

    Python中常用于時(shí)間的模塊有time、datetime 和 calendar,顧名思義 time 是表示時(shí)間(時(shí)、分、秒、毫秒)等,calendar 是表示日歷時(shí)間的,本章先討論 datetime 模塊,需要的朋友可以參考下
    2022-06-06
  • Python中單引號(hào)、雙引號(hào)和三引號(hào)具體的用法及注意點(diǎn)

    Python中單引號(hào)、雙引號(hào)和三引號(hào)具體的用法及注意點(diǎn)

    這篇文章主要給大家介紹了關(guān)于Python中單引號(hào)、雙引號(hào)和三引號(hào)具體的用法及注意點(diǎn)的相關(guān)資料,Python中單引號(hào)、雙引號(hào)、三引號(hào)中使用常常困惑,想弄明白這三者相同點(diǎn)和不同點(diǎn),需要的朋友可以參考下
    2023-07-07

最新評(píng)論