三月內容-API實例入門
三月的內容,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的實例,另一半時間進入資料庫的學習。
TAG:Bene的學習計劃 |