1.HtmlAgilityPack 爬取优酷电影名

爬虫的制作主要分为三个方面 1、加载网页结构 2、解析网页结构,转变为符合需求的数据实体 3、保存数据实体(数据库,文本等)

在实际的编码过程中,找到了一个好的类库“HtmlAgilityPack”。 介绍: 官网:http://html-agility-pack.net/?z=codeplex Html Agility Pack源码中的类大概有28个左右,其实不算一个很复杂的类库,但它的功能确不弱,为解析DOM已经提供了足够强大的功能支持,可以跟jQuery操作DOM媲美) 使用说明: Html Agility Pack(XPath 定位),在实际使用过程中,发现有部分内容如果通过Css进行定位会比XPath更加方便,所以通过查找找到了另外一个CSS的解析了类库 ScrapySharp(Css 定位)

整理: Nuget包需要引用的库 1、Html Agility Pack(XPath 定位) 2、ScrapySharp(Css 定位)

代码下载地址:

https://github.com/happlyfox/FoxCrawler

第一点——加载网页结构

Html Agility Pack封装了加载内容的方法,使doc.Load(arguments),具有多种重载方式,以下列举官网的三个实例

       /// <summary>
       /// 加载网页结构
       /// </summary>
       private static void LoadDocment()
       {
           // 从文件中加载
           var docFile = new HtmlDocument();
           docFile.Load("file path");

           // 从字符串中加载
           var docHtml = new HtmlDocument();
           docHtml.LoadHtml("html");

           // 从网站中加载
           var url = "http://html-agility-pack.net/";
           var web = new HtmlWeb();
           var docWeb = web.Load(url);
       }

第二点——解析网页结构,转变为符合需求的数据实体

   /// <summary>
    /// 解析网页结构
    /// </summary>
    private static YouKu ParsingWebStructure()
    {
        /*选用优酷片库列表
         地址:http://list.youku.com/category/show/c_96_s_1_d_1_p_{index}.html 
        */

        //首先加载web内容
        var url = "http://list.youku.com/category/show/c_96_s_1_d_1_p_1.html";
        var web = new HtmlWeb();
        var doc = web.Load(url);

        //输出WebHtml内容
        //Console.WriteLine(doc.DocumentNode.InnerHtml);

        /* HtmlAgilityPack 解析方式官网提供的有俩种示例*/
        //1、 With XPath 
        var value = doc.DocumentNode.SelectSingleNode("//*[@id='total_videonum']").Attributes["id"].Value;
        var resultCount = doc.DocumentNode.SelectSingleNode("//*[@id='total_videonum']").InnerText;

        Console.WriteLine($"id='{value}' 筛选结果:{resultCount}个");
        // 2、With LINQ  
        var linqNodes = doc.DocumentNode.SelectSingleNode("//*[@id='filterPanel']/div[2]/ul").Descendants("li").ToList();

        Console.WriteLine("电影产地:");
        List<string> videoCountry = new List<string>();
        foreach (var node in linqNodes)
        {
            videoCountry.Add(node.InnerText);
            Console.Write($"{node.InnerText} \t");
        }

        //3、使用ScrapySharp进行Css定位
        var cssNodes = doc.DocumentNode.CssSelect("#filterPanel > div > label");
        Console.WriteLine();

        List<string> videoType = new List<string>();
        foreach (var node in cssNodes)
        {
            videoType.Add(node.InnerText);
            Console.Write($"{node.InnerText} \t");
        }

        //构造实体
        YouKu model = new YouKu()
        {
            id = value,
            videoNum = int.Parse(resultCount),
            videoCountry = videoCountry,
            videoType = videoType
        };

        return model;
    }


public class YouKu
{
    public string id { get; set; }

    public int videoNum { get; set; }

    public List<string> videoCountry { get; set; }
    public List<string> videoType { get; set; }
}

第三点——保存数据实体,转变为符合需求的数据实体

    /// <summary>
    /// 保存数据实体
    /// </summary>
    private static void SavaData()
    {
        var model = ParsingWebStructure();
        var path = "youku.txt";

        if (!File.Exists(path))
        {
            File.Create(path);
        }

        File.WriteAllText(path, getJsonByObject(model));
    }

    private static string getJsonByObject(Object obj)
    {
        //实例化DataContractJsonSerializer对象,需要待序列化的对象类型
        DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
        //实例化一个内存流,用于存放序列化后的数据
        MemoryStream stream = new MemoryStream();
        //使用WriteObject序列化对象
        serializer.WriteObject(stream, obj);
        //写入内存流中
        byte[] dataBytes = new byte[stream.Length];
        stream.Position = 0;
        stream.Read(dataBytes, 0, (int)stream.Length);
        //通过UTF8格式转换为字符串
        return Encoding.UTF8.GetString(dataBytes);
    }

