c# 爬取优酷电影信息(2)

 更新时间:2021年02月26日 09:45:13   作者:三十三重天  
这篇文章主要介绍了c# 如何爬取优酷电影信息,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下

上一章节中我们实现了对优酷单页面的爬取,简单进行回顾一下,使用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]s_1_d_1_p{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

以上就是c# 爬取优酷电影信息(2)的详细内容,更多关于c# 爬取优酷电影信息的资料请关注脚本之家其它相关文章!

相关文章

  • c# delegate和event的使用说明

    c# delegate和event的使用说明

    这篇文章主要介绍了c# delegate和event的使用说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • C#设计模式编程中运用适配器模式结构实战演练

    C#设计模式编程中运用适配器模式结构实战演练

    这篇文章主要介绍了C#设计模式编程中运用适配器模式结构实战演练,并总结了适配器模式的优缺点和适用场景以及.NET框架中的应用,需要的朋友可以参考下
    2016-02-02
  • C# XML与Json之间相互转换实例详解

    C# XML与Json之间相互转换实例详解

    这篇文章主要介绍了C# XML与Json之间相互转换实例详解,大家参考使用吧
    2013-11-11
  • c#调用c++的DLL的实现方法

    c#调用c++的DLL的实现方法

    本文主要介绍了c#调用c++的DLL的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • 使用C#在注册表中保存信息的例子

    使用C#在注册表中保存信息的例子

    最近做的项目需要在注册表中记录一些用户设置,方便在程序下次启动时读取设置,应用上次用户保存的设置,挺简单的
    2014-04-04
  • C#中的枚举类型(Enum)介绍

    C#中的枚举类型(Enum)介绍

    这篇文章介绍了C#中的枚举类型(Enum),文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • c# DataView.ToTable()方法 去除表的重复项问题

    c# DataView.ToTable()方法 去除表的重复项问题

    这篇文章主要介绍了c# DataView.ToTable()方法 去除表的重复项问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • c# 使用Task实现非阻塞式的I/O操作

    c# 使用Task实现非阻塞式的I/O操作

    这篇文章主要介绍了c# 使用Task实现非阻塞式的I/O操作,帮助大家更好的理解和学习c# 编程语言,感兴趣的朋友可以了解下
    2020-11-11
  • 基于C#实现获取本地磁盘目录

    基于C#实现获取本地磁盘目录

    这篇文章主要为大家详细介绍了如何利用C#实现获取本地磁盘目录的功能,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-12-12
  • C#集合之并发集合的用法

    C#集合之并发集合的用法

    这篇文章介绍了C#集合之并发集合的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04

最新评论