当前位置:首页 > 教程 > ASP.NET > 怎样使用.NET/C# 获取百度搜索结果2015

怎样使用.NET/C# 获取百度搜索结果2015

我们经常会使用程序读取百度的搜索结果以便提供方便。现在很多程序使用.NET来做定时任务,这样怎样使用.NET/C# 获取百度搜索结果呢?

.NET/C# 怎样获取百度搜索结果

我们首先应该分析百度的搜索结果,发现百度的搜索结果的格式为:
百度搜索结果结构

图中标记部分可以知道,百度的搜索结果都是在id=”content_left”的结果中的,每个搜索项目的是以class=”result c-container”作为一项, 每项中的题目又是包含在h3标签中,如下图所示:

百度搜索结果项

因此我们有了思路:

  1. 根据关键字获取到百度搜索结果的整个HTML文本
  2. 正则匹配到搜索结果容器的HTML
  3. 正则匹配到搜索结果每一项的HTML
  4. 取出每项结果中的题目和链接地址

直接来干的,看下面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
using System;
 using System.Collections.Generic;
 using System.Text;
 using System.Text.RegularExpressions;
 using System.Web;
 using System.Net;
using System.IO;
namespace BaiduSearchTest
{
    struct BaiduEntry
    {
        public string title, brief, link;
    }
    class Program
    {
        static string GetHtml(string keyword)
        {
            string url = @"http://www.baidu.com/";
            string encodedKeyword = HttpUtility.UrlEncode(keyword, Encoding.GetEncoding(936));
            //百度使用codepage 936字符编码来作为查询串,果然专注于中文搜索……
            //更不用说,还很喜欢微软
            //谷歌能正确识别UTF-8编码和codepage这两种情况,不过本身网页在HTTP头里标明是UTF-8的
            //估计谷歌也不讨厌微软(以及微软的专有规范)
            string query = "s?wd=" + encodedKeyword;
 
            HttpWebRequest req;
            HttpWebResponse response;
            Stream stream;
            req = (HttpWebRequest)WebRequest.Create(url + query);
            response = (HttpWebResponse)req.GetResponse();
            stream = response.GetResponseStream();
            int count = 0;
            byte[] buf = new byte[8192];
            string decodedString = null;
            StringBuilder sb = new StringBuilder();
            try
            {
                Console.WriteLine("正在读取网页{0}的内容……", url + query);
                do
                {
                    count = stream.Read(buf, 0, buf.Length);
                    if (count > 0)
                    {
                        decodedString = Encoding.GetEncoding("utf-8").GetString(buf, 0, count);
                        sb.Append(decodedString);
                    }
                } while (count > 0);
            }
            catch
            {
                Console.WriteLine("网络连接失败,请检查网络设置。");
            }
            return sb.ToString();
        }
        static void PrintResult(List<BaiduEntry> entries)
        {
            int count = 0;
            entries.ForEach(delegate(BaiduEntry entry)
            {
                Console.WriteLine("找到了百度的第{0}条搜索结果:", count += 1);
                if (entry.link != null)
                {
                    Console.WriteLine("找到了一条链接:");
                    Console.WriteLine(entry.link);
                }
                if (entry.title != null)
                {
                    Console.WriteLine("标题为:");
                    Console.WriteLine(entry.title);
                }
                if (entry.brief != null)
                {
                    Console.WriteLine("下面是摘要:");
                    Console.WriteLine(entry.brief);
                }
                Program.Cut();
            });
        }
        static void simpleOutput()
        {
            string html = "<table><tr><td><font>test</font><a>hello</a><br></td></tr></table>";
            Console.WriteLine(RemoveSomeTags(html));
        }
        static string RemoveVoidTag(string html)
        {
            string[] filter = { "<br>" };
            foreach (string tag in filter)
            {
                html = html.Replace(tag, "");
            }
            return html;
        }
        static string ReleaseXmlTags(string html)
        {
            string[] filter = { "<a.*?>", "</a>", "<em>", "</em>", "<b>", "</b>", "<font.*?>", "</font>" };
            foreach (string tag in filter)
            {
                html = Regex.Replace(html, tag, "");
            }
            return html;
        }
 
