c# 爬取優(yōu)酷電影信息(2)
上一章節(jié)中我們實(shí)現(xiàn)了對(duì)優(yōu)酷單頁面的爬取,簡單進(jìn)行回顧一下,使用HtmlAgilityPack庫,對(duì)爬蟲的爬取一共分為三步
爬蟲步驟
- 加載頁面
- 解析數(shù)據(jù)
- 保存數(shù)據(jù)
繼第一篇文檔后的爬蟲進(jìn)階,本文章主要是對(duì)上一篇的進(jìn)階。實(shí)現(xiàn)的功能主要為:
1、爬取電影類別列表
2、循環(huán)每個(gè)類別的電影信息,對(duì)每個(gè)類別的信息分頁爬取
3、爬取的數(shù)據(jù)保存到數(shù)據(jù)庫中
一、爬取電影類別列表

使用Chrome瀏覽器,F(xiàn)12,找到當(dāng)前位置,得到當(dāng)前位置的Xpath。我們需要的數(shù)據(jù)是電影的類別編碼和電影類別名稱。
規(guī)則分析:
XPATH路徑為 "http://*[@id='filterPanel']/div/ul/li/a")
類別編碼為A標(biāo)簽Href路徑的內(nèi)容,我們對(duì)其進(jìn)行截取
類別名稱為A標(biāo)簽InnerTest,我們對(duì)其進(jìn)行截取
代碼示例
//加載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();
//類別列表中去掉【全部】這個(gè)選項(xiàng)
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;
}
二、爬取每個(gè)類別的總分頁數(shù)
code 為電影類別編碼
頁面規(guī)則 $"
根據(jù)頁面規(guī)則進(jìn)行爬?。?/p>
/// <summary>
/// 得到當(dāng)前類別的總頁數(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ù)第二項(xiàng)
var lastsecond = pageList[pageList.Count - 2];
return Convert.ToInt32(lastsecond.InnerText);
}
三、按照頁碼得到每個(gè)電影類別的內(nèi)容
根據(jù)分頁規(guī)則分析出分頁后的地址為
code 為編碼 pageIndex為第幾頁
頁面規(guī)則:http://list.youku.com/category/show/[code]s_1_d_1_p{pageIndex}.html
根據(jù)頁面規(guī)則進(jìn)行爬?。?/p>
/// <summary>
/// 得到當(dāng)前類別的內(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>();
//得到當(dāng)前類別總分頁數(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 總個(gè)數(shù){resultLi.Count}");
count += resultLi.Count;
}
Console.WriteLine($"總個(gè)數(shù)為{count}");
}
代碼下載地址:
以上就是c# 爬取優(yōu)酷電影信息(2)的詳細(xì)內(nèi)容,更多關(guān)于c# 爬取優(yōu)酷電影信息的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#使用帶like的sql語句時(shí)防sql注入的方法
這篇文章主要介紹了C#使用帶like的sql語句時(shí)防sql注入的方法,采用了一個(gè)比較簡單的字符串過濾方法就可以有效提高sql語句的安全性,防止sql注入,需要的朋友可以參考下2014-09-09
C#實(shí)現(xiàn)金額轉(zhuǎn)換成中文大寫金額
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)金額轉(zhuǎn)換成中文大寫金額,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08
C#結(jié)合JavaScript對(duì)Web控件進(jìn)行數(shù)據(jù)輸入驗(yàn)證的實(shí)現(xiàn)方法
在 Web 應(yīng)用的錄入界面,數(shù)據(jù)驗(yàn)證是一項(xiàng)重要的實(shí)現(xiàn)功能,數(shù)據(jù)驗(yàn)證是指確認(rèn) Web 控件輸入或選擇的數(shù)據(jù),本文我們將介紹如何通過C# 后端及JavaScript 前端對(duì) Web 控件進(jìn)行數(shù)據(jù)輸入有效性的驗(yàn)證,感興趣的朋友可以參考一下2024-05-05
C#中Predicate<T>與Func<T, bool>泛型委托的用法實(shí)例
這篇文章主要介紹了C#中Predicate<T>與Func<T, bool>泛型委托的用法,指出了其用法中的誤區(qū)及易錯(cuò)點(diǎn),有助于更好的理解泛型委托的用法,需要的朋友可以參考下2014-09-09

