打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
技术图文:如何利用 C# 爬取「猫眼电影:国内票房榜」及对应影片信息!

以前我写过一些爬取猫眼电影数据的图文:

今天是最后一篇爬取猫眼电影数据的图文,在往后的计划是针对一些热门的影片爬取用户评论的数据,进行自然语言处理方面的算法实现与可视化。


好了,我们开始吧!

首先,我们看一下「猫眼电影:国内票房榜」对应的网页。

网址为:https://maoyan.com/board/1

网页

其次,我们看一下该网页对应的源码。

网页源码

从以上源码中,我们可以发现所有的数据全部存储在 dd 标签内,通过 dd 标签内的 p 标签,可以得到“上映时间”、“主演”、“实时票房”、“总票房”的数据,通过 dd 标签内的 a 标签可以得到“电影名称”,以及通过该 a 标签的 href 属性,可以得到对应电影详细信息的网址,上例中对应的网址为:

https://maoyan.com/films/1211727

电影详情页

接着,我们看一下电影详情页的源码。

网页源码

从上面的源码中,我们发现“电影类型”存储在 li .ellipsis 类中,“电影简介”存储在 dra 类中。只要我们得到爬取网页的 HTML DOM TREE 就可以通过相应的标签和类找到对应的数据。

这里值得注意的是,猫眼电影采取了反爬虫机制对“实时票房”、“总票房”进行了加密处理。我们查找 stonefont 类,发现 猫眼电影 使用 font-face 定义字符集,并通过 unicode 去映射展示,所以我们在网页上看到的是数字,但是在源码中看到的却是别的字符。

font-face
字体编码

如何破解猫眼电影的反爬虫机制呢?我下周二会发布技术图文 《如何利用 C# + Python 破解猫眼电影的反爬虫机制?》来介绍。这里暂且搁置一下

最后,我们用  Jumony 这套开源代码来获取网页对应的 HTML DOM TREE ,这套开源代码可以在 Github 上下载。下载地址为:

https://github.com/Ivony/Jumony

Jumony下载

这里对 Jumony 就不做过多介绍了,要是大家感兴趣,可以在图文下方留言,我后面再写几篇图文来介绍这个工具。


以上对「猫眼电影:国内票房榜」以及对应影片详情的网页进行了详细的分析,也确定了使用的开源工具,下面我们看看具体的代码。

1. 构建存储电影信息的结构Film

public class Film
{

    /// <summary>
    /// 获取或设置 排名
    /// </summary>
    public int Num { get; set; }

    /// <summary>
    /// 获取或设置 名称
    /// </summary>
    public string MovieName { get; set; }

    /// <summary>
    /// 获取或设置 类型
    /// </summary>
    public string Type { get; set; }

    /// <summary>
    /// 获取或设置 主演
    /// </summary>
    public string Actor { get; set; }

    /// <summary>
    /// 获取或设置 上映时间
    /// </summary>
    public string Time { get; set; }

    /// <summary>
    /// 获取或设置 实时票房
    /// </summary>
    public string BoxInfo { get; set; }

    /// <summary>
    /// 获取或设置 总票房
    /// </summary>
    public string SumBoxInfo { get; set; }

    /// <summary>
    /// 获取或设置 简介
    /// </summary>
    public string Introduction { get; set; }

    /// <summary>
    /// Markdown 格式化输出
    /// </summary>
    /// <returns></returns>
    public string ToString()
    
{
        string str = Environment.NewLine
            + "---" + Environment.NewLine
            + "## Top" + Num.ToString().PadLeft(2'0') + " <br>"
            + MovieName + Environment.NewLine
            + "- 类型:" + Type + Environment.NewLine
            + "- 主演:" + Actor + Environment.NewLine
            + "- 上映时间:" + Time + Environment.NewLine
            + "- 实时票房:<span style='color:#E53935'><b>" + BoxInfo
            + "</b></span>" + Environment.NewLine
            + "- 总票房:<span style='color:#757575'><b>" + SumBoxInfo
            + "</b></span>" + 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 List<Film> GetFilmsTicket()
{
    List<Film> result = new List<Film>();

    string url = "https://maoyan.com/board/1"//国内票房榜
    IHtmlDocument doc = GetHtmlDocument(url);
    if (doc == null)
        return result;

    List<IHtmlElement> lists = doc.Find("dd").ToList();
    for (int i = 0; i < lists.Count; i++)
    {
        List<IHtmlElement> infor = lists[i].Find("p").ToList();

        Film item = new Film();
        item.Num = i + 1//排名

        string dw, ticket;
        List<IHtmlElement> s;

        if (infor.Count < 5)
        {
            // 有些电影没有演员的数据,所以这里分开了。
            item.Time = infor[1].InnerHtml().Trim().Remove(05); //上映时间
            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(03); //演员
            item.Time = infor[2].InnerHtml().Trim().Remove(05); //上映时间
            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<IHtmlElement> t = temp.Find("li.ellipsis").ToList();
        item.Type = t[0].InnerHtml(); //类型

        List<IHtmlElement> b = temp.Find(".dra").ToList();
        item.Introduction = b[0].InnerHtml(); //介绍

        result.Add(item);
    }
    return result;
}

4.格式化输出「猫眼电影:国内票房榜」

private List<Film> _lstTicket = new List<Film>(); //票房

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();
}

Markdown显示

注:此处输出的是已经破解猫眼电影反爬虫机制之后得到的结果,关于如何破解猫眼电影的反爬虫机制,我会在下周二的技术图文中跟大家详细介绍

5. Markdown 文本的 HTML 渲染

HTML渲染

到此为止,关于如何利用 C# 语言爬取「猫眼电影:国内票房榜」及对应影片信息,就介绍完了。大家有什么问题可以在图文的下方给我留言,今天就到这里吧!See You!


相关图文:


经过8年多的发展,LSGO软件技术团队在「地理信息系统」、「数据统计分析」、「计算机视觉」等领域积累了丰富的研发经验,也建立了人才培养的完备体系,欢迎对计算机技术感兴趣的同学加入,与我们共同成长进步。

我们图文推送的计划如下,欢迎大家转发!

  • 周一「图书排行:计算机书籍每周销量排行榜」

  • 周二「技术分享:」

  • 周三「资料分享:」

  • 周四「技术分享:」

  • 周五「猫眼电影:即将上映、最受期待榜」

  • 周六「Github精选:本周10大热门项目」

  • 周日「股市币市:本周交易数据分析与最新公告」

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
2023春节档电影票房破70亿元!
2018年中国电影票房排行榜(TOP10)
php如何获取本地手机号
《邪不压正》首日破亿!或成姜文电影票房最高作
胡歌没票房号召力?不虚此行猫眼显示3天只卖出1646.1万
全国影院重开 首日放映破万场
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服