我们生活在一个快节奏的时代里,每天除了辛苦的提升自己,为生活打拼之外,偶尔的放松去看场电影也是必要的。可是能够抽出的时间有限,选择看哪部电影就是一个挠头的问题了。
幸好,有类似猫眼电影、豆瓣电影、淘票票这样的平台为我们根据用户的观影评价进行打分并建立了排行榜。根据这份榜单,我们就能参考排行来选择自己喜欢的电影了。
今天,我就带着大家来爬取“猫眼电影 - 热映口碑榜”的数据以及对应影片的详细信息。
首先,我们看一下这份榜单的网页。
这份榜单对应的源码如下:
从源码中,我们可以看到所有的评价信息都包含在dd
内的p
标签中,影片的详情信息通过a
标签的href
属性链接到另外的网页。在上图的例子中我们能够看到“流浪地球”这部影片的链接网址是:https://maoyan.com/films/248906
。
接下来,我们就看看链接影片详情的网页,如下:
影片详情对应的源码如下:
在li.ellipsis
和.dra
类中,我们可以得到该影片的类型以及简介的数据。
我们只要把榜单网页以及对应影片详情网页的HTML DOM
节点得到,在用“选择器”把对应的部分提取出来就可以了。
这里推荐一个处理HTML DOM
的开源工具:Jumony,可以在 Github 上下载。
下载地址为:
https://github.com/Ivony/Jumony
这里对HTML DOM
开源工具不做过多介绍,要是大家感兴趣,我后面再写几篇图文来介绍这个工具。
网页分析部分介绍完了,下面我们介绍代码部分。
1. 定义存储电影对象的结构Film
,包含影片的排名、名称、类型、主演、上映时间、用户评分、简介等信息。
public class Film
{
/// <summary>
/// 获取或设置 排名
/// </summary>
public int Num { get; set; }
/// <summary>
/// 获取或设置 名称
/// </summary>
public string Name { 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 Score { get; set; }
/// <summary>
/// 获取或设置 简介
/// </summary>
public string Introduction { get; set; }
/// <summary>
/// 格式化输出
/// </summary>
/// <returns></returns>
public override string ToString()
{
string str = Environment.NewLine
+ "---" + Environment.NewLine
+ "## Top" + Num.ToString().PadLeft(2, '0') + " <br>"
+ Name + Environment.NewLine
+ "- 类型:" + Type + Environment.NewLine
+ "- 主演:" + Actor + Environment.NewLine
+ "- 上映时间:" + Time + Environment.NewLine
+ "- 用户评分:<span style='color:#FF8F00'><b>" + Score
+ "</b></span>" + 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<Film> GetFilms()
{
List<Film> result = new List<Film>();
//热映口碑榜
string url = "https://maoyan.com/board/7";
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;//排名
item.Actor = infor[1].InnerHtml().Trim().Remove(0, 3);//演员
item.Time = infor[2].InnerHtml().Trim().Remove(0, 5);//上映时间
List<IHtmlElement> 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<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. 得到Markdowm
格式化输出文本的方法。
private void btnSpider_Click(object sender, EventArgs e)
{
List<Film> 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+C
和Ctrl+V
的尴尬,提升了工作效率,当然“实时票房”和“总票房”的数据“猫眼电影”进行了加密,我在后面会用另外一篇图文来介绍这两个数据的获取。
是不是很有趣,你也来试试吧!See You!
参考图文: