早几天刚好2017年的豆瓣电影榜单web也出来了,于是打算实践一下,用的chrome浏览器。
图1
0. 观察网页元素
由于是一个动态的网页,动态效果主要由翻页或者右边的按钮实现,另外,也可以从首页的导航栏直接跳转到某一页。
首页导航栏
利用了google Chrome浏览器自带的API network网页监视器,右键-检查-network-XHR,当我们选择某一页时网络监视器将会将客户端与web服务器的一系列请求响应等交换显示出来。
我们观察右边的name这一栏,发现有一些命名为数字的条目,发现它主要是对一系列网站的请求和响应,右键选择Open-in-new-tab,我们可以发现这是一个json文件,遵循了json的语法,每一页网页的信息都包含在名为res的标签里,
PS:如果你的浏览器显示出来的是格式非常乱的代码,请下一个名为json view的chrome插件。
2017评分最高的外语电影后台的json文件
1.分析各个元素在json文件的路径
这里先以有内容的第一页,即2017评分最高的外语电影为例,主要爬取top10电影的title,评分,电影详情链接,评分人数。
1 for i in range(a): 2 message=file['res']['subjects'][i] 3 title=message['title'] 4 rating = message['rating'] 5 detail_url=message['url'] 6 rating_count=message['rating_count']
我们爬取从第一页到第88页的信息,由于这个年度电影榜单除了有***最佳电影这种页面之外,还有台词这种界面,它对应的json文件是不一样的:
另外还有几个页面只有五个item,如下:
因此我们爬取整个网站的时候需要加入几个条件语句,最后存在excel文件里。
1 import requests 2 from lxml import html 3 import time 4 import json 5 6 vis_List=range(1,88) 7 with open('E:\coding\python programs\ douabn 2017 movies.csv','w',encoding='utf-8') as f1: 8 with open('E:\coding\python programs\ douabn 2017 movie lines.csv','w',encoding='utf-8') as f2: 9 with open('E:\coding\python programs\ douabn 2017 movie stars.csv','w',encoding='utf-8') as f3: 10 for a in vis_List: 11 url_visit='https://movie.douban.com/ithil_j/activity/movie_annual2017/widget/{}'.format(a) 12 file=requests.get(url_visit).json() 13 time.sleep(5) 14 15 if (file['res']['kind_str']=='top10')or file['res']['kind_str']=='top5': 16 a = len(file['res']['subjects']) 17 tag=file['res']['payload']['title'] 18 19 f1.write('{}\n'.format(tag)) 20 21 for i in range(a): 22 message=file['res']['subjects'][i] 23 title=message['title'] 24 rating = message['rating'] 25 detail_url=message['url'] 26 rating_count=message['rating_count'] 27 print('{} {} {} {}\n'.format(title,detail_url,rating,rating_count)) 28 f1.write('{},{},{},{},{}\n'.format(i+1,title,detail_url,rating,rating_count)) 29 elif file['res']['kind_str']=='person': 30 tag=file['res']['payload']['title'] 31 f3.write('{}\n'.format(tag)) 32 for i in range(10): 33 name=file['res']['people'][i]['name'] 34 f3.write('{},{}\n'.format(i+1,name)) 35 elif file['res']['kind_str']=='the_fallen': 36 pass 37 else: 38 movie=file['res']['subject']['title'] 39 text=file['res']['payload']['text'] 40 f2.write('{},{}\n'.format(movie,text))