本文共 5269 字,大约阅读时间需要 17 分钟。
以前我写过一些爬取猫眼电影数据的图文:
今天是最后一篇爬取猫眼电影数据的图文,在往后的计划是针对一些热门的影片爬取用户评论的数据,进行自然语言处理方面的算法实现与可视化。
好了,我们开始吧!
首先,我们看一下「猫眼电影:国内票房榜」对应的网页。
网址为:
其次,我们看一下该网页对应的源码。
从以上源码中,我们可以发现所有的数据全部存储在 dd
标签内,通过 dd
标签内的 p
标签,可以得到“上映时间”、“主演”、“实时票房”、“总票房”的数据,通过 dd
标签内的 a
标签可以得到“电影名称”,以及通过该 a
标签的 href
属性,可以得到对应电影详细信息的网址,上例中对应的网址为:
接着,我们看一下电影详情页的源码。
从上面的源码中,我们发现“电影类型”存储在 li .ellipsis
类中,“电影简介”存储在 dra
类中。只要我们得到爬取网页的 HTML DOM TREE
就可以通过相应的标签和类找到对应的数据。
这里值得注意的是,猫眼电影采取了反爬虫机制对“实时票房”、“总票房”进行了加密处理。我们查找 stonefont
类,发现 猫眼电影 使用 font-face
定义字符集,并通过 unicode
去映射展示,所以我们在网页上看到的是数字,但是在源码中看到的却是别的字符。
如何破解猫眼电影的反爬虫机制呢?我下周二会发布技术图文 《如何利用 C# + Python 破解猫眼电影的反爬虫机制?》来介绍。这里暂且搁置一下。
最后,我们用 Jumony 这套开源代码来获取网页对应的 HTML DOM TREE
,这套开源代码可以在 Github 上下载。下载地址为:
这里对 Jumony 就不做过多介绍了,要是大家感兴趣,可以在图文下方留言,我后面再写几篇图文来介绍这个工具。
以上对「猫眼电影:国内票房榜」以及对应影片详情的网页进行了详细的分析,也确定了使用的开源工具,下面我们看看具体的代码。
1. 构建存储电影信息的结构Film
public class Film{ ////// 获取或设置 排名 /// public int Num { get; set; } ////// 获取或设置 名称 /// public string MovieName { get; set; } ////// 获取或设置 类型 /// public string Type { get; set; } ////// 获取或设置 主演 /// public string Actor { get; set; } ////// 获取或设置 上映时间 /// public string Time { get; set; } ////// 获取或设置 实时票房 /// public string BoxInfo { get; set; } ////// 获取或设置 总票房 /// public string SumBoxInfo { get; set; } ////// 获取或设置 简介 /// public string Introduction { get; set; } ////// Markdown 格式化输出 /// ///public string ToString() { string str = Environment.NewLine + "---" + Environment.NewLine + "## Top" + Num.ToString().PadLeft(2, '0') + " " + MovieName + Environment.NewLine + "- 类型:" + Type + Environment.NewLine + "- 主演:" + Actor + Environment.NewLine + "- 上映时间:" + Time + Environment.NewLine + "- 实时票房:" + BoxInfo + "" + Environment.NewLine + "- 总票房:" + SumBoxInfo + "" + Environment.NewLine + "- 剧情简介:" + Introduction + Environment.NewLine; return str; }}
2. 获取对应网页的HTML DOM TREE
public static IHtmlDocument GetHtmlDocument(string url){ IHtmlDocument document; try { document = new JumonyParser().LoadDocument(url); } catch { document = null; } return document;}
3. 获取存储票房数据的电影列表 List<Film>
public static ListGetFilmsTicket(){ List result = new List (); string url = "https://maoyan.com/board/1"; //国内票房榜 IHtmlDocument doc = GetHtmlDocument(url); if (doc == null) return result; List lists = doc.Find("dd").ToList(); for (int i = 0; i < lists.Count; i++) { List infor = lists[i].Find("p").ToList(); Film item = new Film(); item.Num = i + 1; //排名 string dw, ticket; List s; if (infor.Count < 5) { // 有些电影没有演员的数据,所以这里分开了。 item.Time = infor[1].InnerHtml().Trim().Remove(0, 5); //上映时间 dw = infor[2].InnerHtml().Trim(); dw = dw.Remove(0, dw.Length - 1); //实时票房单位 s = infor[2].Find(".stonefont").ToList(); ticket = s[0].InnerHtml().Trim(); //加密的实时票房 item.BoxInfo = ticket + dw; //实时票房 dw = infor[3].InnerHtml().Trim(); dw = dw.Remove(0, dw.Length - 1); //总票房单位 s = infor[3].Find(".stonefont").ToList(); ticket = s[0].InnerHtml().Trim(); //加密的总票房 item.SumBoxInfo = ticket + dw; //总票房 } else { item.Actor = infor[1].InnerHtml().Trim().Remove(0, 3); //演员 item.Time = infor[2].InnerHtml().Trim().Remove(0, 5); //上映时间 dw = infor[3].InnerHtml().Trim(); dw = dw.Remove(0, dw.Length - 1); //实时票房单位 s = infor[3].Find(".stonefont").ToList(); ticket = s[0].InnerHtml().Trim(); //加密的实时票房 item.BoxInfo = ticket + dw; //实时票房 dw = infor[4].InnerHtml().Trim(); dw = dw.Remove(0, dw.Length - 1); //总票房单位 s = infor[4].Find(".stonefont").ToList(); ticket = s[0].InnerHtml().Trim(); //加密的总票房 item.SumBoxInfo = ticket + dw; //总票房 } IHtmlElement a = infor[0].Find("a").ToList()[0]; //获取影片url item.MovieName = a.InnerHtml().Trim(); //名称 url = "https://maoyan.com" + a.Attribute("href").AttributeValue; IHtmlDocument temp = GetHtmlDocument(url); List t = temp.Find("li.ellipsis").ToList(); item.Type = t[0].InnerHtml(); //类型 List b = temp.Find(".dra").ToList(); item.Introduction = b[0].InnerHtml(); //介绍 result.Add(item); } return result;}
4.格式化输出「猫眼电影:国内票房榜」
private List_lstTicket = new List (); //票房private void btnTicket_Click(object sender, EventArgs e){ if (_lstTicket.Count == 0) _lstTicket = FilmHtmlDocument.GetFilmsTicket(); string result = string.Empty; for (int i = 0; i < _lstTicket.Count; i++) { result += _lstTicket[i].ToString() + Environment.NewLine + "广告" + Environment.NewLine; } ShowMarkdownData(result); ShowInGrid(_lstTicket);}
private void ShowMarkdownData(string str){ string temp = Environment.GetEnvironmentVariable("TEMP"); temp += "\\film.txt"; StreamWriter sw = File.CreateText(temp); sw.Write(str); Process.Start(temp); sw.Close();}
注:此处输出的是已经破解猫眼电影反爬虫机制之后得到的结果,关于如何破解猫眼电影的反爬虫机制,我会在下周二的技术图文中跟大家详细介绍。
5. Markdown
文本的 HTML
渲染
到此为止,关于如何利用 C# 语言爬取「猫眼电影:国内票房榜」及对应影片信息,就介绍完了。大家有什么问题可以在图文的下方给我留言,今天就到这里吧!See You!
相关图文:
转载地址:https://lsgogroup.blog.csdn.net/article/details/89195546 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!