c# 爬取優(yōu)酷電影信息(2)
上一章節(jié)中我們實現(xiàn)了對優(yōu)酷單頁面的爬取,簡單進行回顧一下,使用HtmlAgilityPack庫,對爬蟲的爬取一共分為三步
爬蟲步驟
- 加載頁面
- 解析數(shù)據(jù)
- 保存數(shù)據(jù)
繼第一篇文檔后的爬蟲進階,本文章主要是對上一篇的進階。實現(xiàn)的功能主要為:
1、爬取電影類別列表
2、循環(huán)每個類別的電影信息,對每個類別的信息分頁爬取
3、爬取的數(shù)據(jù)保存到數(shù)據(jù)庫中
一、爬取電影類別列表
使用Chrome瀏覽器,F(xiàn)12,找到當前位置,得到當前位置的Xpath。我們需要的數(shù)據(jù)是電影的類別編碼和電影類別名稱。
規(guī)則分析:
XPATH路徑為 "http://*[@id='filterPanel']/div/ul/li/a")
類別編碼為A標簽Href路徑的內(nèi)容,我們對其進行截取
類別名稱為A標簽InnerTest,我們對其進行截取
代碼示例
//加載web內(nèi)容 private static readonly string _url = "http://list.youku.com/category/video/c_0.html"; /// <summary> /// 得到所有的類別 /// </summary> public static List<VideoType> GetVideoTypes() { //加載web內(nèi)容 var web = new HtmlWeb(); var doc = web.Load(_url); //內(nèi)容解析-獲得所有的類別 var allTypes = doc.DocumentNode.SelectNodes("http://*[@id='filterPanel']/div/ul/li/a").ToList(); //類別列表中去掉【全部】這個選項 var typeResults = allTypes.Where((u, i) => { return i > 0; }).ToList(); var reList = new List<VideoType>(); foreach (var node in typeResults) { var href = node.Attributes["href"].Value; reList.Add(new VideoType { Code = href.Substring(href.LastIndexOf("/") + 1, href.LastIndexOf(".") - href.LastIndexOf("/") - 1), Name = node.InnerText }); } return reList; }
二、爬取每個類別的總分頁數(shù)
code 為電影類別編碼
頁面規(guī)則 $"
根據(jù)頁面規(guī)則進行爬?。?/p>
/// <summary> /// 得到當前類別的總頁數(shù) /// </summary> public static int GetPageCountByCode(string code) { var web = new HtmlWeb(); var doc = web.Load($"http://list.youku.com/category/show/[code].html"); //分頁列表 var pageList = doc.DocumentNode.CssSelect(".yk-pages li").ToList(); //得到倒數(shù)第二項 var lastsecond = pageList[pageList.Count - 2]; return Convert.ToInt32(lastsecond.InnerText); }
三、按照頁碼得到每個電影類別的內(nèi)容
根據(jù)分頁規(guī)則分析出分頁后的地址為
code 為編碼 pageIndex為第幾頁
頁面規(guī)則:http://list.youku.com/category/show/[code]s_1_d_1_p{pageIndex}.html
根據(jù)頁面規(guī)則進行爬?。?/p>
/// <summary> /// 得到當前類別的內(nèi)容 /// </summary> public static List<VideoContent> GetContentsByCode(string code, int pageIndex) { var web = new HtmlWeb(); var doc = web.Load($"http://list.youku.com/category/show/[code]_s_1_d_1_p_{pageIndex}.html"); var returnLi = new List<VideoContent>(); var contents = doc.DocumentNode.CssSelect(".yk-col4").ToList(); foreach (var node in contents) returnLi.Add(new VideoContent { PageIndex = pageIndex.ToString(), Code = code, Title = node.CssSelect(".info-list .title a").FirstOrDefault()?.InnerText, Hits = node.CssSelect(".info-list li").LastOrDefault()?.InnerText, Href = node.CssSelect(".info-list .title a").FirstOrDefault()?.Attributes["href"].Value, ImgHref = node.CssSelect(".p-thumb img").FirstOrDefault()?.Attributes["Src"].Value }); return returnLi; }
四、測試爬取的結(jié)果
/// <summary> /// 打印得到的內(nèi)容 /// </summary> public static void PrintContent() { var count = 0; foreach (var node in GetVideoTypes()) { var resultLi = new List<VideoContent>(); //得到當前類別總分頁數(shù) var pageCount = GetPageCountByCode(node.Code); //遍歷分頁得到內(nèi)容 for (var i = 1; i <= pageCount; i++) resultLi.AddRange(GetContentsByCode(node.Code, i)); Console.WriteLine($"編碼{node.Code} \t 頁數(shù){pageCount} \t 總個數(shù){resultLi.Count}"); count += resultLi.Count; } Console.WriteLine($"總個數(shù)為{count}"); }
代碼下載地址:
以上就是c# 爬取優(yōu)酷電影信息(2)的詳細內(nèi)容,更多關(guān)于c# 爬取優(yōu)酷電影信息的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
WPF實現(xiàn)Interaction框架的Behavior擴展
這篇文章介紹了WPF實現(xiàn)Interaction框架Behavior擴展的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-06-06