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分析的更多相关文章

  1. PHP网络爬虫实践:抓取百度搜索结果,并分析数据结构

    百度的搜索引擎有反爬虫机制,我先直接用guzzle试试水.代码如下: <?php /** * Created by Benjiemin * Date: 2020/3/5 * Time: 14:5 ...

  2. python--selenium简单模拟百度搜索点击器

    python--selenium简单模拟百度搜索点击器 发布时间:2018-02-28 来源:网络 上传者:用户 关键字: selenium 模拟 简单 点击 搜索 百度 发表文章摘要:用途:简单模拟 ...

  3. Python:输入关键字进行百度搜索并爬取搜索结果

    学习自:手把手教你用Python爬取百度搜索结果并保存 - 云+社区 - 腾讯云 如何利用python模拟百度搜索,Python交流,技术交流区,鱼C论坛 指定关键字,对其进行百度搜索,保存搜索结果, ...

  4. Splinter学习--初探1,模拟百度搜索

    Splinter是以Selenium, PhantomJS 和 zope.testbrowser为基础构建的web自动化测试工具,基本原理同selenium 支持的浏览器包括:Chrome, Fire ...

  5. 利用python爬取海量疾病名称百度搜索词条目数的爬虫实现

    实验原因: 目前有一个医疗百科检索项目,该项目中对关键词进行检索后,返回的结果很多,可惜结果的排序很不好,影响用户体验.简单来说,搜索出来的所有符合疾病中,有可能是最不常见的疾病是排在第一个的,而最有 ...

  6. jsonp跨越请求百度搜索api 实现下拉列表提示

    题目来源: 最近在做百度IFE前端技术学院的题,然后有一题就是模拟百度搜索智能提示.题目是开源的,稍后给出地址. 因为博主没学过后端啊,欲哭无泪,所以不能实现后端模糊搜索,那如果前端ajax纯粹请求一 ...

  7. 百度搜索URL参数 搜索关键字

    http://www.baidu.com/s?wd=关键字 wd(Keyword):查询的关键词: http://www.baidu.com/s?wd=关键字&cl=3 cl(Class):搜 ...

  8. python爬取百度搜索结果ur汇总

    写了两篇之后,我觉得关于爬虫,重点还是分析过程 分析些什么呢: 1)首先明确自己要爬取的目标 比如这次我们需要爬取的是使用百度搜索之后所有出来的url结果 2)分析手动进行的获取目标的过程,以便以程序 ...

  9. 使用curl制作简易百度搜索

    这几天研究了一下php中的curl类库,做了一个简单的百度搜索,先上代码 <div style="width:200px;height:100px;"> <div ...

随机推荐

  1. MyEclipse同时配置多个tomcat

    步骤: 1.可以把原有tomcat复制一份,或者下载新的tomcat,如果有必要的话,修改/conf/service.xml文件中tomcat的端口号,避免端口同时暂用出现错误 2.请看一下图片:打开 ...

  2. JAVA面对对象(一)——封装

    1.封装思想:将对象的属性和行为封装起来的载体是类,类通常对客户隐藏其实现的细节 2.封装就是将属性私有化(private),并提供公共的方法(public)访问私有属性 3.通过封装,实现对属性数据 ...

  3. spring @component的作用

    该文转载自:http://tomfish88.iteye.com/blog/1497557 1.@controller 控制器(注入服务) 2.@service 服务(注入dao) 3.@reposi ...

  4. PAT 甲级 1057 Stack

    https://pintia.cn/problem-sets/994805342720868352/problems/994805417945710592 Stack is one of the mo ...

  5. SpringBoot 3.SpringBoot 整合 MyBatis 逆向工程以及 MyBatis 通用 Mapper

    一.添加所需依赖,当前完整的pom文件如下: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&qu ...

  6. 一本通1622Goldbach’s Conjecture

    1622:Goldbach’s Conjecture 时间限制: 1000 ms         内存限制: 524288 KB [题目描述] 原题来自:Ulm Local,题面详见:POJ 2262 ...

  7. docker--从仓库下载镜像到推送自己的项目到仓库步骤详解

    怎样从仓库下载的镜像,变成容器,并在容器中制作项目,再将容器变成镜像,然后将镜像推送到仓库? 一:从官网下载镜像 官方的https://hub.docker.com/提供了数十万个镜像提供大家下载 以 ...

  8. 【刷题】BZOJ 4059 [Cerc2012]Non-boring sequences

    Description 我们害怕把这道题题面搞得太无聊了,所以我们决定让这题超短.一个序列被称为是不无聊的,仅当它的每个连续子序列存在一个独一无二的数字,即每个子序列里至少存在一个数字只出现一次.给定 ...

  9. 51nod 1450 闯关游戏

    首先肯定要先把所有的关卡打通后去找两星几率最大的关卡刷星(论打游戏经验的重要性). 所以从两星几率小的关打起,记录当前拿到x个星星的几率和当前走过的期望步数,如果发现剩下的关必须全两星,就直接计算答案 ...

  10. centos7下设置opencv环境变量

    最近要装YOLO,但是MAKE的时候总是找不到OPENCV的路径, 原因是:我以前卸载过一次OPENCV,然后自己重新安装了opencv2.4.10,  因为当时只在QT 中用,所以编译完也没有设置环 ...