三月的内容,programming这个部分按计划是写python和API的主题。
〇、写在前面
最近Facebook关于API开源泄露了5kw用户的数据使其亏损严重。我也是仔细看了好多相关的分析。正好这个月的也利用工作之余研究了一些API的东西。在此写一篇短小的记录。感觉入门起来有点难,因为很多是网页上的基础知识,再加上很多都要注册付费以获取密码,本章没有自己写出东西来,都是研究别人写好的代码,做一些简单的总结。
一、什么是API?
API是应用编程接口applicationprogramming interface。一般来说,大型公司都会提供一个API为使用者和开发者提供便利。有的免费,有的收费。
二、基础准备-JSON库
调用API服务器返回的是JSON格式的数据。可以通过python自带的JSON库进行解析。
JSON库可以将JSON数据转换为字典,JSON数组转换成列表,从而方便操作。
三、API的用法
可以通过公司发布的API接口说明进行操作。基本能在大网站里公布API的都会有应用实例。
(不是所有API的接口都可以用在python中)
在使用中,常常需要key,有些是免费的,有些是付费的。其实花点钱对我来说没什么,主要是我发现几个大的网站API都要实名认证,还要24H。我实在是不想做。
而且书中公布的几个API都已经下架了,造成了很大学习难度。我索性就从网上找到了两个比较入门的API实例进行学习。
四、实例讲解。
本章的学习真的对我来说痛苦,没有web的知识。官方书里的API内容已经在API商店里下架了。本来想学两个实例后自己做一个大型的项目,然而学了两个实例我已经不行了——基础知识还不够。一句句学都还是有几句看不懂的,更别说自己写了。
所以这次的文章,我就引用两位前辈公开的代码,和数据爬取结果。一句句解析翻译,其中有些由于版本(py2和py3),网站自身源代码有变动,所以本人做了一些蹩脚的小修改。
最后结果为1是一个豆瓣图书信息的爬取程序。
2是一个网站的用户地理位置信息的爬取+BDP地理经纬图绘制。
(本文非商业用途,只为学习者参考交流
感谢两位公布代码的前辈:1CSDNBlog作者MTbaby;2简书作者:橄榄的世界);
案例一:
利用豆瓣API查询豆瓣书籍信息。(最入门的)
准备基础:API地址:'https://api.douban.com/v2/book/'
解析代码:
# #coding:utf-8
#编码方式是utf-8
importjson
importurllib
importrequests
#引用3个库
foriinrange(1220564,1220580):
#i的循环,方便之后构造URL。
#url地址
url='https://api.douban.com/v2/book/'
#api的url百度
values=str(i)
#将参数转化为字符串,方便组装url
url=url+values
#进行参数封装
response=urllib.request.urlopen(url)
#访问网页
#json解析:
html=json.loads(response.read().decode('utf-8'))
#打印所需数据,这里python3print的打印方法是括号。
print('书名:',html['title'])
print(html['author'])
print('出版日期:',html['pubdate'])
print('概述:',html['summary'])
print('价格:',html['price'])
print('xxxx')
#分隔符
i=i+1
#循环
结果图是:
实例2:
研究糗事百科网站首页人的地理信息,并用热力图进行表示。
代码以及每行的解释:
importrequests
fromlxmlimportetree
importjson
importcsv
importtime
#引用几个库
defget_url(url): #定义函数
r=requests.get(url,headers=headers) #请求网页,加入表头
print(r.status_code) #写下状态代码200,其实没必要
html=etree.HTML(r.text) #利用xptah解析网页文本内容
url_infos=html.xpath('//div[@class="author clearfix"]')#循环的大层次
user_link_list= [] #用户连接的列表
forurl_infoinurl_infos: #循环用户信息
user_part_link=url_info.xpath('a[1]/@href')#可以加一个print,来查看具体调出来的iurl#--结果是:user_number:
实际这一行爬出来的是我黄色圈出来的部分。仔细看一下用户的信息URL就是在网站后+users/number。 因此这是构造下一级网页的关键。
print(user_part_link) #打印一下爬的内容,我用来学习代码
iflen(user_part_link)!=: #介绍一下!是反向逻辑操作。,因此,也可以去掉后if len() = 1
user_part_link=user_part_link[] #这两行是构造下一级菜单的函数
user_link="https://www.qiushibaike.com"+user_part_link
user_link_list.append(user_link) #添加到列表中
else:
pass #否则pass
returnuser_link_list #返回列表
defget_address(url): #定义地址函数
r=requests.get(user_link,headers=headers) #请求链接+报头
print(r.status_code) #可以省略,200
html=etree.HTML(r.text)
ifhtml.xpath('//div[2]/div[3]/div[2]/ul/li[4]/text()'): #xpath爬取用户信息
address=html.xpath('//div[2]/div[3]/div[2]/ul/li[4]/text()')[].split('· ')[]
get_geo(address)
else:
pass
defget_geo(address):
par={'address':address,'key':'cb649a25c1f81c1451adbeca73623251'}
url='http://restapi.amap.com/v3/geocode/geo'
r=requests.get(url, par)
#API调用过程
json_data=json.loads(r.text) #Json解析数据
try:
geo=json_data['geocodes'][]['location'] #解析并获取一下地理信息数据
longtitude=geo.split(',')[]#经度 #分割经纬度
latitude=geo.split(',')[1]#纬度
writer.writerow((address, longtitude, latitude)) #写入CSV文件
# print(address,longtitude,latitude)
exceptIndexError: #出现错误就pass
pass
if__name__=="__main__": #主程序入口
f=open('F://map7.csv','w',newline='') #打开存储位置
writer=csv.writer(f) #写入存储位置的csv文件
writer.writerow(('地址','经度','纬度')) #文件里表头
headers={
'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3294.6 Safari/537.36'}
url_list= ["https://www.qiushibaike.com/text/page/{}/".format(i)foriinrange(1,30)] #表头和URL链接
forurlinurl_list: #定义循环
user_link_list=get_url(url)
foruser_linkinuser_link_list:
address=get_address(user_link)
f.close()
程序运行的结果是csv文件,记录了用户的地理信息。此处由于我流量有限,爬取了只有几十行的信息。结果图如下:
第二步,我要通过一个叫BDP的数据可视化工具,在地图上显示。
BDP是一个数据分析可视化软件,在线使用,制图功能还挺强的,有各种demo可以用。
打开BDP工具,在工作表中创建经纬图。然后添加进去csv文件。如图:
然后进入作图界面,将地址的csv文件拖入地图,即可生成结果。我生成了一个热力图。
主要内容使爬取网站第一页中的作者地理位置分布。
不足在于:我在单位使用手机流量给电脑热点爬取的,所以数据量挺少的。如果有多一点的数据,可以更清晰的看到一些分布情况。
热力图输出结果:
本月作者继续忙碌,毕业论文,复习,驾照,实习,上课。数据分析是个人爱好和研究生将学的方向。
下个月准备在计算机学习上的时间一半用来继续研究API,再研究两个用python写API的实例,另一半时间进入数据库的学习。
领取专属 10元无门槛券
私享最新 技术干货