一般情况下,程序员可以用HTPP协议向API发起请求以获取某种信息,API会用XML或JSON格式返回服务器响应的信息。
通常不会把使用API看成网络数据采集,但是实际上两者使用的许多技术(都是发送HTTP请求)和产生的结果(都是获取信息)差不多;两者经常是相铺相成的关系。
如把维基百科编辑历史(里面有编辑者IP地址)和一个IP地址解析的API组合起来,以获取维基百科词条编辑者的地理位置。
4.1 API概述
http://freegeoip.net/json/50.78.253.58
Google API
4.2 API通用规则
API用一套非常标准的规则生成数据,而且生成的数据也是按照非常标准的方式组织的。
四种方式:GET, POST, PUT, DELETE
验证:要求客户验证
4.3 服务器响应
大多数反馈的数据格式是XML和JSON
过去,服务器端用PHP和.NET这些程序作为API的接收端。现在,服务器端也会用一些JavaScript框架作为API的发送和接收端,像Angular或Backbone等。
API调用:
4.4 Echo Nest
The Echo Nest 音乐数据网站 https://developer.echonest.com/account/register
4.5 Twitter API
https://apps.twitter.com/app/new
pip install twitter
from twitter import Twitter
t = Twitter(auth=OAuth(<Access Token>,<Access Token Secret>,<Consumer Key>,<Consumer Secret>))
pythonTweets = t.search.tweets(q = "#python")
print(pythonTweets)
发一篇推文
4.6 Google API
无论你想处理哪种信息,包括语言翻译、地理位置、日历,甚至基因数据,Google 都提供了API。Google 还为它的一些知名应用提供 API,比如 Gmail、YouTube 和 Blogger 等。
4.7 解析JSON数据
import json
from urllib.request import urlopen
def getCountry(ipAddress):
response = urlopen("http://freegeoip.net/json/"+ipAddress).read().decode('utf-8')
responseJson = json.loads(response)
return responseJson.get("country_code")
print(getCountry("50.78.253.58"))
4.8 回到主题
把多个数据源组合成新的形式,或者把API作为一种工具,从全新的视角对采集到的数据进行解释。
首先做一个采集维基百科的基本程序,寻找编辑历史页面,然后把编辑历史里面的IP地址找出来
# -*- coding: utf-8 -*-
from urllib.request import urlopen
from bs4 import BeautifulSoup
import datetime
import random
import re
import json
random.seed(datetime.datetime.now())
# https://en.wikipedia.org/wiki/Python_(programming_language)
def getLinks(articleUrl):
html = urlopen("http://en.wikipedia.org"+articleUrl)
bsObj = BeautifulSoup(html)
return bsObj.find("div",{"id":"bodyContent"}).findAll("a", href=re.compile("^(/wiki/)((?!:).)*$"))
def getHistoryIPs(pageUrl):
# 编辑历史页面URL链接格式是:
# https://en.wikipedia.org/w/index.php?title=Python_(programming_language)&action=history
pageUrl = pageUrl.replace("/wiki/", "")
historyUrl = "https://en.wikipedia.org/w/index.php?title="+pageUrl+"&action=history"
print("history url is: "+historyUrl)
html = urlopen(historyUrl)
bsObj = BeautifulSoup(html)
# 找出class属性是"mw-anonuserlink"的链接
# 它们用IP地址代替用户名
ipAddresses = bsObj.findAll("a", {"class":"mw-anonuserlink"})
addressList = set()
for ipAddress in ipAddresses:
addressList.add(ipAddress.get_text())
return addressList
links = getLinks("/wiki/Python_(programming_language)")
def getCountry(ipAddress):
try:
response = urlopen("http://freegeoip.net/json/"+ipAddress).read().decode('utf-8')
except HTTPError:
return None
responseJson = json.loads(response)
return responseJson.get("country_code")
while (len(links) > 0):
for link in links:
print("-------------------")
historyIPs = getHistoryIPs(link.attrs["href"])
for historyIP in historyIPs:
#print(historyIP)
country = getCountry(historyIP)
if country is not None:
print(historyIP+" is from "+country)
newLink = links[random.randint(0, len(links)-1)].attrs["href"]
links = getLinks(newLink)
4.9 再说一点API
Leonard Richardson、Mike Amundsen 和 Sam Ruby 的 RESTful Web APIs (http://shop.oreilly.com/product/0636920028468.do)为网络 API 的用法提供了非常全面的理论与实践指导。另外,Mike Amundsen 的精彩视频教学课程 Designing APIs for the Web(http://shop.oreilly.com/product/110000125.do),也可以教你创建自己的 API。如果你想把自己采集的数据用一种便捷的方式分享出来,他的视频非常有用