        static string RemoveSomeTags(string html)
        {
            html = RemoveVoidTag(html);
            html = ReleaseXmlTags(html);
            return html;
        }
        static void Cut()
        {
            Console.WriteLine("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
        }
        static void MainProc(string input)
        {
            MainProc(input, false);
        }
 
        static void MainProc(string input, bool tagsForBrief)
        {
            Regex r = new Regex(@"<h3[\s\S]*?</h3>", RegexOptions.IgnoreCase);
 
            MatchCollection matchCollection = r.Matches(input);
            List<string> collection = new List<string>();
 
            foreach(Match m in matchCollection)
            {
 
                string textReg = @"<a\s*[^>]*>([\s\S]+?)</a>";
 
                MatchCollection textMatchCollection = Regex.Matches(m.Value, textReg, RegexOptions.IgnoreCase);
 
                foreach (Match match in textMatchCollection)
                {
                    if (match.Success)
                        Console.Write(match.Result("$1"));
                }
 
                string LinkReg = @"http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?";
 
                MatchCollection linkMatchCollection = Regex.Matches(m.Value, LinkReg, RegexOptions.IgnoreCase);
 
                foreach (Match match in linkMatchCollection)
                {
                    if (match.Success)
                        Console.Write(match.Groups[0].Value);
                }
            }
        }
        public static void Main(string[] args)
        {
            Console.WriteLine("请输入一个关键字。");
            string keyword;
            keyword = Console.ReadLine();
            Console.WriteLine("正在从百度上获取结果,请稍等……");
            string input;
            input = GetHtml(keyword);
            Regex r = new Regex("<div id=\"content_left\"[\\s\\S]*</div><div style=\"clear:both;height:0;\"></div>", RegexOptions.IgnoreCase);
            input = r.Match(input).Value;
            MainProc(input);
            Console.ReadKey(true);
        }
    }
}

程序结果如下图所示:
.NET/C# 获取百度搜索结果

通过上面的例子你应该明白怎样使用.NET/C# 获取百度搜索结果项了吧,程序可以直接使用,如果没有得到结果说明是百度搜索的结构变了,请按程序思路改正。

  • << 速度与激情7高清HD下载在线观看
  • 怎样使用.NET/C# 解析RSS >>
  • 作者:
    除非注明,本文原创:知道91,欢迎转载!转载请以链接形式注明本文地址,谢谢。
    原文链接:http://www.zhidao91.com/donet-csharp-get-baidu-result/

    相关文章 近期热评 最新文章

    • 怎样在WordPress中安装Google Analytics
      就算你积累了多年网站建设的经验,你都不可能一开始就建一个外观,速度,功能以及转化都很完美的网站。你能做的并且也是各个站长正在做的,无非是通过不断的监测来改进...
    • 怎样在WordPress中安装Google Analytics
      就算你积累了多年网站建设的经验,你都不可能一开始就建一个外观,速度,功能以及转化都很完美的网站。你能做的并且也是各个站长正在做的,无非是通过不断的监测来改进...
    • oracle数据库相关操作注意事项
      修改Oracle SGA(共享内存) 很多网站说修改Oracle的内存通过命令 如果你这么做了,那么恭喜你,你的Oracle数据库无法启动了。如果你已经这么做了,恢复Oracle启动的方...
    • 使用微信JDK实现微信接口签名验证
      要使用微信的接口必须在绑定的域名下测试;签名必须先向微信请求到access_token,然后用access_token再去请求jsapi_ticket,最后用jsapi_ticket和相关的参数按照ASCII码...
    • ABP开发指南系列教程(2) – 多层架构...
      为了减少复杂性和提高代码的可重用性,采用分层架构是一种被广泛接受的技术。为了实现分层的体系结构,ABP遵循DDD(领域驱动设计)的原则,将工程分为四个层: 展现层(...
    • ABP开发指南系列教程(1) – 入...
      ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称。 ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应用程序的新起点,它旨在成为一个通用的WE...
    • Windows下 JIRA + Agile + Mysql 破解...
      本文讲述了Windows下 JIRA + Agile + Mysql 破解安装示例教程