Python爬虫

十三. 使用API

2018-02-20  本文已影响0人  橄榄的世界

相对于使用Requests+正则、BS4或Lxml来解析提取数据,API已经为我们做好了这一切。
换而言之,在进行网络爬虫前,应该先考虑网站是否有API。如果网站本身已经提供了API,那么不用爬虫也可以调用信息。
API:Application Programming Interface,应用编程接口。
可以考虑查询API提供商的接口,例如:百度的APIStore、聚合数据。
网址: https://www.juhe.cn/http://apistore.baidu.com
另外,在知乎上查询到一些免费的API:https://www.zhihu.com/question/32225726
API 的连接也很简单,同样通过Requests请求和服务器端的Response回应来完成API的一次调用。只不过API返回的是JSON或者XML格式的数据,而不是HTML数据。

这里以翻译API为例。

1.有道翻译API HTTP地址:http://openapi.youdao.com/api
2.接口调用参数: 调用API需要向接口发送以下字段来访问服务。

字段名 类型 含义 必填 备注
q text 要翻译的文本 True 必须是UTF-8编码
from text 源语言 True 语言列表 (可设置为auto)
to text 目标语言 True 语言列表 (可设置为auto)
appKey text 应用 ID True 可在 应用管理 查看
salt text 随机数 True
sign text 签名, 通过md5(appKey+q+salt+密钥)生成 True appKey+q+salt+密钥的MD5值
语言 代码
中文 zh-CHS
日文 ja
英文 EN
韩文 ko
法文 fr
俄文 ru
葡萄牙文 pt
西班牙文 es

3.签名生成方法如下:
1).将请求参数中的 appKey,翻译文本 q (注意为UTF-8编码),随机数 salt密钥 (密钥可在 应用管理 查看), 按照 appKey+q+salt+密钥 的顺序拼接得到字符串 str
2).对字符串 str 做md5,得到32位大写的 sign (参考Java生成MD5示例)

注意:
1).请先将需要翻译的文本转换为 UTF-8 编码
2).在生成签名拼接之后,发送 HTTP 请求之前需要对各字段做 URL encode。

关于md5的生成,可以参考以下文章:
http://blog.csdn.net/m0_38080253/article/details/78838489

4.实际代码操作:

import requests
import hashlib
import random

appKey = 'XXXXX'       #应用ID,进行注册后可自动获得
secretKey = 'XXXXX'   #应用密钥,进行注册后可自动获得 

url = 'http://openapi.youdao.com/api'
# q = 'good';fromLang = 'EN';toLang = 'zh-CHS';salt = random.randint(1, 10)   #英译中
q = '你好';fromLang = 'zh-CHS';toLang = 'EN';salt = random.randint(1, 10)     #中译英

sign1 = appKey+q+str(salt)+secretKey
sign = hashlib.md5(sign1.encode(encoding='utf-8')).hexdigest()
myurl = url+'?q='+q+'&from='+fromLang+'&to='+toLang+'&salt='+str(salt)\
        +'&appKey='+appKey+'&sign='+sign
 
r = requests.get(myurl)
print(r.text)

结果:

{"tSpeakUrl":"http://openapi.youdao.com/ttsapi?q=hello&langType=en&sign=BE63D9C25C323955FB3BB22ABF996A20&salt=1519091922294&voice=4&format=wav&appKey=XXXXX","web":[{"value":["Hello","How do you do","hi"],"key":"你好"},{"value":["How are you","How Do You Do","Harvey, how are you Harvey"],"key":"你好吗"},{"value":["Teacher Kim Bong-du","My Teacher Mr Kim","Seonsaeng Kim Bong-du"],"key":"老师你好"}],"query":"你好","translation":["hello"],"errorCode":"0","dict":{"url":"yddict://m.youdao.com/dict?le=eng&q=%E4%BD%A0%E5%A5%BD"},"webdict":{"url":"http://m.youdao.com/dict?le=eng&q=%E4%BD%A0%E5%A5%BD"},"basic":{"explains":["hello","hi"]},"l":"zh-CHS2EN","speakUrl":"http://openapi.youdao.com/ttsapi?q=%E4%BD%A0%E5%A5%BD&langType=zh-CHS&sign=1F7CC5A71B46341D7D46C09261F05372&salt=1519091922294&voice=4&format=wav&appKey=XXXXX"}

若需要提取信息,可使用json模块。
其中,json.dumps()使结果呈现结构化,代码为:

import json
json_data = json.loads(r.text)
print(json.dumps(json_data, indent=4, sort_keys=False, ensure_ascii=False))

json.dumps():序列化数据类型为字符串。
json.loads():反序列化成数据类型。具体表现为:将json数据转换成字典,将json数组转换成列表,将json字符串转换成python字符串。

import json
json_data = json.loads(r.text)
print(json_data['web'][0]['value'])                  ##方法一,对字典的操作
#print(json_data.get('web')[0].get('value'))         ##方法二,用get(),结果一样。

结果:
['Hello', 'How do you do', 'hi']

百度地图API调用
import requests
import json

#address = input('请输入地点:')
par = {'address': '北京', 'key': 'cb649a25c1f81c1451adbeca73623251'}
url = 'http://restapi.amap.com/v3/geocode/geo'
r = requests.get(url, par)
print(r.text)

json_data = json.loads(r.text)
geo = json_data['geocodes'][0]['location']
longtitude = geo.split(',')[0]   #经度
latitude = geo.split(',')[1]     #纬度
print(longtitude,latitude)

结果:

{"status":"1","info":"OK","infocode":"10000","count":"1","geocodes":[{"formatted_address":"北京市","province":"北京市","citycode":"010","city":"北京市","district":[],"township":[],"neighborhood":{"name":[],"type":[]},"building":{"name":[],"type":[]},"adcode":"110000","street":[],"number":[],"location":"116.407526,39.904030","level":"省"}]}
116.407526 39.904030
上一篇下一篇

猜你喜欢

热点阅读