在现代生活中,看电影已经成为大家的一种休闲方式。

前几天,我们介绍了 如何利用 C# 爬取「猫眼电影:热映口碑榜」及对应影片信息!,通过这份“热映口碑”榜单,我们可以看到大家对当前热播电影的评价,为我们选择所要观看的电影提供了辅助支持。但仅有这份榜单还是不够的,我们还想知道这些热映电影更详细的数据,比如:“实时票房”、“累积票房”、“票房占比”、“排片占比”、“上座率”等等,以便更好的选择出一部令自己满意的影片,更好的分配自己的娱乐时间。


下面,我就带着大家从“猫眼专业版”的网站上来爬取以上的数据。

首先,我们浏览一下“猫眼专业版”的网页,网址如下(选择2019年03月01日的数据):

https://piaofang.maoyan.com/dashboard?date=2019-03-01

对应的HTML代码如下:

注:如果需要选择2019年03月02日的数据,只需要调整URL中的date参数值,把2019-03-01换为2019-03-02即可。

其次,我们从源代码中发现<div class="movielist"></div>部分,并不包含数据,初步断定该网页采用了“前后端分离”的开发方式。故打开浏览器的控制台,确实发现了从服务器请求的JSON数据,请求网址如下:

https://box.maoyan.com/promovie/api/box/second.json?beginDate=20190301

对应的JSON数据如下:

我们想要的数据包含在list数组中,如下图所示:

这样,我们就找到了所要获取的全部数据。


怎样处理JSON数据呢?

我推荐一套处理JSON数据的开源类库Json.NET,通过这套类库可以把得到的JSON数据反序列化成对应的类型。

Json.NET的 Git 网址如下:

https://github.com/JamesNK/Newtonsoft.Json

有需要的同学可以到 Git 上下载源码,这里就不过多介绍这个开源类库了。如果大家对Json.NET感兴趣可以在图文下面留言,我会另外写一些图文详细介绍这套类库的源码以及具体应用。


到此为止,网页的分析部分就全部介绍完了,下面我们来看具体的代码部分:

1. 定义存储电影的结构Film。包括“编号、名称、实时票房、总票房、票房占比、排片占比、上座率”等等。

public class Film
{/// <summary>/// 获取或设置 编号/// </summary>public int Num { get; set; }/// <summary>/// 获取或设置 名称/// </summary>public string MovieName { get; set; }/// <summary>/// 获取或设置 实时票房/// </summary>public string BoxInfo { get; set; }/// <summary>/// 获取或设置 票房占比/// </summary>public string BoxRate { get; set; }/// <summary>/// 获取或设置 排片占比/// </summary>public string ShowRate { get; set; }/// <summary>/// 获取或设置 总票房/// </summary>public string SumBoxInfo { get; set; }/// <summary>/// 获取或设置 上座率/// </summary>public string AvgSeatView { get; set; }/// <summary>/// Markdown 格式化输出/// </summary>/// <returns></returns>public override string ToString(){string str = Environment.NewLine+ "---" + Environment.NewLine+ "## Top" + Num.ToString().PadLeft(2, '0') + " <br>"+ MovieName + Environment.NewLine+ "- 实时票房:<span style='color:#E53935'><b>" + BoxInfo+ "</b></span>" + Environment.NewLine+ "- 票房占比:<span style='color:#E53935'><b>" + BoxRate+ "</b></span>" + Environment.NewLine+ "- 排片占比:<span style='color:#E53935'><b>" + ShowRate+ "</b></span>" + Environment.NewLine+ "- 上座率:<span style='color:#E53935'><b>" + AvgSeatView+ "</b></span>" + Environment.NewLine+ "- 总票房:<span style='color:#757575'><b>" + SumBoxInfo+ "</b></span>" + Environment.NewLine;return str;}
}

2. 根据URL得到包含电影数据的JSON

