C# 百度搜索結果xpath分析
阿新 • • 發佈:2017-05-24
als 接收數據 har rim resp inner ets webclient containe
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; using HtmlAgilityPack; namespace xpathGet { class Program { #region webclient創建 public class WebClientBD : System.Net.WebClient { protected override System.Net.WebRequest GetWebRequest(Uri address) { HttpWebRequest request = base.GetWebRequest(address) as HttpWebRequest; request.AllowAutoRedirect = false; request.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip; request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"; return request; } public WebResponse Response { get; private set; } protected override WebResponse GetWebResponse(WebRequest request) { try { this.Response = base.GetWebResponse(request); } catch { } return this.Response; } } public static string lastUrl(string url) { byte[] pageData = null; string lasturl = null; string redirectLocal = null; try { WebClientBD wc = new WebClientBD(); // 創建WebClient實例提供向URI 標識的資源發送數據和從URI 標識的資源接收數據 wc.Credentials = CredentialCache.DefaultCredentials; // 獲取或設置用於對向 Internet 資源的請求進行身份驗證的網絡憑據。 Encoding enc = Encoding.GetEncoding("utf-8"); // 如果是亂碼就改成 utf-8 / GB2312 pageData = wc.DownloadData(url); // 從資源下載數據並返回字節數組。 if ((wc.Response as HttpWebResponse).StatusCode == HttpStatusCode.Found) { redirectLocal = ((wc.Response as HttpWebResponse).Headers["location"].StartsWith("http") == true ? string.Empty : "http://www.baidu.com") + (wc.Response as HttpWebResponse).Headers["location"]; wc = new WebClientBD(); // 創建WebClient實例提供向URI 標識的資源發送數據和從URI 標識的資源接收數據 wc.Credentials = CredentialCache.DefaultCredentials; // 獲取或設置用於對向 Internet 資源的請求進行身份驗證的網絡憑據。 pageData = wc.DownloadData(redirectLocal); if ((wc.Response as HttpWebResponse).StatusCode == HttpStatusCode.Found) { lasturl = (wc.Response as HttpWebResponse).Headers["location"]; } else if ((wc.Response as HttpWebResponse).StatusCode == HttpStatusCode.OK) { lasturl = redirectLocal; } } return lasturl; } catch (Exception ex) { return "error:" + ex.Message; } } #endregion public static string GetHtmlSource(string url) { WebClientBD wc = new WebClientBD(); // 創建WebClient實例提供向URI 標識的資源發送數據和從URI 標識的資源接收數據 wc.Credentials = CredentialCache.DefaultCredentials; // 獲取或設置用於對向 Internet 資源的請求進行身份驗證的網絡憑據。 Encoding enc = Encoding.GetEncoding("utf-8"); // 如果是亂碼就改成 utf-8 / GB2312 var pageData = wc.DownloadData(url); // 從資源下載數據並返回字節數組。 return enc.GetString(pageData); } static void Main(string[] args) { #region 翻頁URL //http://www.baidu.com/s?wd={0}&pn={1}&oq={0}&ie=utf-8&usm=4 #endregion string address = "http://www.baidu.com/s?wd={0}&pn={1}0&oq={0}&ie=utf-8&usm=4"; string key = "代購"; string htmlPageSource = string.Empty; List<string> 其他最後的List = new List<string>(); List<string> 廣告最後的List = new List<string>(); string 廣告 = "//div[@id=‘content_left‘]//div[contains(@id,‘300‘)]{0}|//div[@id=‘content_left‘]//div[contains(@id,‘400‘)]{1}"; string 其他 = "//div[@id=‘content_left‘]//div[contains(@class,‘c-container‘)]{0}"; //取標題 for (int pnIndex = 0; pnIndex < 5; pnIndex++) { HtmlDocument doc = new HtmlDocument(); List<string> 其他標題List = new List<string>(); List<string> 其他標題鏈接List = new List<string>(); List<string> 其他內容List = new List<string>(); List<string> 其他citeList = new List<string>(); List<string> 廣告標題List = new List<string>(); List<string> 廣告標題鏈接List = new List<string>(); List<string> 廣告內容List = new List<string>(); List<string> 廣告citeList = new List<string>(); htmlPageSource = GetHtmlSource(string.Format(address, key, pnIndex.ToString())); doc.LoadHtml(htmlPageSource); // doc.Load("D:\\rootInfo.html", Encoding.UTF8); HtmlNodeCollection 廣告標題 = doc.DocumentNode.SelectNodes(string.Format(廣告, "/div[1]/h3/a[1]", "/div[1]/h3/a[1]")); HtmlNodeCollection 廣告標題鏈接 = doc.DocumentNode.SelectNodes(string.Format(廣告, "/div[1]/h3/a[1]", "/div[1]/h3/a[1]")); HtmlNodeCollection 廣告內容 = doc.DocumentNode.SelectNodes(string.Format(廣告, "/div[2]", "/div[2]")); HtmlNodeCollection 廣告cite = doc.DocumentNode.SelectNodes(string.Format(廣告, "/div[2]//a/span[1]", "/div[3]/a/span")); HtmlNodeCollection 其他標題 = doc.DocumentNode.SelectNodes(string.Format(其他, "/h3/a[1]")); HtmlNodeCollection 其他標題鏈接 = doc.DocumentNode.SelectNodes(string.Format(其他, "/h3/a[1]")); HtmlNodeCollection 其他內容 = doc.DocumentNode.SelectNodes(string.Format(其他, "//div[@class=‘c-abstract‘]") + "|" + string.Format(其他, "//div[‘c-span18 c-span-last‘]/p[1]") + "|" + string.Format(其他, "//div[@class=‘c-offset‘]") + "|" + string.Format(其他, "//div[@class=‘op_dict_content‘]") + "|" + string.Format(其他, "//p[contains(text(),‘由於該網站的robots.txt文件存在限制指令‘)]")); HtmlNodeCollection 其他cite = doc.DocumentNode.SelectNodes(string.Format(其他, "//span[@class=‘c-showurl‘]") + "|" + string.Format(其他, "//a[@class=‘c-showurl‘]")); //分析每個結果都有一個標題,現在是最新相關信息的結果沒有cite,判斷哪個沒有cite給其賦值“new info” //如果有最新相關信息的結果 ,假設標題有9個結果,則cite有8個。 // 1.如果最新消息在最後一個此時標題的index=8,cite的index=8,最後一個標題index=9,但是cite的index是不存在的所以添加一個元素“new info。其他位置則插入元素 foreach (var item in 其他cite) { 其他citeList.Add(item.InnerText.Trim().Replace(" ", String.Empty).Replace("\n", string.Empty).Replace(" ", string.Empty)); } foreach (var item in 其他內容) { 其他內容List.Add(item.InnerText.Trim().Replace(" ", String.Empty).Replace("\n", string.Empty).Replace(" ", string.Empty)); } for (int i = 0; i < 其他標題.Count; i++) { 其他標題List.Add(其他標題[i].InnerText.Trim().Replace(" ", String.Empty).Replace("\n", string.Empty).Replace(" ", string.Empty)); 其他標題鏈接List.Add(其他標題鏈接[i].GetAttributeValue("href", "").Trim().Replace(" ", String.Empty).Replace("\n", string.Empty).Replace(" ", string.Empty)); } if (其他標題List.Count != 其他citeList.Count) { if (其他標題[其他citeList.Count].InnerText.Contains("的最新相關信息")) { 其他citeList.Add("new info"); } else { for (int i = 0; i < 其他標題List.Count; i++) { if (其他標題List[i].Contains("的最新相關信息")) { 其他citeList.Insert(i, "new info"); } } } } // List<string> 其他最後的List = new List<string>(); for (int j = 0; j < 其他標題List.Count; j++) { 其他最後的List.Add(其他標題List[j] + "|" + 其他標題鏈接List[j] + "|" + 其他內容List[j] + "|" + 其他citeList[j] + "\t"); } 其他最後的List.Add(String.Format("以上為第{0}頁搜索結果。", pnIndex + 1)); string path = @"d:\\infolist_Page" + (pnIndex+1) + ".html"; File.WriteAllText(path, htmlPageSource, Encoding.UTF8); for (int i = 0; i < 廣告標題.Count; i++) { 廣告標題List.Add(廣告標題[i].InnerText.Trim().Replace(" ", String.Empty).Replace("\n", string.Empty).Replace(" ", string.Empty)); 廣告內容List.Add(廣告內容[i].InnerText.Trim().Replace(" ", String.Empty).Replace("\n", string.Empty).Replace(" ", string.Empty)); 廣告標題鏈接List.Add(廣告標題鏈接[i].GetAttributeValue("href", "").Trim().Replace(" ", String.Empty).Replace("\n", string.Empty).Replace(" ", string.Empty)); 廣告citeList.Add(廣告cite[i].InnerText.Trim().Replace(" ", String.Empty).Replace("\n", string.Empty).Replace(" ", string.Empty)); } for (int j = 0; j < 廣告標題List.Count; j++) { 廣告最後的List.Add(廣告標題List[j] + "|" + 廣告標題鏈接List[j] + "|" + 廣告內容List[j] + "|" + 廣告citeList[j] + "\t"); } 廣告最後的List.Add(String.Format("以上為第{0}頁搜索結果。", pnIndex + 1)); } File.WriteAllLines(@"d:\\infolist.txt", 其他最後的List.ToArray(), Encoding.UTF8); File.WriteAllLines(@"d:\\infolist2.txt", 廣告最後的List.ToArray(), Encoding.UTF8); } } }
C# 百度搜索結果xpath分析