上一章节中我们实现了对优酷单页面的爬取,简单进行回顾一下,使用HtmlAgilityPack库,对爬虫的爬取一共分为三步
爬虫步骤
- 加载页面
- 解析数据
- 保存数据
继第一篇文档后的爬虫进阶,本文章主要是对上一篇的进阶。实现的功能主要为:
1、爬取电影类别列表
2、循环每个类别的电影信息,对每个类别的信息分页爬取
3、爬取的数据保存到数据库中
一、爬取电影类别列表
使用Chrome浏览器,F12,找到当前位置,得到当前位置的Xpath。我们需要的数据是电影的类别编码和电影类别名称。
规则分析:
XPATH路径为 "//*[@id='filterPanel']/div/ul/li/a")
类别编码为A标签Href路径的内容,我们对其进行截取
类别名称为A标签InnerTest,我们对其进行截取
代码示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
//加载web内容 private static readonly string _url = "http://list.youku.com/category/video/c_0.html" ; /// <summary> /// 得到所有的类别 /// </summary> public static List<VideoType> GetVideoTypes() { //加载web内容 var web = new HtmlWeb(); var doc = web.Load(_url); //内容解析-获得所有的类别 var allTypes = doc.DocumentNode.SelectNodes( "//*[@id='filterPanel']/div/ul/li/a" ).ToList(); //类别列表中去掉【全部】这个选项 var typeResults = allTypes.Where((u, i) => { return i > 0; }).ToList(); var reList = new List<VideoType>(); foreach (var node in typeResults) { var href = node.Attributes[ "href" ].Value; reList.Add( new VideoType { Code = href.Substring(href.LastIndexOf( "/" ) + 1, href.LastIndexOf( "." ) - href.LastIndexOf( "/" ) - 1), Name = node.InnerText }); } return reList; } |
二、爬取每个类别的总分页数
code 为电影类别编码
页面规则 $"http://list.youku.com/category/show/[code].html"
根据页面规则进行爬取:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
/// <summary> /// 得到当前类别的总页数 /// </summary> public static int GetPageCountByCode( string code) { var web = new HtmlWeb(); var doc = web.Load($ "http://list.youku.com/category/show/[code].html" ); //分页列表 var pageList = doc.DocumentNode.CssSelect( ".yk-pages li" ).ToList(); //得到倒数第二项 var lastsecond = pageList[pageList.Count - 2]; return Convert.ToInt32(lastsecond.InnerText); } |
三、按照页码得到每个电影类别的内容
根据分页规则分析出分页后的地址为
code 为编码 pageIndex为第几页
页面规则:http://list.youku.com/category/show/[code]s_1_d_1_p{pageIndex}.html
根据页面规则进行爬取:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
/// <summary> /// 得到当前类别的内容 /// </summary> public static List<VideoContent> GetContentsByCode( string code, int pageIndex) { var web = new HtmlWeb(); var doc = web.Load($ "http://list.youku.com/category/show/[code]_s_1_d_1_p_{pageIndex}.html" ); var returnLi = new List<VideoContent>(); var contents = doc.DocumentNode.CssSelect( ".yk-col4" ).ToList(); foreach (var node in contents) returnLi.Add( new VideoContent { PageIndex = pageIndex.ToString(), Code = code, Title = node.CssSelect( ".info-list .title a" ).FirstOrDefault()?.InnerText, Hits = node.CssSelect( ".info-list li" ).LastOrDefault()?.InnerText, Href = node.CssSelect( ".info-list .title a" ).FirstOrDefault()?.Attributes[ "href" ].Value, ImgHref = node.CssSelect( ".p-thumb img" ).FirstOrDefault()?.Attributes[ "Src" ].Value }); return returnLi; } |
四、测试爬取的结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
/// <summary> /// 打印得到的内容 /// </summary> public static void PrintContent() { var count = 0; foreach (var node in GetVideoTypes()) { var resultLi = new List<VideoContent>(); //得到当前类别总分页数 var pageCount = GetPageCountByCode(node.Code); //遍历分页得到内容 for (var i = 1; i <= pageCount; i++) resultLi.AddRange(GetContentsByCode(node.Code, i)); Console.WriteLine($ "编码{node.Code} \t 页数{pageCount} \t 总个数{resultLi.Count}" ); count += resultLi.Count; } Console.WriteLine($ "总个数为{count}" ); } |
代码下载地址:
以上就是c# 爬取优酷电影信息(2)的详细内容,更多关于c# 爬取优酷电影信息的资料请关注服务器之家其它相关文章!
原文链接:https://www.cnblogs.com/foxhappy/p/14450481.html