相对于使用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
网友评论