public static string GetFilmsJson(string url)
{//1. HttpWebRequest 发送HTTP数据HttpWebRequest webRequest = WebRequest.Create(url) as HttpWebRequest;if (webRequest == null)return string.Empty;webRequest.Method = "GET";webRequest.ContentType = "application/json;charset=utf-8";webRequest.Accept = "*/*";try{string json;using (HttpWebResponse webResponse = (HttpWebResponse) webRequest.GetResponse())//2.HttpWebResponse 接收HTTP数据{Stream st = webResponse.GetResponseStream(); if (st == null)return string.Empty;using (StreamReader reader = new StreamReader(st, Encoding.UTF8)) {json = reader.ReadToEnd(); reader.Close();webResponse.Close();}}return json;}catch{return string.Empty;}
}

3. 为反序列化该JSON定义对应的结构。

这块定义的结构与JSON的格式相对应,可以结合上面JSON数据的图来看。

private class Item
{/// <summary>/// 上座率/// </summary>public string avgSeatView { get; set; }/// <summary>/// 实时票房/// </summary>public string boxInfo { get; set; }/// <summary>/// 票房占比/// </summary>public string boxRate { get; set; }/// <summary>/// 排片占比/// </summary>public string showRate { get; set; }/// <summary>/// 名称/// </summary>public string movieName { get; set; }/// <summary>/// 总票房/// </summary>public string sumBoxInfo { get; set; }
}private class Data
{public List<Item> list;
}private class JsonFilm
{public Data data { get; set; }
}

4. 反序列化JSON到对应的类中,并得到存储电影数据的链表。

public static List<Film> GetFilmsMaoYanTicket(string date)
{List<Film> result = new List<Film>();string url = @"https://box.maoyan.com/promovie/api/box/"+@"second.json?beginDate="+ date;//通过JSON的方式来实现string json = GetFilmsJson(url);StringReader sr = new StringReader(json);JsonTextReader jsonReader = new JsonTextReader(sr);JsonSerializer serializer = new JsonSerializer();JsonFilm r = serializer.Deserialize<JsonFilm>(jsonReader);List<Item> lst = r.data.list;for (int i = 0, len = lst.Count; i < len; i++){Film film = new Film();film.Num = i + 1;film.MovieName = lst[i].movieName;film.AvgSeatView = lst[i].avgSeatView;film.BoxInfo = lst[i].boxInfo + "万";film.BoxRate = lst[i].boxRate;film.ShowRate = lst[i].showRate;film.SumBoxInfo = lst[i].sumBoxInfo;result.Add(film);}return result;
}

5. Markdown 格式化输出爬取的“猫眼电影专业版:票房”的数据。

private string GetReportReputation(List<Film> lst)
{string result = Environment.NewLine;for (int i = 0; i < lst.Count; i++){result += lst[i].ToString() + Environment.NewLine;}return result;
}

6. 把Markdown格式的文本渲染成HTML格式的文本。


最后,总结一下。

我们以分析“猫眼电影专业版”的网页为基础,得知该网页采取了“前后端分离”的开发方式,于是我们先得到了存储信息的JSON数据,并利用Json.net类库对其反序列化,得到对应的类,从而完成了整个网页的爬取过程。

是不是很有趣,大家也来试试吧!今天就到这里了,See You!


参考图文:

  • 如何做一款「桌面版百度翻译」软件
  • 七天学会「股票数据分析软件」的开发(上)
  • 七天学会「股票数据分析软件」的开发(中)
  • 七天学会「股票数据分析软件」的开发(下)
  • 如何利用 C# 爬取「京东 - 计算机与互联网图书销量榜」!
  • 如何利用 C# 爬取「猫眼电影:热映口碑榜」及对应影片信息!

