C# 百度搜索结果xpath分析

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("
", string.Empty).Replace(" ", string.Empty));
                }

                foreach (var item in 其他内容)
                {
                    其他内容List.Add(item.InnerText.Trim().Replace(" ", String.Empty).Replace("
", string.Empty).Replace(" ", string.Empty));

                }

                for (int i = 0; i < 其他标题.Count; i++)
                {
                    其他标题List.Add(其他标题[i].InnerText.Trim().Replace(" ", String.Empty).Replace("
", string.Empty).Replace(" ", string.Empty));
                    其他标题链接List.Add(其他标题链接[i].GetAttributeValue("href", "").Trim().Replace(" ", String.Empty).Replace("
", 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] + "	");
                }
                其他最后的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("
", string.Empty).Replace(" ", string.Empty));
                    广告内容List.Add(广告内容[i].InnerText.Trim().Replace(" ", String.Empty).Replace("
", string.Empty).Replace(" ", string.Empty));
                    广告标题链接List.Add(广告标题链接[i].GetAttributeValue("href", "").Trim().Replace(" ", String.Empty).Replace("
", string.Empty).Replace(" ", string.Empty));
                    广告citeList.Add(广告cite[i].InnerText.Trim().Replace(" ", String.Empty).Replace("
", string.Empty).Replace(" ", string.Empty));
                }
                for (int j = 0; j < 广告标题List.Count; j++)
                {
                    广告最后的List.Add(广告标题List[j] + "|" + 广告标题链接List[j] + "|" + 广告内容List[j] + "|" + 广告citeList[j] + "	");
                }
                广告最后的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);
        }
    }
}

  

原文地址:https://www.cnblogs.com/c-x-a/p/6898471.html