C# 通过Internet搜索网络资源
Internet 网络资源非常丰富,几乎涉及到日常生活和研究的各个方面。流行的搜索引擎像Google、百度、雅虎等都能完成快速搜索网络资源的功能。本节我们将学习用C#实现这些功能的基本思路。
在System.Net 命名空间中,有一个WebClient 类,该类提供向URI 标识的任何本地、Intranet或Internet 资源发送数据以及从这些资源接收数据的公共方法。
URI 的意思是统一资源标识符,.NET 框架使用URI 来标识所请求的Internet 资源和通信协议。URI 由四部分组成:协议标识符、服务器标识符、路径标识符和可选的查询字符串。其中协议标识符标识用于请求和响应的通信协议;服务器标识符由域名系统(DNS)主机名或TCP 地址组成,用于惟一标识Internet 上的服务器;路径标识符用于在服务器上定位请求的信息;查询字符串用于将信息从客户端传送到服务器。
例如,“http://www.contoso.com/whatsnew.aspx?date=today”就是由协议标识符“http”、服务器标识符“www.contoso.com”、路径“whatsnew.aspx”和查询字符串“?date=today”组成的。服务器接收到请求并对响应进行了处理之后,就将该响应返回到客户端应用程序。由于响应中包括了像原始文本或XML 数据等相关信息,因此我们就可以从这些信息中查询需要的文本字符串、图片等内容。
通过WebClient 类从Web 站点下载文件有两种方式,一种是直接保存为本地文件,另一种是通过流进行读取,具体采用哪种方式要视情况而定。
如果要保存成本地文件,可以使用DownloadFile 方法。该方法有两个参数,一个是URI,即统一资源标识符;另一个是本地保存路径。例如:
using System.Net;
……
WebClient myWebClient = new WebClient();
myWebClient.DownloadFile("http://military.china.com/zh_cn/", "C:\\test.htm");
如果应用程序需要处理从Web 站点检索到的数据,可以使用OpenRead 方法,这个方法返回一个Stream 引用。然后就可以从数据流中读取数据了。例如:
using System.Net;
using System.IO;
……
WebClient webClient = new WebClient();
Stream myStream = webClient.OpenRead("http://news.sohu.com");
StreamReader sr = new StreamReader(myStream);
string httpSource = sr.ReadToEnd();
也可以使用DownloadString 方法,直接读取包含网页源代码的字符串内容。例如:
using System.Net;
……
WebClient webClient = new WebClient();
string httpSource = webClient.DownloadString("http://news.sohu.com");
这种方法得到的结果与使用流读取得到的结果相同。
【例】设计一个简单的搜索程序,能读取指定网址的源文件,并能用正则表达式搜索包含的超链接与图片。
(1) 新建一个名为InternetSearchExample 的Windows 应用程序,修改Form1.cs 为FormSearch.cs,设计如图7-4 所示的界面。

(2) 切换到代码方式,添加对应的命名空间引用和事件,源代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
//添加的命名空间引用
using System.Net;
using System.IO;
using System.Text.RegularExpressions;
namespace InternetSearchExample
{
public partial class FormSearch : Form
{
public FormSearch()
{
InitializeComponent();
}
private void buttonSearch_Click(object sender, EventArgs e)
{
listBoxLinks.Items.Clear();
listBoxImage.Items.Clear();
pictureBox1.Image = null;
webBrowser1.Url = new Uri("about:blank");
richTextBox1.Clear();
string urlString = textBoxUrl.Text.Trim();
if (urlString.StartsWith("http://") == false)
{
urlString = "http://" + urlString;
textBoxUrl.Text = urlString;
}
string httpSource;
try
{
//设置鼠标形状为沙漏形状
Cursor.Current = Cursors.WaitCursor;
WebClient webClient = new WebClient();
//获取包含网页源代码的字符串。
httpSource = webClient.DownloadString(textBoxUrl.Text);
richTextBox1.Text = httpSource;
webBrowser1.Url = new Uri(textBoxUrl.Text);
}
catch (Exception err)
{
MessageBox.Show(err.Message);
return;
}
finally
{
//设置鼠标形状为默认形状
Cursor.Current = Cursors.Default;
}
string regexHrefPattern = @"<a\s+href\s*=\s*""?([^"" >]+)""?>(.+)</a>";
Regex myRegex = new Regex(regexHrefPattern, RegexOptions.IgnoreCase);
Match myMatch = myRegex.Match(httpSource);
while (myMatch.Success == true)
{
listBoxLinks.Items.Add(myMatch.Groups[0].Value);
myMatch = myMatch.NextMatch();
}
string regexImgPattern =
@"<img[^>]+(src)\s*=\s*""?([^ "">]+)""?(?:[^>]+([^"">]+)""?)?";
myRegex = new Regex(regexImgPattern, RegexOptions.IgnoreCase);
myMatch = myRegex.Match(httpSource);
while (myMatch.Success == true)
{
listBoxImage.Items.Add(myMatch.Groups[2].Value);
myMatch = myMatch.NextMatch();
}
}
private void listBoxImage_Click(object sender, EventArgs e)
{
try
{
WebClient client = new WebClient();
pictureBox1.Image =
Image.FromStream(client.OpenRead(listBoxImage.SelectedItem.ToString()));
}
catch
{
pictureBox1.Image = null;
}
}
}
}
(3) 按<F5>键编译并运行,输入某个网址,例如http://news.sohu.com,然后单击【开始搜索】按钮,观察搜索结果。单击搜索结果2 中的图片链接,即可显示对应的图片。运行效果如图所示。

