爬取动态网页(2017年年度豆瓣电影榜单)

时间:2021-07-26 19:19:27

 

早几天刚好2017年的豆瓣电影榜单web也出来了,于是打算实践一下,用的chrome浏览器。

爬取动态网页(2017年年度豆瓣电影榜单)

图1

 

0. 观察网页元素

由于是一个动态的网页,动态效果主要由翻页或者右边的按钮实现,另外,也可以从首页的导航栏直接跳转到某一页。

爬取动态网页(2017年年度豆瓣电影榜单)

首页导航栏

利用了google Chrome浏览器自带的API network网页监视器,右键-检查-network-XHR,当我们选择某一页时网络监视器将会将客户端与web服务器的一系列请求响应等交换显示出来。

爬取动态网页(2017年年度豆瓣电影榜单)

我们观察右边的name这一栏,发现有一些命名为数字的条目,发现它主要是对一系列网站的请求和响应,右键选择Open-in-new-tab,我们可以发现这是一个json文件,遵循了json的语法,每一页网页的信息都包含在名为res的标签里,

PS:如果你的浏览器显示出来的是格式非常乱的代码,请下一个名为json view的chrome插件。

爬取动态网页(2017年年度豆瓣电影榜单)

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文件是不一样的:

爬取动态网页(2017年年度豆瓣电影榜单)

另外还有几个页面只有五个item,如下:

爬取动态网页(2017年年度豆瓣电影榜单)

因此我们爬取整个网站的时候需要加入几个条件语句,最后存在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))