四 Main

  static void Main(string[] args)
    {
        ///爬虫的制作主要分为三个方面
        ///1、加载网页结构
        ///2、解析网页结构,转变为符合需求的数据实体
        ///3、保存数据实体(数据库,文本等)


        /*
         * 在实际的编码过程中,找到了一个好的类库“HtmlAgilityPack”。
         * 介绍:
         * 官网:http://html-agility-pack.net/?z=codeplex
         * Html Agility Pack源码中的类大概有28个左右,其实不算一个很复杂的类库,但它的功能确不弱,为解析DOM已经提供了足够强大的功能支持,可以跟jQuery操作DOM媲美)
         * 使用说明:
         * Html Agility Pack(XPath 定位),在实际使用过程中,发现有部分内容如果通过Css进行定位会比XPath更加方便,所以通过查找找到了另外一个CSS的解析了类库 ScrapySharp(Css 定位)
         * 整理:
         * Nuget包需要引用的库
         * 1、Html Agility Pack(XPath 定位)
         * 2、ScrapySharp(Css 定位)
         */


        //第一点——加载网页结构,Html Agility Pack封装了加载内容的方法,使用doc.Load(arguments),具有多种重载方式,以下列举官网的三个实例
        //LoadDocment();

        //第二点——解析网页结构,转变为符合需求的数据实体
        //ParsingWebStructure();

        //第三点——保存数据实体,转变为符合需求的数据实体
        SavaData();
        Console.Read();
    }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张善友的专栏

在Linux和Windows平台上操作MemoryMappedFile(简称MMF)

操作系统很早就开始使用内存映射文件(Memory Mapped File)来作为进程间的共享存储区,这是一种非常高效的进程通讯手段。.NET 4.0新增加了一个...

2096
来自专栏张善友的专栏

编写前置和后置条件的连贯接口库:CuttingEdge.Conditions

当调用一个方法时,在其执行之前期望其处于特定状态; 也需要完成一些工作之后验证结果的状态。 这些假设被称为前置条件(pre-conditions )和 后置条件...

2077
来自专栏大内老A

让我们的ASP.NET MVC应用可以单独维护验证消息

在项目开发中,我们会使用到很多的描述性文字,比如验证消息、错误消息和确认消息等,让这些文本消息具有可维护性具有重要的意义。虽然我们可以将它们存储于资源文件中,并...

1977
来自专栏hotqin888的专栏

tealeg/xlsx遇到读取空表格错误

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hotqin888/article/det...

1372
来自专栏逸鹏说道

c# 温故而知新: 线程篇(一) 下

Abort 方法: 其实 Abort 方法并没有像字面上的那么简单,释放并终止调用线程,其实当一个线程调用 Abort方法时,会在调用此方法的线程上引发一个异常...

2606
来自专栏vue

.Net—反射

新建一个空白解决方案,添加一个控制台应用程序和一个名为Common的类库。在Common里面添加一个Person类和Student类,代码如下

1773
来自专栏

.NET 2.0 Web Services的bug?

今天测试.net 2.0的WebService,发现了一个大问题。就是无法获取参数,参数永远是null。当然了使用.net调用没有任何问题,web测试页也正常。...

862
来自专栏liulun

ASP.NET Core教程【三】实体字段属性、链接标签、并发数据异常、文件上传及读取

前文索引: ASP.NET Core教程【二】从保存数据看Razor Page的特有属性与服务端验证 ASP.NET Core教程【一】关于Razor Page...

2916
来自专栏大内老A

通过自定义配置实现插件式设计

软件设计有一句话叫做“约定优于配置”,很多人将其作为拒绝配置的理由。但是,“约定”和“配置”的使用,都有个度的问题。我不赞为了所谓的扩展性,为你的应用设计一套只...

2388
来自专栏Android知识点总结

2-SIII-Android数据固化之Xml的Pull解析和存储

1093

扫码关注云+社区