手把手教你爬取優酷電影信息 -1


爬蟲的制作主要分為三個方面
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();
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM