4.爬虫框架Clawler 爬取优酷电影名 分页+多线程

简介: 代码下载地址:https://github.com/happlyfox/FoxCrawler/tree/master/%E5%AD%A6%E4%B9%A0%E7%A4%BA%E4%BE%8B/YouKuCrawler/YouKuDotnetSpide...

代码下载地址:

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

基于文章三我们实现了爬虫框架单页面应用程序的代码,那么在这一章节我们将使用框架进行内容分页和多线程的操作

首先附上代码

public class YouKuCrawer
    {
        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;
        }

        /// <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);
        }
    }

因为所有的页面内容都相同,只是网站地址(url)不同,所以我首先得到所有的地址集合,然后赋给框架,让框架识别。

            // 添加初始采集链接
           //  定义采集的 Site 对象, 设置 Header、Cookie、代理等
            var site = new Site { EncodingName = "UTF-8" };
            foreach (var node in YouKuCrawer.GetVideoTypes())
            {
                //得到当前类别总分页数
                var pageCount = YouKuCrawer.GetPageCountByCode(node.Code);
                for (int pageIndex = 1; pageIndex <= pageCount; pageIndex++)
                {
                    site.AddStartUrl($"http://list.youku.com/category/show/{node.Code}_s_1_d_1_p_{pageIndex}.html");
                }
            }

首先定时采集的site对象,然后site对象添加需要解析的相同的url。在上述操作完成后,我们开始进行“解析器”类和“管道”类的书写。

解析器类

 public class YoukuPipeline : BasePipeline
    {
        public override void Process(IEnumerable<ResultItems> resultItems, ISpider spider)
        {
            var resultItem= resultItems.FirstOrDefault();

            foreach (VideoContent entry in resultItem.GetResultItem("VideoResult"))
            {
                Console.WriteLine($"{entry.Title}\t\t{entry.Href}");
            }
        }
    }

管道类

 public class YoukuPipeline : BasePipeline
    {
        public override void Process(IEnumerable<ResultItems> resultItems, ISpider spider)
        {
            var resultItem= resultItems.FirstOrDefault();

            foreach (VideoContent entry in resultItem.GetResultItem("VideoResult"))
            {
                Console.WriteLine($"{entry.Title}\t\t{entry.Href}");
            }
        }
    }

最后对定义的内容进行整理

 public static void CustmizeProcessorAndPipeline()
       {
           //  定义采集的 Site 对象, 设置 Header、Cookie、代理等
           var site = new Site { EncodingName = "UTF-8" };

           // 添加初始采集链接
           foreach (var node in YouKuCrawer.GetVideoTypes())
           {
               //得到当前类别总分页数
               var pageCount = YouKuCrawer.GetPageCountByCode(node.Code);
               for (int pageIndex = 1; pageIndex <= pageCount; pageIndex++)
               {
                   site.AddStartUrl($"http://list.youku.com/category/show/{node.Code}_s_1_d_1_p_{pageIndex}.html");
               }
           }

           Spider spider = Spider.Create(site,
                   // 使用内存调度
                   new QueueDuplicateRemovedScheduler(),
                   // 为优酷自定义的 Processor
                   new YoukuPageProcessor())
               //为优酷自定义的 Pipeline
               .AddPipeline(new YoukuPipeline());

           spider.Downloader = new HttpClientDownloader();
           spider.ThreadNum = 10;
           spider.EmptySleepTime = 3000;

           // 启动爬虫
           spider.Run();

       }

线程定义

  spider.ThreadNum = 10;

只需要通过自己的要求来进行赋值,框架自动识别内容优化线程操作。很方便

目录
相关文章
|
13天前
|
数据采集 存储 JSON
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第27天】本文介绍了Python网络爬虫Scrapy框架的实战应用与技巧。首先讲解了如何创建Scrapy项目、定义爬虫、处理JSON响应、设置User-Agent和代理,以及存储爬取的数据。通过具体示例,帮助读者掌握Scrapy的核心功能和使用方法,提升数据采集效率。
57 6
|
1月前
|
数据采集 中间件 开发者
Scrapy爬虫框架-自定义中间件
Scrapy爬虫框架-自定义中间件
|
1月前
|
数据采集 中间件 Python
Scrapy爬虫框架-通过Cookies模拟自动登录
Scrapy爬虫框架-通过Cookies模拟自动登录
|
3月前
|
机器学习/深度学习 数据采集 数据可视化
基于爬虫和机器学习的招聘数据分析与可视化系统,python django框架,前端bootstrap,机器学习有八种带有可视化大屏和后台
本文介绍了一个基于Python Django框架和Bootstrap前端技术,集成了机器学习算法和数据可视化的招聘数据分析与可视化系统,该系统通过爬虫技术获取职位信息,并使用多种机器学习模型进行薪资预测、职位匹配和趋势分析,提供了一个直观的可视化大屏和后台管理系统,以优化招聘策略并提升决策质量。
171 4
|
3月前
|
搜索推荐 前端开发 数据可视化
【优秀python web毕设案例】基于协同过滤算法的酒店推荐系统,django框架+bootstrap前端+echarts可视化,有后台有爬虫
本文介绍了一个基于Django框架、协同过滤算法、ECharts数据可视化以及Bootstrap前端技术的酒店推荐系统,该系统通过用户行为分析和推荐算法优化,提供个性化的酒店推荐和直观的数据展示,以提升用户体验。
151 1
|
14天前
|
数据采集 前端开发 中间件
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第26天】Python是一种强大的编程语言,在数据抓取和网络爬虫领域应用广泛。Scrapy作为高效灵活的爬虫框架,为开发者提供了强大的工具集。本文通过实战案例,详细解析Scrapy框架的应用与技巧,并附上示例代码。文章介绍了Scrapy的基本概念、创建项目、编写简单爬虫、高级特性和技巧等内容。
39 4
|
2月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
1月前
|
数据采集 中间件 数据挖掘
Scrapy 爬虫框架(一)
Scrapy 爬虫框架(一)
|
1月前
|
数据采集 XML 前端开发
Scrapy 爬虫框架(二)
Scrapy 爬虫框架(二)
|
2月前
|
数据采集
爬虫之多线程,提高效率
爬虫之多线程,提高效率