服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - c# 爬取优酷电影信息(2)

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

2022-11-02 11:21三十三重天 C#

这篇文章主要介绍了c# 如何爬取优酷电影信息,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下

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

爬虫步骤

  • 加载页面
  • 解析数据
  • 保存数据

继第一篇文档后的爬虫进阶,本文章主要是对上一篇的进阶。实现的功能主要为:
1、爬取电影类别列表
2、循环每个类别的电影信息,对每个类别的信息分页爬取
3、爬取的数据保存到数据库中

一、爬取电影类别列表

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

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

代码下载地址:

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

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

原文链接:https://www.cnblogs.com/foxhappy/p/14450481.html

延伸 · 阅读

精彩推荐
  • C#Unity3D仿写Button面板事件绑定功能

    Unity3D仿写Button面板事件绑定功能

    这篇文章主要为大家详细介绍了Unity3D仿写Button面板事件绑定功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    qq_339945667582022-03-10
  • C#C# PC版微信消息监听自动回复的实现方法

    C# PC版微信消息监听自动回复的实现方法

    这篇文章主要介绍了C# PC版微信消息监听自动回复的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    小赫赫4442022-09-08
  • C#C#使用FileSystemWatcher控件实现的文件监控功能示例

    C#使用FileSystemWatcher控件实现的文件监控功能示例

    这篇文章主要介绍了C#使用FileSystemWatcher控件实现的文件监控功能,结合实例形式分析了C# FileSystemWatcher组件的功能及监控文件更改情况的具体使用技巧,需要...

    dodo-yufan8252022-01-19
  • C#剖析设计模式编程中C#对于组合模式的运用

    剖析设计模式编程中C#对于组合模式的运用

    这篇文章主要介绍了设计模式编程中C#对于组合模式的运用,理论上来说组合模式包含抽象构件、树叶构件和树枝构件三个角色,需要的朋友可以参考下...

    张龙豪8842021-11-12
  • C#WPF实现半圆形导航菜单

    WPF实现半圆形导航菜单

    这篇文章主要为大家详细介绍了WPF实现半圆形导航菜单,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    RunnerDNA4702022-10-08
  • C#理解C#中参数的值和引用以及传递结构和类引用的区别

    理解C#中参数的值和引用以及传递结构和类引用的区别

    这篇文章主要介绍了理解C#中参数的值和引用以及传递结构和类引用的区别,文中举了两段代码例子来简单说明,需要的朋友可以参考下...

    C#教程网4892021-11-09
  • C#C# 使用相同权限调用 cmd 传入命令的方法

    C# 使用相同权限调用 cmd 传入命令的方法

    本文告诉大家如何使用相同权限调用cmd并且传入命令,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下吧...

    lindexi8372022-02-25
  • C#C# RSA分段加解密实现方法详解

    C# RSA分段加解密实现方法详解

    这篇文章主要介绍了C# RSA分段加解密实现方法,结合具体实例形式分析了C# RSA加密解密的原理与具体实现技巧,需要的朋友可以参考下...

    FrankYou8022021-12-30