使用API爬取网页数据
问题:获取1000部豆瓣电影的评分
爬虫
1. 确定爬取链接
2. 读取链接指向的内容
3. 从中抽取关键元素
基于网站API的爬虫编写
1. 在网站注册开发者账户用户名,获得相应的开发者秘钥;
2. 在网站的API帮助说明文档中找到自己需要使用的API
确认API请求的限制次数
确认调用API需要使用的参数
3. 在联网状态下,编写代码正确调用该API
4. 从API返回的内容中获取所需属性
5. 将获取的内容存储到本地(文件或数据库)
python爬取语法
爬取用的模块为urllib。本部分参考廖雪峰的python教程:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432688314740a0aed473a39f47b09c8c7274c9ab6aee000/
urllib的“request”模块可以方便的抓取url的内容,也即发送一个GET请求到指定的页面,然后返回HTTP响应。urllib提供的功能就是利用程序去执行各种HTTP请求,有四种方法:可以发送get请求数据;可以模拟浏览器发送GET请求;以POST发送请求;通过一个Proxy去访问网站,利用ProxyHandler处理等,详见廖雪峰的网站。
使用urlopen方法打开一个url链接,返回一个文件。文件中的数据格式为json,使用loads方法加载得到字典类型的数据。
import urllib.request as urlrequest
with request.urlopen('https://api.douban.com/v2/book/2129650') as f:
data = f.read()
举例:爬取豆瓣电影评分
豆瓣API:https://developers.douban.com/wiki/?title=guide
使用API获得ID为1220562的书的信息, 请求的url如下:https://api.douban.com/v2/book/1220562
豆瓣电影API:https://developers.douban.com/wiki/?title=movie_v2
找到豆瓣“电影条目”信息,URI信息为/v2/movie/subject/:id,
使用API获得信息的链接就为:https://api.douban.com/v2/movie/subject/:id
使用API获得的数据格式为json格式,所以浏览器需要具有json viewer的功能。
爬取多个id的电影的评分,然后存入文件
import json
import urllib.request as urlrequest
id_list = [26280528, 6874741, 26942674, 26866011]
with open("douban_movie_rank.txt", "w") as outputfile:
for id in id_list:
url_visit = 'https://api.douban.com/v2/movie/subject/{}'.format(id)
crawl_content = urlrequest.urlopen(url_visit).read()
json_content = json.loads(crawl_content.decode('utf8'))
rank = json_content['rating']['average']
title = json_content['title']
outputfile.write("{:20} {:10} {:<10}\n".format(title, id, rank))
作业:前面已经可以根据一个电影的豆瓣id来抓取它的评分,那么怎样通过电影名称来抓取评分呢?(提示:使用和“电影检索”相关的豆瓣API)