写点什么

手把手教你爬取优酷电影信息 -2

用户头像
happlyfox
关注
发布于: 2021 年 02 月 26 日

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

  • 爬虫步骤

- 加载页面

- 解析数据

- 保存数据


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

1、爬取电影类别列表

2、循环每个类别的电影信息,对每个类别的信息分页爬取

3、爬取的数据保存到数据库中


一、爬取电影类别列表


使用 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";
/// <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"

根据页面规则进行爬取:

        /// <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}s1_d_1p{pageIndex}.html

根据页面规则进行爬取:


    /// <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; }
复制代码


四、测试爬取的结果


/// <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}"); }
复制代码


代码下载地址:

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


发布于: 2021 年 02 月 26 日阅读数: 52
用户头像

happlyfox

关注

公众号 程序员工具集 2021.02.18 加入

博客 [www.zhouhuibo.club] 分享优秀的开源项目、学习资源和常用工具。谈论新闻热点、职场经验、学习感悟。共同进步!

评论

发布
暂无评论
手把手教你爬取优酷电影信息-2