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

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

幸好,有类似猫眼电影、豆瓣电影、淘票票这样的平台为我们根据用户的观影评价进行打分并建立了排行榜。根据这份榜单,我们就能参考排行来选择自己喜欢的电影了。


今天,我就带着大家来爬取“猫眼电影 - 热映口碑榜”的数据以及对应影片的详细信息。

首先,我们看一下这份榜单的网页。

https://maoyan.com/board/7

榜单网页

这份榜单对应的源码如下:

榜单源码

从源码中,我们可以看到所有的评价信息都包含在dd内的p标签中,影片的详情信息通过a标签的href属性链接到另外的网页。在上图的例子中我们能够看到“流浪地球”这部影片的链接网址是:https://maoyan.com/films/248906

接下来,我们就看看链接影片详情的网页,如下:

影片网页

影片详情对应的源码如下:

影片源码.png

li.ellipsis.dra类中,我们可以得到该影片的类型以及简介的数据。


我们只要把榜单网页以及对应影片详情网页的HTML DOM节点得到,在用“选择器”把对应的部分提取出来就可以了。

这里推荐一个处理HTML DOM的开源工具:Jumony,可以在 Github 上下载。

Jumony下载

下载地址为:

https://github.com/Ivony/Jumony

这里对HTML DOM开源工具不做过多介绍,要是大家感兴趣,我后面再写几篇图文来介绍这个工具。


网页分析部分介绍完了,下面我们介绍代码部分。

1. 定义存储电影对象的结构Film,包含影片的排名、名称、类型、主演、上映时间、用户评分、简介等信息。

public class Film
{
    /// 
    /// 获取或设置 排名
    /// 
    public int Num { get; set; }
    /// 
    /// 获取或设置 名称
    /// 
    public string Name { get; set; }
    /// 
    /// 获取或设置 类型
    /// 
    public string Type { get; set; }
    /// 
    /// 获取或设置 主演
    /// 
    public string Actor { get; set; }
    /// 
    /// 获取或设置 上映时间
    /// 
    public string Time { get; set; }
    /// 
    /// 获取或设置 用户评分
    /// 
    public string Score { get; set; }
    /// 
    /// 获取或设置 简介
    /// 
    public string Introduction { get; set; }
    /// 
    /// 格式化输出
    /// 
    /// 
    public override string ToString()
    {
        string str = Environment.NewLine
                + "---" + Environment.NewLine
                + "## Top" + Num.ToString().PadLeft(2, '0') + " 
" + Name + Environment.NewLine + "- 类型:" + Type + Environment.NewLine + "- 主演:" + Actor + Environment.NewLine + "- 上映时间:" + Time + Environment.NewLine + "- 用户评分:" + Score + "" + Environment.NewLine + "- 剧情简介:" + Introduction + Environment.NewLine; return str; } }

2. 定义根据URL得到对应HTML DOM TREE的方法。

public static IHtmlDocument GetHtmlDocument(string url)
{
    IHtmlDocument document;
    try
    {
        document = new JumonyParser().LoadDocument(url);
    }
    catch
    {
        document = null;
    }
    return document;
}

3. 得到电影榜单以及对应影片详细信息的方法。

public static List GetFilms()
{
    List result = new List();
    //热映口碑榜
    string url = "https://maoyan.com/board/7";
    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;//排名
        item.Actor = infor[1].InnerHtml().Trim().Remove(0, 3);//演员
        item.Time = infor[2].InnerHtml().Trim().Remove(0, 5);//上映时间
        List s = infor[3].Find("i").ToList();
        item.Score = s[0].InnerHtml() + s[1].InnerHtml();//评分
        IHtmlElement a = infor[0].Find("a").ToList()[0];//获取影片url
        item.Name = 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. 得到Markdowm格式化输出文本的方法。

private void btnSpider_Click(object sender, EventArgs e)
{
    List lst = FilmHtmlDocument.GetFilms();
    string str = Environment.NewLine;
    for (int i = 0; i < lst.Count; i++)
    {
        str += lst[i] + Environment.NewLine
                + "广告" + Environment.NewLine;
    }
}

5. 把Markdowm格式的文本渲染成HTML格式的文本。

渲染文本

好了,到这里就基本介绍完毕了。

我每天更新的“猫眼电影:「热映口碑」与「国内票房」综合评价榜” 就是这样完成的,避免了Ctrl+CCtrl+V的尴尬,提升了工作效率,当然“实时票房”和“总票房”的数据“猫眼电影”进行了加密,我在后面会用另外一篇图文来介绍这两个数据的获取。

是不是很有趣,你也来试试吧!See You!


参考图文:

  • 如何做一款「桌面版百度翻译」软件
  • 如何利用 C# 爬取「京东 - 计算机与互联网图书销量榜」!
  • 七天学会「股票数据分析软件」的开发(上)
  • 七天学会「股票数据分析软件」的开发(中)
  • 七天学会「股票数据分析软件」的开发(下)

你可能感兴趣的:(如何利用 C# 爬取「猫眼电影:热映口碑榜」及对应影片信息!)