乐趣区

关于c#:手把手教你爬取优酷电影信息-1

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

在理论的编码过程中,找到了一个好的类库“HtmlAgilityPack”。
介绍:
官网:http://html-agility-pack.net/…
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();}
退出移动版