1. 程式人生 > >C# 百度搜索結果xpath分析

C# 百度搜索結果xpath分析

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分析