c# 爬取優(yōu)酷電影信息(1)
爬蟲的制作主要分為三個方面
1、加載網(wǎng)頁結(jié)構(gòu)
2、解析網(wǎng)頁結(jié)構(gòu),轉(zhuǎn)變?yōu)榉闲枨蟮臄?shù)據(jù)實體
3、保存數(shù)據(jù)實體(數(shù)據(jù)庫,文本等)
在實際的編碼過程中,找到了一個好的類庫“HtmlAgilityPack”。
介紹:
官網(wǎng):http://html-agility-pack.net/?z=codeplex
Html Agility Pack源碼中的類大概有28個左右,其實不算一個很復(fù)雜的類庫,但它的功能確不弱,為解析DOM已經(jīng)提供了足夠強大的功能支持,可以跟jQuery操作DOM媲美)
使用說明:
Html Agility Pack(XPath 定位),在實際使用過程中,發(fā)現(xiàn)有部分內(nèi)容如果通過Css進行定位會比XPath更加方便,所以通過查找找到了另外一個CSS的解析了類庫 ScrapySharp(Css 定位)
整理:
Nuget包需要引用的庫
1、Html Agility Pack(XPath 定位)
2、ScrapySharp(Css 定位)
代碼下載地址:
https://github.com/happlyfox/FoxCrawler
第一點——加載網(wǎng)頁結(jié)構(gòu)
Html Agility Pack封裝了加載內(nèi)容的方法,使doc.Load(arguments),具有多種重載方式,以下列舉官網(wǎng)的三個實例
/// <summary> /// 加載網(wǎng)頁結(jié)構(gòu) /// </summary> private static void LoadDocment() { // 從文件中加載 var docFile = new HtmlDocument(); docFile.Load("file path"); // 從字符串中加載 var docHtml = new HtmlDocument(); docHtml.LoadHtml("html"); // 從網(wǎng)站中加載 var url = "http://html-agility-pack.net/"; var web = new HtmlWeb(); var docWeb = web.Load(url); }
第二點——解析網(wǎng)頁結(jié)構(gòu),轉(zhuǎn)變?yōu)榉闲枨蟮臄?shù)據(jù)實體
/// <summary> /// 解析網(wǎng)頁結(jié)構(gòu) /// </summary> private static YouKu ParsingWebStructure() { /*選用優(yōu)酷片庫列表 地址:http://list.youku.com/category/show/c_96_s_1_d_1_p_{index}.html */ //首先加載web內(nèi)容 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內(nèi)容 //Console.WriteLine(doc.DocumentNode.InnerHtml); /* HtmlAgilityPack 解析方式官網(wǎng)提供的有倆種示例*/ //1、 With XPath var value = doc.DocumentNode.SelectSingleNode("http://*[@id='total_videonum']").Attributes["id"].Value; var resultCount = doc.DocumentNode.SelectSingleNode("http://*[@id='total_videonum']").InnerText; Console.WriteLine($"id='{value}' 篩選結(jié)果:{resultCount}個"); // 2、With LINQ var linqNodes = doc.DocumentNode.SelectSingleNode("http://*[@id='filterPanel']/div[2]/ul").Descendants("li").ToList(); Console.WriteLine("電影產(chǎn)地:"); 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"); } //構(gòu)造實體 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; } }
第三點——保存數(shù)據(jù)實體,轉(zhuǎn)變?yōu)榉闲枨蟮臄?shù)據(jù)實體
/// <summary> /// 保存數(shù)據(jù)實體 /// </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()); //實例化一個內(nèi)存流,用于存放序列化后的數(shù)據(jù) MemoryStream stream = new MemoryStream(); //使用WriteObject序列化對象 serializer.WriteObject(stream, obj); //寫入內(nèi)存流中 byte[] dataBytes = new byte[stream.Length]; stream.Position = 0; stream.Read(dataBytes, 0, (int)stream.Length); //通過UTF8格式轉(zhuǎn)換為字符串 return Encoding.UTF8.GetString(dataBytes); }
第四點——main
static void Main(string[] args) { ///爬蟲的制作主要分為三個方面 ///1、加載網(wǎng)頁結(jié)構(gòu) ///2、解析網(wǎng)頁結(jié)構(gòu),轉(zhuǎn)變?yōu)榉闲枨蟮臄?shù)據(jù)實體 ///3、保存數(shù)據(jù)實體(數(shù)據(jù)庫,文本等) /* * 在實際的編碼過程中,找到了一個好的類庫“HtmlAgilityPack”。 * 介紹: * 官網(wǎng):http://html-agility-pack.net/?z=codeplex * Html Agility Pack源碼中的類大概有28個左右,其實不算一個很復(fù)雜的類庫,但它的功能確不弱,為解析DOM已經(jīng)提供了足夠強大的功能支持,可以跟jQuery操作DOM媲美) * 使用說明: * Html Agility Pack(XPath 定位),在實際使用過程中,發(fā)現(xiàn)有部分內(nèi)容如果通過Css進行定位會比XPath更加方便,所以通過查找找到了另外一個CSS的解析了類庫 ScrapySharp(Css 定位) * 整理: * Nuget包需要引用的庫 * 1、Html Agility Pack(XPath 定位) * 2、ScrapySharp(Css 定位) */ //第一點——加載網(wǎng)頁結(jié)構(gòu),Html Agility Pack封裝了加載內(nèi)容的方法,使用doc.Load(arguments),具有多種重載方式,以下列舉官網(wǎng)的三個實例 //LoadDocment(); //第二點——解析網(wǎng)頁結(jié)構(gòu),轉(zhuǎn)變?yōu)榉闲枨蟮臄?shù)據(jù)實體 //ParsingWebStructure(); //第三點——保存數(shù)據(jù)實體,轉(zhuǎn)變?yōu)榉闲枨蟮臄?shù)據(jù)實體 SavaData(); Console.Read(); }
以上就是c# 爬取優(yōu)酷電影信息(1)的詳細內(nèi)容,更多關(guān)于c# 爬取優(yōu)酷電影信息的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
DevExpress實現(xiàn)根據(jù)行,列索引來獲取RepositoryItem的方法
這篇文章主要介紹了DevExpress實現(xiàn)根據(jù)行,列索引來獲取RepositoryItem的方法,需要的朋友可以參考下2014-08-08C#使用post發(fā)送和接收數(shù)據(jù)的方法
這篇文章主要介紹了C#使用post發(fā)送和接收數(shù)據(jù)的方法,涉及C#使用post收發(fā)數(shù)據(jù)的相關(guān)技巧,非常具有實用價值,需要的朋友可以參考下2015-04-04C#請求http向網(wǎng)頁發(fā)送接收數(shù)據(jù)的方法
這篇文章主要為大家詳細介紹了C#請求http向網(wǎng)頁發(fā)送數(shù)據(jù)、網(wǎng)頁接收的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07