博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2.HtmlAgilityPack 爬取优酷电影名进阶(所有分类+多线程)
阅读量:6955 次
发布时间:2019-06-27

本文共 3854 字,大约阅读时间需要 12 分钟。

上一章节中我们实现了对优酷单页面的爬取,简单进行回顾一下,使用HtmlAgilityPack库,对爬虫的爬取一共分为三步

  • 爬虫步骤
    • 加载页面
    • 解析数据
    • 保存数据

继第一篇文档后的爬虫进阶,本文章主要是对上一篇的进阶。实现的功能主要为:

1、爬取电影类别列表
2、循环每个类别的电影信息,对每个类别的信息分页爬取
3、爬取的数据保存到数据库中

一、爬取电影类别列表

img_d36aa022b02e6c530cda7bc4266eb961.png
电影类别页.png

使用Chrome浏览器,F12,找到当前位置,得到当前位置的Xpath。我们需要的数据是电影的类别编码和电影类别名称。

规则分析:

XPATH路径为 "//*[@id='filterPanel']/div/ul/li/a")
类别编码为A标签Href路径的内容,我们对其进行截取
类别名称为A标签InnerTest,我们对其进行截取

代码示例

//加载web内容         private static readonly string _url = "http://list.youku.com/category/video/c_0.html";        ///         ///     得到所有的类别        ///         public static List
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
(); 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 为电影类别编码

页面规则 $"{code}.html"
根据页面规则进行爬取:

///         ///     得到当前类别的总页数        ///         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为第几页
页面规则:{code}s_1_d_1_p{pageIndex}.html
根据页面规则进行爬取:

///         ///     得到当前类别的内容        ///         public static List
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
(); 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; }

四、测试爬取的结果

///         ///     打印得到的内容        ///         public static void PrintContent()        {            var count = 0;            foreach (var node in GetVideoTypes())            {                var resultLi = new List
(); //得到当前类别总分页数 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}"); }

代码下载地址:

https://github.com/happlyfox/FoxCrawler/tree/master/%E5%AD%A6%E4%B9%A0%E7%A4%BA%E4%BE%8B/YouKuCrawler/YouKuCrawlerAsync

转载地址:http://ddtil.baihongyu.com/

你可能感兴趣的文章
DNS 多网段的反向记录
查看>>
Oracle imp和exp的使用
查看>>
Mongodb 副本集 数据同步简单测试
查看>>
前途是自己掌握的
查看>>
FTP连接时出现“227 Entering Passive Mode” 的解决方法
查看>>
tshark可以实现命令行脚本分析流量
查看>>
单例模式的使用和继承
查看>>
cxgrid打印
查看>>
Windows Phone(三)WP7版 " 记账本" 开发(使用SQLite数据库)
查看>>
【最小割】【Dinic】bzoj3275 Number
查看>>
PHP RSA加解密示例(转)
查看>>
翻转句子中单词的顺序
查看>>
IO/序列化/JSON
查看>>
Django权限1
查看>>
关于baseflight cleanflight naze32不能解锁的办法
查看>>
第二阶段团队绩效考核报告
查看>>
如何搭建自己的SPRING INITIALIZR server
查看>>
JDK5-注解
查看>>
linux下网站压力测试工具webbench
查看>>
Android Studio撤销与SVN的关联
查看>>