[ASP.NET][C#] 使用 HtmlAgilityPack 擷取新聞 (爬文機器人)

  • 5331
  • 0
  • C#
  • 2016-07-04

使用 HtmlAgilityPack 擷取 巴哈姆特 新聞

1. 到 Nuget Package 下載 HtmlAgilityPack 套件

2. 新增 using

using System.IO;
using HtmlAgilityPack;
using System.Text;
using System.Net;

3. 於Page_Load插入以下程式碼片段

//指定來源網頁
WebClient url = new WebClient();
//將網頁來源資料暫存到記憶體內
MemoryStream ms = new MemoryStream(url.DownloadData("http://gnn.gamer.com.tw/4/133124.html"));
//以巴哈新聞例http://gnn.gamer.com.tw/
//4/133124.html 表示為文章編號

// 使用 UTF8 編碼讀入 HTML 
HtmlDocument doc = new HtmlDocument();
doc.Load(ms, Encoding.UTF8);

// 裝載第一層查詢結果 
HtmlDocument hdc = new HtmlDocument();

//XPath 來解讀它 /html[1]/body[1]/div[3]
hdc.LoadHtml(doc.DocumentNode.SelectSingleNode("/html[1]/body[1]/div[3]").InnerHtml);
//這邊因為公告內文含有 img tag 所以需使用 InnerHtml
string txt = hdc.DocumentNode.SelectSingleNode(".").InnerHtml.Trim();
// 去頭
int p = txt.IndexOf("<!--區塊1開始-->");
txt = txt.Substring(p);
// 去尾
p = txt.IndexOf("<!--新聞內容結束-->");
txt = txt.Substring(0, p);
// 解析 標題與內文 以字串 "<!--新聞內容開始-->" 分隔
string[] txts = txt.Split(new string[] { "<!--新聞內容開始-->" }, StringSplitOptions.RemoveEmptyEntries);
// 輸出結果
string result = string.Format("標題:{0}<br>內文:<br>{1}", txts[0], txts[1]);
Response.Write(result);

4.前端部分可以把 Default.aspx 的全部 HTML TAG 先刪除 比較乾淨

5.以上參照自:https://dotblogs.com.tw/jackbgova/2014/06/10/145471

6.查詢XPATH可以利用GOOGLE CHROME F12

7.查詢新聞連結清單

string link, XPath;

link = "http://gnn.gamer.com.tw/index.php?k=4";
XPath = "/html[1]/body[1]/div[3]/div[1]/div[5]/div[2]";

// 指定來源網頁
WebClient url = new WebClient();
// 將網頁來源資料暫存到記憶體內
MemoryStream ms = new MemoryStream(url.DownloadData(link));

// 使用 UTF8 編碼讀入 HTML 
HtmlDocument doc = new HtmlDocument();
doc.Load(ms, Encoding.UTF8);

// 裝載第一層查詢結果 
HtmlDocument hdc = new HtmlDocument();

// XPath 來解讀它
hdc.LoadHtml(doc.DocumentNode.SelectSingleNode(XPath).InnerHtml);

HtmlNodeCollection htnode = hdc.DocumentNode.SelectNodes(@"//div[@class='GN-lbox2B']/div/a");
            
foreach (HtmlNode currNode in htnode)
{
   string currLink = currNode.SelectSingleNode(".").Attributes["href"].Value;
   Response.Write(currLink + "<br/>");
}

 

PS5