当然,实际应用中的搜索引擎远比这个例子复杂得多。但是,通过这个例子,我们学习了利用C#和正则表达式编写搜索网络资源程序的基本思想。在此基础上,编写与此相关的更广泛的网络应用程序就不会感到太困难了。
C# 通过Internet搜索网络资源的更多相关文章
- GOOGLE搜索從入門到精通V4.0
1,前言2,摘要3,如何使用本文4,Google簡介5,搜索入門6,初階搜索 6.1,搜索結果要求包含兩個及兩個以上關鍵字 6.2,搜索結果要求不包含某些特定資訊 6.3,搜索結果至少包含多個關鍵字中 ...
- 【转载】google搜索从入门到精通
原文地址:http://www.cnblogs.com/helloIT/articles/5095668.html /***************************************** ...
- 解读论文《Agglomerative clustering of a search engine query log》,以解决搜索推荐相关问题
<Agglomerative clustering of a search engine query log> 论文作者:Doug Beeferman 本文将解读此篇论文,此论文利用搜索日 ...
- apktool更新,JDK升级配置
最近使用apktool反编译apk中的xml文件总是失败. Exception in thread "main" brut.androlib.AndrolibException: ...
- Atom插件安装及常用插件推荐
Atom是个不错的文本编辑工具,也该可以改造成IDE用,主要靠插件实现各种扩展功能. 因为网络环境的原因,在线安装不容易成功,一般选择手动安装. 以下是我搜索网络资源后总结的手动安装方法. Atom插 ...
- 安装Ubuntu 14.04后要做的5件事情
转自安装Ubuntu 14.04后要做的5件事情 Ubuntu目前是世界上最流行的Linux操作系统,它提供了桌面版本和服务器版本,其他流行的Linux发行版本如Linux Mint也是基于Ubunt ...
- 【Linux探索之旅】第一部分第五课:Unity桌面,人生若只如初见
内容简介 1.第一部分第五课:Unity桌面,人生若只如初见 2.第一部分第六课预告:Linux如何安装在虚拟机中 Unity桌面,人生若只如初见 不容易啊,经过了前几课的学习,我们认识了Linux是 ...
- 【笔记】基于Python的数字图像处理
[博客导航] [Python相关] 前言 基于Python的数字图像处理,离不开相关处理的第三方库函数.搜索网络资源,列出如下资源链接. Python图像处理库到底用哪家 python计算机视觉编程— ...
- 基2时域抽取FFT、IFFT的C++实现代码,另附DFT与IDFT的原始实现--转1
介绍网络上的原理介绍非常丰富,具体请自行搜索网络资源. 本算法依靠FFT流图进行布置. 算法 ##进行完所有的原理推导后,我们可以得到如下的16点FFT流图: 通过上图可以看出整个流图输入序列的顺序已 ...
随机推荐
- [oracle] exp-00091
产生原因: 在数据库的服务器端和客户端字符集不同的情况下,导出(dump)数据库表时,会产生这个错误.虽然产生这个错误,但好像对导入没有影响. 解决办法: 查看服务器端字符集: 打开SQLPLUS,执 ...
- LeetCode349. 两个数组的交集
题目 给定两个数组,编写一个函数来计算它们的交集. 分析 数组元素值可以很大,所以不适合直接开数组进行哈希,这里要学习另一种哈希方式:集合 集合有三种,区别见下面代码随想录的Carl大佬的表格,总结的 ...
- SSRF - Pikachu
概述: SSRF(Server-Side Request Forgery:服务器端请求伪造) 其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制 导致 ...
- oracle修改表栏位类型
需求:ID栏位在创建的时候是varchar类型,后续要修改为number类型 因为oracle修改表栏位类型的时候需要栏位内没有数据,因此无法直接把ID从varchar修改为number 1.新建一个 ...
- kubernetes 核心技术-Controller 控制器
一.什么是Controller? Controller是在集群上管理和运行容器的对象,Controller是实际存在的,Pod是抽象的,主要创建管理pod 二.Pod和Controller的关系 Po ...
- 并发编程常用工具类(一) countDownLatch和cyclicBarrier的使用对比
1.CountDownLatch countDownLatch的作用是让一组线程等待其他线程完成工作以后在执行,相当于加强版的join(不懂可以百度一下join的用法),一般在初始 ...
- Flutter--Flutter中Widget、App的生命周期
前言 在App的开发过程中,我们通常都需要了解App以及各个页面的生命周期,方便我们在App进入前台时启动一些任务,在进入后台后暂停一些任务.同时,各个页面的生命周期也很重要,每个页面消失时要做一些内 ...
- 指令集架构 x86-64 x86架构的64位拓展,向后兼容于16位及32位的x86架构
https://zh.wikipedia.org/wiki/X86 x86泛指一系列英特尔公司用于开发处理器的指令集架构,这类处理器最早为1978年面市的"Intel 8086"C ...
- Codeforces #698 (Div. 2) E. Nezzar and Binary String 题解
中文题意: 给你两个长度为 \(n\) 的01串 \(s,f,\)有 \(q\) 次询问. 每次询问有区间 \([\ l,r\ ]\) ,如果 \([\ l,r\ ]\) 同时包含\(0\)和\(1\ ...
- qbxt 学习笔记 10.2 晚
目录 整除性 素数 组合数 Lucas 定理: 整除性 直接搬 ppt 特殊的整除性质 素数 素数定理: 线性筛: 原理:一个合数只由其最大素因子筛去. 代码: 组合数 Lucas 定理: \[\bi ...