python爬虫学习第十九天

来源:互联网 发布:java用户登录权限 编辑:程序博客网 时间:2024/06/04 18:47

今天的主题与API有关,这里的API仅仅指的是网络应用API

API使用

不同 API 的调用语法大不相同,但是有几条共同准则。当使用 GET 请求获取数据时,用 URL 路径描述你要获取的数据范围,查询参数可以作为过滤器或附加请求使用。 例如,下面这个虚拟的 API,可以获取 ID 是 1234 的用户在 2014 年 8 月份发表的所有博文: http://socialmediasite.com/users/1234/posts?from=08012014&to=08312014
有许多 API 会通过文件路径(path)的形式指定 API 版本、数据格式和其他属性。例如, 下面的链接会返回同样的结果,但是使用虚拟 API 的第四版,反馈数据为 JSON 格式: http://socialmediasite.com/api/v4/json/users/1234/posts?from=08012014&to=08312014
还有一些 API 会通过请求参数(request parameter)的形式指定数据格式和 API 版本: http://socialmediasite.com/users/1234/posts?format=json&from=08012014&to=08312014

书中给了几个典型公司的API实例,普遍都需要改公司的账户,我只有google账户,google API说实话也足够我用了

练习 1 geocodeAPI
用 Google 的 Geocode(地理位置信息)API 你可以在浏览器里实现一个简单的 GET 请求, 把街道地址(这里用的是 Boston Museum of Science,里面有 Science Park)解析成纬度和 经度:

https://maps.googleapis.com/maps/api/geocode/json?address=1+Science+Park+Boston+MA+ 02114&key=<你的API key>

结果输出了json格式的信息
这里调用API时候的地址格式其实是不标准的(有兴趣可以去看一下google官方文档的格式),但是Google对这方面做了很好的优化算法,厉害了。

练习2 用 Time zone(时区)API 获取任意经纬度的时区信息
下面的是google Time zone 的实例,原著因为版本问题代码现在已经是不能用了

https://maps.googleapis.com/maps/api/timezone/json?location=38.908133,-77.047119&timestamp=1458000000&key=<你的API key>

练习3 用地点经纬度获取对应的海拔高度
下面的示例将请求科罗拉多州“里高城”丹佛的海拔高度,并以 JSON 格式返回

https://maps.googleapis.com/maps/api/elevation/json?locations=39.7391536,-104.9847034&key=<你的API key>
返回json格式的各种信息(主要是海拔)
{
“results” : [
{
“elevation” : 1608.637939453125,
“location” : {
“lat” : 39.7391536,
“lng” : -104.9847034
},
“resolution” : 4.771975994110107
}
],
“status” : “OK”
}

接下来有一些关于json解析的练习,对于json解析,python里有json模块可供使用

练习4 练习4 解析API传回的json

# import json# from urllib.request import urlopen# def getLocation(ipAddress):#   response = urlopen('http://freegeoip.net/json/'+ipAddress).read().decode('utf-8')#   getJson = json.loads(response)#   return getJson.get('country_code')# print(getLocation('45.78.37.141'))

Python 使用了一种灵活的方式解析JSON,把 JSON 转换成字典,JSON 数组转换成列表, JSON 字符串转换成 Python 字符串。通过这种方式,就可以让 JSON 的获取和操作变得非 常简单。

练习5 json模块解析JSON的原理

# import json# jsonStrings = '''{#     "arrayOfNums": [#         {#             "number": 0#         }, #         {#             "number": 1#         }, #         {#             "number": 2#         }#     ], #     "arrayOfFruits": [#         {#             "fruit": "apple"#         }, #         {#             "fruit": "banana"#         }, #         {#             "fruit": "pear"#         }#     ]# }'''# jsonObj = json.loads(jsonStrings)# print(jsonObj.get('arrayOfNums'))# print(jsonObj.get('arrayOfFruits'))# print(jsonObj.get('arrayOfNums')[0])# print(jsonObj.get('arrayOfNums')[1].get('number'))

运行上面代码后可以得到下面的输出:

[{‘number’: 0}, {‘number’: 1}, {‘number’: 2}]
[{‘fruit’: ‘apple’}, {‘fruit’: ‘banana’}, {‘fruit’: ‘pear’}]
{‘number’: 0}
1

第一、二行输出是一个词典形式的列表,第三行是一个词典对象,第四行是一个字符串(这里为数),不难看出解析原理,有下级关键字的关键字都被解析成了列表对象,而内层的关键字被解析成字符串

今天到这里啦,打卡,休息~

原创粉丝点击