python调用api接口教程,python中api
WebAPI是网站的一部分,用于与使用非常特定的URL来请求特定信息的程序进行交互。下面这篇文章主要介绍python实现API的快速调用指南,通过示例代码非常详细的介绍。有需要的朋友可以参考一下。
00-1010序API数据接口API调用及数据接口调用的基础-请求方法几种常见的API调用实例百度AI相关API百度地图API有道APIuuidsign常见API分享总结
目录
在日常工作中,可能需要结合互联网上已有的一些API或者公司提供的数据接口,来获取相应的数据或者实现相应的功能。
因此,API调用和数据接口访问是数据分析的常用操作。如何快速调用API和数据接口,网上一般有很多语言,但是溯源的方式是使用HTTP请求。因为我经常使用Python,所以本文主要以Python为工具来介绍如何操作。
前言
API:简单来说就是一套协议,一个工具或者一套规则,定义了不同应用之间的通信方式,隐藏了具体的实现过程,只暴露出必须调用的部分供开发者使用。
以上定义比较官方。这里有一个简单的例子来说明。比如外面的麦当劳等快餐店,现在采取手机网上下单,前台取餐的流程。在这个过程中,消费者通常会在手机上选择相应的餐点,然后点击下单付款,然后等待前台叫餐。我们不知道这个过程是如何实现的。整个过程都有相应的app或小程序与厨房数据沟通,然后厨师做出饭菜。而这个APP和小程序作为对应的API函数。
举个简单的例子,一个社交平台每天都会收到各种语言的评论,作为相应的分析师,处理复杂的语言数据是个大问题。有人可能会说,开发一个模型来实现翻译集成的功能,虽然这种方法听起来可行,但是成本很高。其次,为了解决一个问题,我们必须开发一个更困难的问题。这种与最初目标的偏离越来越远。这时候我们可以借助国内相对成熟的翻译平台API,直接对现有数据进行处理。这样成本相对较低,更方便,更快的实现现有目标。API在这里的作用毋庸置疑。
API
数据接口:简单来说就是一组封装的数据集密码,就是按照相应的规则发送相应的参数,然后返回相应的相关数据信息。API调用和数据接口在日常调用中非常相似。相对而言,API的范围更广,功能更多,而数据接口则作为数据检索工具。
例如,大型电子商务公司一般使用统一的SKU来管理商品。比如这个公司作为一个品牌,会在不同的平台上销售,在这些平台上映射的产品识别ID和公司的SKU是不一样的。因为公司的SKU不仅仅是以商品为基础,还要考虑当地各种仓库和各种型号的产品,而且这个映射相对复杂。
而处理不同平台数据的人,一般不能直接用公司的数据库来分析商品,因为粒度太细,分析起来比较复杂和困难。此时,我们可以根据相应功能的要求,在现有系统中开发单独的数据接口来提供相应的公司,避免直接请求复杂的数据库流程等相应信息。但是数据接口相对于实时数据库有一定的延迟。
数据接口
API和数据接口通过前面的例子比较简单理解,这里简单介绍一下如何实现API和数据接口的调用。
简单来说,API调用和接口调用类似于一个HTTP请求,而调用最重要的是按照相应的规则将请求方式、请求头、URL和请求体打包后发送请求,这样就可以实现相应的调用。
但相对于API的调用,通用数据接口相对简单。很多情况下,数据接口是在公司内网访问的,所以请求信息相对简单。然而,API大多是由第三方企业开发的商业服务。相对来说,为了保证请求的安全性,更加全面,添加AK、SK、签名、时间戳等信息更加复杂。
追根溯源,这两个调用类似于HTTP请求,具体调用大致相同,主要是因为API调用包含了更多的请求参数信息。以及如何实现,下面简单介绍一下。
API的调用和数据接口的调用
一般来说,常见的HT
TP请求调用方式有很多,这方面的资源比较多,可以网上自己查阅,这里就简单说说常见的两种请求方法。
GET 请求
GET请求简单来说就是从服务器上获取资源,可以载入到浏览器的缓存中。
POST 请求
POST请求一般而言以表单形式向服务器发送请求,请求参数包含在请求体当中可能导致资源的创建和改变。POST请求的信息不能缓存在浏览器中。
这两个请求方法说起来很简单,但最重要的一点就是了解这两种请求的区别,从而为接口的设计和API的使用更加熟悉。
GET和POST请求的区别
1.GET请求请求长度最多1024kb,POST对请求数据没有限制。这一点原因是很多时候GET请求把对应的信息放在URL中,而URL的长度有限,导致GET请求的长度也受到一定的限制。而POST请求相应的参数信息放在请求体body中所以一般不受长度限制。
2.POST请求比GET更安全一些,因为GET请求中URL包含了相应的信息,页面会被浏览器缓存,其他人可以看到相应的信息。
3.GET产生一个TCP数据包,POST产生两个TCP数据包。
GET请求的时候将header、data一起发送出去,然后服务器响应返回200。而POST则是先发送header,等待服务器响应100,然后发送data,最后服务器响应返回200.但在这里注意,POST请求分为两次,但是请求体body是紧随在header之后发送的,所以这之间时间可以微乎不计。
4.GET请求只支持URL编码,而POST相对而言有多种编码方式。
5.GET请求参数是通过URL传递的,多个参数以&连接,POST请求放在request body中。
6.GET请求只支持ASCII字符,而POST没有限制。
一般而言浏览器输入网址可以直接访问的一般是GET请求。
Python实现GET请求和POST请求
上面大篇幅的介绍了一些数据接口、API相关知识以及请求方法,使用起来比较简单,下面可以大致熟悉一下相应的请求方式。一般直接使用Python的request库就可以。
GET请求
import request# GET请求发送的参数一定要是字典的形式,可以发送多个参数。
# 发送格式:{key1:value1, key2:value2, key3, value3}
# 样例不能运行
url =http://www.xxxxx.com
params = {user:lixue,password:111112333}
requests.get(url,data = parms)
POST请求
POST请求一般有三种提交形式:application/x-www-form-urlencoded、multipart/form-data、application/json.
具体查看是三种的哪一种请求方式:谷歌浏览器检查 → Network →选择加载文件 → Headers → Reuqest Headers → Content-Type
具体编码方式为下面三种,可以了解具体的请求实现,一般公司内部的数据接口设置了局域网所以有的可以不需要加header。
POST请求的三种提交形式
1.最常见的post提交数据以form表单为主:application/x-www-form-urlencoded
import requestdata={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格式提交数据:application/json
data = {user:lixue,password:12233}data_json = json.dumps(params)
requests.post(url,headers = headers,data = data_json)
3.一般用来传文件(爬虫很少用到):multipart/form-data
files = {files:open(c://xxx.txt,rb)}requests.post(url = url,headers = headers,files = files)
一个简单API请求的实例
通过上面简单的介绍,对于具体请求大致了解,这里搜集了一个简单的API聚合中心,提供了很多挺好用的功能。下面以这个简单API的作一个简单的示范API地址。
这个小实例采取的是天气API接口获取近15天的天气。在使用这个API之前记得获取相应的apiKey和查看具体的使用文档。这个API网站一般对相应API提供一定的免费次数,可以充当学习使用,而且支持GET和POST请求。刚好可以适合练手。
GET请求
params = {"apiKey":换成你的apikey,
"area":武汉市,
}
url = https://api.apishop.net/common/weather/get15DaysWeatherByArea
response = requests.get(url,params)
print(response.text)
POST请求
这里的POST请求也就是对应上面的最常见的post提交数据以form表单为主:application/x-www-form-urlencoded
url = https://api.apishop.net/common/weather/get15DaysWeatherByAreaparams = {
"apiKey":换成你的apikey,
"area":武汉市武昌区,
}
response = requests.post(url,params)
print(response.text)
在调用这种API接口一般都需要进行一个状态码等返回信息测试,检查请求是否正常,可以按照下面的给出参考。
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] != 请求成功:
print(11)
数据提取
其实API的调用很简单,但其中最核心的其实是返回信息中数据的抽取,一般而言返回的信息都是json形式,需要从中用字典键值对方式提取数据,下面这块根据请求的数据返回相应的信息并提取出来,获取信息后面将会展示。
import requestsimport 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] != 请求成功:
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("请输入对应的城市")
web_data = get_url(input())
weather_data = extract_data(web_data)
部分结果如下图:
数据接口实例
在日常学习中数据接口的使用可能相对较少,数据接口的应用场景大多数情况下是应用在公司内部调取数据的情况下比较多,所以一般很少见到,这里展示工作中遇到的两个数据接口的使用,由于工作考虑,展示的代码属于样例,并不能调用。可以参考一下调用实现以及规范。
POST请求调用数据接口
# 销售状态查询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"
# 通过item_id查询id状态
params = {
"item_id":id1,
}
data_json = json.dumps(params) # 属于POST第二种请求方式
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请求调用数据接口
### 库存数据查询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=没有数据
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=没有数据
if isinstance(product_id, int):
product_id = str(id)
product_id = product_id.strip().replace(,, ,).replace( , )
request_url = "http://xxx.com"
# 通过ali_sku查询erpsku
params = {
"product_id":product_id,
}
response = requests.get(request_url, params) #属于GET请求
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,
"海外仓库存":overseas_stock,
"国内大仓":china_stock
}
ad_data=pd.DataFrame(c)
return ad_data
几种常见API调用实例
百度AI相关API
百度API是市面上面比较成熟的API服务,在大二期间由于需要使用一些文本打标签和图像标注工作了解了百度API,避免了重复造轮子,当时百度API的使用比较复杂,参考文档很多不规范,之前也写过类似的百度API调用极其不稳定,但最近查阅了百度API参考文档,发现目前的调用非常简单。
通过安装百度开发的API第三方包,直接利用Python调包传参即可使用非常简单。这里展示一个具体使用,相应安装第三方库官方文档查阅。
第三方包名称: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 = "我还没饭吃"
# 调用文本纠错
client.ecnet(text)
百度地图API
这个API当时为了设计一个推荐体系引入经纬度换算地址,这样为数据计算带来极大的方便,而且对于一般人来说文本地址相比经纬度信息更加直观,然后结合Python一个第三方包实现两个地址之间经纬度计算得出相对的距离。
# https://lbsyun.baidu.com/# 计算校验SN(百度API文档说明需要此步骤)
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") # "广州市天河区"
ak = "ak1111" # 参照自己的应用
sk = "sk111111" # 参照自己的应用
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, " 经度: ", lon)
distance=geodesic((lat,lon), (39.98028,116.30495))
print("距离{0}这个位置大概{1}".format(location, distance))
有道API
在网上查阅了很多API,前面介绍的几种API,他们携带的请求参数信息相对比较简单,调用实现和基础请求没啥区别,这里找了一个相对而言比较多的请求参数的API,相对而言这种API数据付费API,它的安全性以及具体的实现都相对复杂,但是更适合商用。下面可以简单看看。
import requestsimport time
import hashlib
import uuid
youdao_url = https://openapi.youdao.com/api # 有道api地址
translate_text = "how are you!"
input_text = ""
# 当文本长度小于等于20时,取文本
if(len(translate_text) <= 20):
input_text = translate_text
# 当文本长度大于20时,进行特殊处理
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", # 源语言
to:"zh-CHS", # 翻译语言
appKey:app_id, # 应用id
salt:uu_id, # 随机生产的uuid码
sign:sign, # 签名
signType:"v3", # 签名类型,固定值
curtime:now_time, # 秒级时间戳
}
r = requests.get(youdao_url, params = data).json() # 获取返回的json()内容
print("翻译后的结果:" + r["translation"][0]) # 获取翻译内容
翻译后的结果:你好!
这个API调用中引用了几个真正商用中的一些为了安全性等设置的验证信息,比如uuid、sign、timestamp,这几个在API调用中也是老生常谈的几个概念,是比较全面的。下面简单介绍一下。
uuid
uuid码:UUID是一个128比特的数值,这个数值可以通过一定的算法计算出来。为了提高效率,常用的UUID可缩短至16位。UUID用来识别属性类型,在所有空间和时间上被视为唯一的标识。一般来说,可以保证这个值是真正唯一的任何地方产生的任意一个UUID都不会有相同的值。使用UUID的一个好处是可以为新的服务创建新的标识符。是一种独特的唯一标识符,python 第三方库uuid 提供对应的uuid生成方式,有以下的几种 uuid1(),uuid3(),uuid4(),uuid5()上面采用的是uuid1()生成,还可以使用uuid4()生成。具体的使用方法 可以参考这篇博客。
sign
sign:一般为了防止被恶意抓包,通过数字签名等保证API接口的安全性。为了防止发送的信息被串改,发送方通过将一些字段要素按一定的规则排序后,在转化成密钥,通过加密机制发送,当接收方接受到请求后需要验证该信息是否被篡改过,也需要将对应的字段按照同样的规则生成验签sign,然后在于后台接收到的进行比对,可以发现信息是否被串改过。在上面的例子利用hashlib.sha256()来进行随机产生一段密钥,最后使用.hexdigest()返回最终的密钥。
curtime:引入一个时间戳参数,保证接口仅在一分钟内有效,需要和客户端时间保持一致。避免重复访问。
有道API的sign构造可以到对应的官方文档查看一下。因为每种API的签名构造大体都有很多不是相同的。所以一般以官方文档为主,这里对于签名的一些原理,个人只是大致了解,有想详细了解,可以自己查阅资料学习。
常用API分享
上面大致介绍了几种API的使用,但各有不同,但都是基于构造HTTP请求按照一定规则来实现的,下面补充一些可以练手也比较好用的API地址,大家可以用来平常数据获取以及学习参考。网上的API特别多,这里只是几个,有兴趣自己可以去了解,然后比较好用可以留言评论区分享出来。
1.聚合数据
2.百度大脑
3.apishop
4.百度地图
5.腾讯地图
6.有道翻译
总结
其实最近发现博客很久没更新,可能还是因为自己懒以及能力有限不知道该写什么,但上半年工作以及生活中发现,写作其实是一个很好的东西,可以把自己的想法记录下来,虽然可能很不成熟,但是其实对于自己的成长是很有帮助,写多了也就熟了,而且现在快餐式的互联网,让我们中断了很多思考,尤其是工作后发现,平常还是要多思考,多写作,也可以沉淀自己,后续会慢慢更新博客,但是频率可能不是很高,但是会慢慢多加入自己的思考和逻辑以及一些归纳,因为发现之前的博客太不成熟了哈哈哈。次也是一次成长吧,然后本人是在学数据分析数据挖掘的一个菜鸟,博客中可能出现的问题,希望大家积极指出,然后相互学习。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。