C#爬取動態(tài)網(wǎng)頁上信息得流程步驟
簡介
動態(tài)內(nèi)容網(wǎng)站使用 JavaScript 腳本動態(tài)檢索和渲染數(shù)據(jù),爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。
本文使用的爬取步驟如下:
使用 Selenium 獲取渲染后的 HTML 文檔
使用 HtmlAgilityPack 解析 HTML 文檔
新建項(xiàng)目,安裝需要的庫:
Selenium.WebDriver
HtmlAgilityPack
獲取 HTML 文檔
需要注意的主要是以下2點(diǎn):
設(shè)置瀏覽器啟動參數(shù):無頭模式、禁用GPU加速、設(shè)置啟動時窗口大小
等待頁面動態(tài)加載完成:等待5秒鐘,設(shè)置一個合適的時間即可
private static string GetHtml(string url) { ChromeOptions options = new ChromeOptions(); // 不顯示瀏覽器 options.AddArgument("--headless"); // GPU加速可能會導(dǎo)致Chrome出現(xiàn)黑屏及CPU占用率過高 options.AddArgument("--nogpu"); // 設(shè)置chrome啟動時size大小 options.AddArgument("--window-size=10,10"); using (var driver = new ChromeDriver(options)) { try { driver.Manage().Window.Minimize(); driver.Navigate().GoToUrl(url); // 等待頁面動態(tài)加載完成 Thread.Sleep(5000); // 返回頁面源碼 return driver.PageSource; } catch (NoSuchElementException) { Console.WriteLine("找不到該元素"); return string.Empty; } } }
解析 HTML 文檔
這里以B站為例,爬取B站UP主主頁上的視頻信息,如視頻的標(biāo)題、鏈接、封面。
先定義一個類來保存信息:
class VideoInfo { public string Title { get; set; } public string Href { get; set; } public string ImgUrl { get; set; } }
定義解析函數(shù),返回視頻信息列表:
private static List<VideoInfo> GetVideoInfos(string url) { List<VideoInfo> videoInfos = new List<VideoInfo>(); // 加載文檔 var html = GetHtml(url); var htmlDoc = new HtmlDocument(); htmlDoc.LoadHtml(html); // 解析文檔,先定位到視頻列表標(biāo)簽 var xpath = "/html/body/div[2]/div[4]/div/div/div[1]/div[2]/div/div"; var htmlNodes = htmlDoc.DocumentNode.SelectNodes(xpath); // 循環(huán)解析它的子節(jié)點(diǎn)視頻信息 foreach (var node in htmlNodes) { var titleNode = node.SelectSingleNode("a[2]"); var imgNode = node.SelectSingleNode("a[1]/div[1]/picture/source[1]"); var title = titleNode.InnerText; var href = titleNode.Attributes["href"].Value.Trim('/'); var imgUrl = imgNode.Attributes["srcset"].Value.Split('@')[0].Trim('/'); videoInfos.Add(new VideoInfo { Title = title, Href = href, ImgUrl = imgUrl }); } return videoInfos; }
視頻列表標(biāo)簽的 XPath 路徑是通過瀏覽器調(diào)試工具,在指定標(biāo)簽上右鍵 復(fù)制完整的XPath 得到:
分析代碼中的 node 節(jié)點(diǎn)時,html文本格式可能很亂,可以通過在線 HTML 代碼格式化 工具格式后再進(jìn)行分析。
測試
以B站UP主 星瞳_Official 為例,爬取視頻信息:
static void Main(string[] args) { var url = @"https://space.bilibili.com/401315430"; var videoInfos = GetVideoInfos(url); foreach (var videoInfo in videoInfos) { Console.WriteLine(videoInfo.Title); Console.WriteLine(videoInfo.Href); Console.WriteLine(videoInfo.ImgUrl); Console.WriteLine(); } Console.ReadKey(); }
結(jié)果如下:
等一下,好妹妹 www.bilibili.com/video/BV1uyxLeJEM9 i0.hdslb.com/bfs/archive/46a15065d1b6722a04696ffaaa2235287ceaa452.jpg 一口一個?你的超甜辣椒 www.bilibili.com/video/BV1AQsDeiEn1 i0.hdslb.com/bfs/archive/d93d47d67323ee284483e963ffed34fb9884cf61.jpg
這里只是演示爬取動態(tài)頁面的方法,如果想獲取B站UP主的視頻信息,建議直接使用 API 請求數(shù)據(jù)。
最后
以上就是C#爬取動態(tài)網(wǎng)頁上信息得流程步驟的詳細(xì)內(nèi)容,更多關(guān)于C#爬取動態(tài)網(wǎng)頁信息的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
利用C#與PLC通信實(shí)現(xiàn)設(shè)備遠(yuǎn)程控制與管理
PLC是工業(yè)自動化中用于控制機(jī)械設(shè)備、生產(chǎn)線等的核心設(shè)備,通過與PLC的通信,我們可以實(shí)現(xiàn)設(shè)備的遠(yuǎn)程監(jiān)控、數(shù)據(jù)采集等功能,C#作為一種現(xiàn)代化的編程語言,能夠非常方便地與PLC進(jìn)行通信,本文將介紹如何利用C#與PLC進(jìn)行通信,并實(shí)現(xiàn)設(shè)備的遠(yuǎn)程控制與管理2025-02-02C#中使用Override和New關(guān)鍵字進(jìn)行版本控制
在?C#?中,override?和?new?關(guān)鍵字用于控制類之間的成員方法的隱藏和重寫,理解它們之間的差異和使用場景對于設(shè)計(jì)靈活且易于維護(hù)的代碼至關(guān)重要,在這篇博客中,我們將詳細(xì)探討這兩個關(guān)鍵字的用法,并通過示例來說明它們的實(shí)際應(yīng)用,需要的朋友可以參考下2024-10-10