前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >3. 爬虫框架Clawler 爬取优酷电影名

3. 爬虫框架Clawler 爬取优酷电影名

作者头像
happlyfox
发布2018-10-31 14:46:25
5670
发布2018-10-31 14:46:25
举报
文章被收录于专栏:技术开源分享技术开源分享

之前我们都是使用HtmlAgilityPack类库来进行页面的爬取,今天我们使用一个爬虫框架。

框架名称:Clawler 参考地址

框架设计

由于我是参考的webmagic,所以整体架构上没有什么大的变化,设计图如下(图片是直接从webmagic上拿的)

设计图

  • Scheduler:负责URL的调度、去重,可以实现如Queue, PriorityQueueScheduler, RedisScheduler(可用于分布式)等等
  • Downloader: 负责下载HTML,可以实现如HttpDownloader, 浏览器的Downloader(WebDriver), FiddlerDownloader,本地文件Downloader等等
  • PageProcesser: 负责HTML解析、目标URL的选择
  • Pipeline: 负责数据的存储, 已实现文件存储, MySql存储, MySqlFile存储(脚本),MSSQL存储,MongoDb存储, 更多存储期待您的贡献

优点

  • 可以使用Json定义爬虫
  • 可以使用实体类+Attrbiute定义爬虫
  • 自动创建数据库、数据表
  • 支持 .NET CORE,可以跨平台
  • 支持ADSL拨号换IP:如果所有爬虫统一部署, 可以实现单台机器同时运行多个任务拨号互不影响、或者一个路由下面多个电脑下多个任务拨号互不影响
  • 支持自定义代理池
  • 有管理平台

一、框架使用

我们通过HtmlAgilityPack 爬取优酷电影名的例子进行说明。

当前例子是很简单的单页面的爬取, 只爬取页面上的几个固定位置的参数内容。

我们首先来说明一下,爬虫框架的使用。框架因为定义好了四个操作流程,所以编码人员在实际过程中只要大概了解框架的使用原理即可上手操作。

用户的一般使用,采用最基本的方式。只要关心俩个类,一个是当前PageProcesser 页面的处理逻辑,一个是Pipeline爬取的数据的存储。

通过分析,我们发现一般的爬虫程序大部分内容无非也就是在梳理这俩个东西。

在框架中我们不需要关心网页的调度内容,只需要关心我们需要爬取什么内容(爬取的逻辑)和数据的存储(管道)。

放代码如下:

首先是当前页面的解析类

    public class YoukuPageProcessor : BasePageProcessor
    {
        protected override void Handle(Page page)
        {
            // 利用 Selectable 查询并构造自己想要的数据对象
            var totalVideoElement = page.Selectable.Select(Selectors.XPath("//*[@id='total_videonum']"));
            var id = totalVideoElement.XPath("@id").GetValue();
            string videoNum = totalVideoElement.GetValue();

            var linqNodes = page.Selectable.Select(Selectors.XPath("//*[@id='filterPanel']/div[2]/ul")).XPath("li").Nodes();
            var videoCountry = new List<string>();
            foreach (var node in linqNodes)
            {
                string text = node.GetValue(ValueOption.InnerText);
                videoCountry.Add(text);
                //Console.WriteLine($"{text}");
            }

            var results = new YouKu()
            {
                id = id,
                videoNum = Convert.ToInt32(videoNum),
                videoCountry = videoCountry
            };

            // 以自定义KEY存入page对象中供Pipeline调用
            page.AddResultItem("VideoResult", results);

        }
    }

然后是当前页面的输出类

    /// <summary>
    /// 优酷爬虫管道
    /// </summary>
    public class YoukuPipeline : BasePipeline
    {
        public override void Process(IEnumerable<ResultItems> resultItems, ISpider spider)
        {
            ResultItems result = resultItems.First();
            StringBuilder builder = new StringBuilder();

            YouKu entry = result.Results["VideoResult"];
            builder.Append($"输出 [YouKu {entry.id}] {entry.videoNum}");
            Console.WriteLine(builder.ToString());

            // Other actions like save data to DB. 可以自由实现插入数据库或保存到文件
        }
    }

最后整合爬虫任务

     /// <summary>
       /// 定义处理器和管道
       /// </summary>
       public static void CustmizeProcessorAndPipeline()
       {
           // 定义采集的 Site 对象, 设置 Header、Cookie、代理等
           var site = new Site();
           //  添加初始采集链接
           site.AddStartUrl($"http://list.youku.com/category/show/c_96_s_1_d_1_p_1.html");

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

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

           // 启动爬虫
           spider.Run();
       }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.05.14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 框架设计
  • 优点
  • 一、框架使用
    • 首先是当前页面的解析类
      • 然后是当前页面的输出类
        • 最后整合爬虫任务
        相关产品与服务
        云数据库 Redis
        腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档