如何利用 C# 爬取「猫眼电影专业版:票房」数据!相关推荐

  1. 如何利用 C# 爬取「猫眼电影:国内票房榜」及对应影片信息!

    以前我写过一些爬取猫眼电影数据的图文: 如何利用 C# 爬取「猫眼电影专业版:票房」数据? 如何利用 C# 爬取「猫眼电影:热映口碑榜」及对应影片信息? 如何利用 C# 爬取「猫眼电影:最受期待榜」及 ...

  2. 如何利用 C# 爬取「猫眼电影:最受期待榜」及对应影片信息!

    "道路千万条,安全第一条!行车不规范,亲人两行泪!" 这句在影片"流浪地球"中不断重复的话语已经被大家所熟知.为了行车的安全,我们需要遵守规范,提前规划.同样, ...

  3. 如何利用 C# 爬取「猫眼电影:热映口碑榜」及对应影片信息!

    我们生活在一个快节奏的时代里,每天除了辛苦的提升自己,为生活打拼之外,偶尔的放松去看场电影也是必要的.可是能够抽出的时间有限,选择看哪部电影就是一个挠头的问题了. 幸好,有类似猫眼电影.豆瓣电影.淘票 ...

  4. python爬取电影票房前50_Python3爬取起猫眼电影实时票房信息,解决文字反爬~~~附源代码...

    上文解决了起点中文网部分数字反爬的信息,详细链接https://www.cnblogs.com/aby321/p/10214123.html 本文研究另一种文字反爬的机制--猫眼电影实时票房反爬 虽然 ...

  5. 如何利用 C# 爬取「中国图书网 - 计算机与互联网图书销量榜」!

    每周一,我们会爬取「京东」.「当当」.「互动出版网」和「中国图书网」的图书7日销量数据并做一份榜单,已经持续一段时间了,从后台阅读量的统计数据来看,对辅助大家选购计算机类书籍还是有帮助的.如果大家对这 ...

  6. 如何利用 C# 爬取「互动出版网 - 计算机图书销量榜」!

    想想自己看过的计算机方面的图书,大部分出自两个出版社,一个是 机械工业出版社,另一个是 人民邮电出版社.我们熟悉的 China-pub 即 互动出版网 收录了几乎所有机械工业出版社出版的图书. 今天我 ...

  7. 如何利用 C# 爬取「当当 - 计算机与互联网图书销量榜」!

    前段时间我们介绍了如何利用 C# 语言来爬取"京东 - 计算机与互联网图书销量榜" 网页的方法,通过该方法,我们能够获得"京东"的图书销售排行榜数据. 可是,读 ...

  8. 利用Python爬取《囧妈》豆瓣短评数据,并进行snownlp情感分析

    利用Python爬取<囧妈>豆瓣短评数据,并进行snownlp情感分析 一.电影评论爬取 今年的贺岁片<囧妈>上映前后,在豆瓣评论上就有不少网友发表了自己的观点,到底是好评的声 ...

  9. 爬虫实战(一)利用scrapy爬取豆瓣华语电影

    爬虫第一个项目是爬取豆瓣华语电影,后面将对这部分数据进行分析. 本文也是发表于『运筹OR帷幄』微信公众号的<用数据带你了解电影行业-华语篇>的爬虫介绍篇. 1. 爬取思路 在观察了豆瓣每个 ...

最新文章

  1. 重磅|我国科学家成功研制全球神经元规模最大的类脑计算机
  2. CentOS系统设置开机自启动
  3. 移动端web开发,click touch tap区别
  4. openerp学习笔记 context 的应用
  5. 飞鸽传书 的内置的计算机处理
  6. fetchtype 动态控制_hibernate 中 fetch=FetchType.LAZY 懒加载失败处理方法
  7. 游戏接腾讯平台的一些锁事
  8. 【python基础语法】range() 序列类型range
  9. docker pull 私有_Docker系列教程03Docker私有仓库搭建(registry)
  10. 【车间调度】基于matlab遗传算法求解车间调度问题【含Matlab源码 1396期】
  11. Word 2016插入公式快捷键
  12. java 实现 excel 去重,excel实现筛选去重操作
  13. Crosslink-NX器件应用案例(2): MIPI的多源合成(MUX)与分发(DeMUX)
  14. 如何放大图片,教您三种方法!
  15. 单双人贪吃蛇小游戏(控制台)
  16. 云储存公司Terascala获1400万美元融资
  17. C++11 std::snprintf
  18. linux/windows查看端口被占用情况
  19. 30天自制操作系统——用U盘启动自制系统
  20. Android activity相互跳转

热门文章

  1. 1021 Deepest Root
  2. 1035 插入与归并
  3. 1016 Phone Bills
  4. 为什么匿名内部类参数必须为final类型
  5. [雪峰磁针石博客]kotlin书籍汇总
  6. 转 微博 linux中ctime,mtime,atime的区别
  7. easyui的datagrid
  8. IE调试网页之一:F12 开发人员工具简介
  9. QQ2007去广告教程(本地vip)
  10. 解决“由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题”...