[System.Net]模拟Web请求编写简易单词查询客户端

时间:2023-03-09 08:44:53
[System.Net]模拟Web请求编写简易单词查询客户端

demo: 我就不上传了

前言

在实际生活中,网络请求的应用极其常见,比如使用浏览器,程序中我们还要调用webservice。那么浏览器是怎么请求网络资源的呢?不用它可以自己请求不?

答案是可以的。

如果我们可以用自己的程序主动发起网络请求,那么我们可以:模拟提交数据,做一些简单网页游戏的外挂,可以刷一些帖子的访问量,可以抓取网络上的资源……

废话不我说,此文以使用Get方式对有道词典网进行请求为核心,编写了一个简单的单词查询客户端。正则表达式不太懂可以改为字符串基本操作,或者对其自己做一下基本的了解和学习。

【注:致初学都系列,一般以简单有意义的demo为例,介绍某类知识点(此文已以黑体标出)。其中API不懂的可以留言讨论。如有兴趣可以查询MSDN进行深入学习(笔者所期望的)】

效果图:

aaarticlea/png;base64,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" alt="" />

代码:

using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;
using System.Text.RegularExpressions; namespace NetCapture
{
/// <summary>
/// base类。以后我们可能写别的类似请求,通过继承此类,可以省下一些代码。
/// </summary>
public abstract class GetScraperBase
{
//正则表达式的匹配模式
protected abstract string Pattern { get; }
//如何过滤正则表达式匹配的结果
protected abstract Dictionary<string, string> FilterMatch(Match match);
//抓取网页上的内容
public Dictionary<string, string> Scrape(string url, WebProxy proxy = null)
{
var request = WebRequest.Create(url); //创建request
if (proxy != null)
{
request.Proxy = proxy;//可能你在一些环境上不了网,得使用代理服务器
}
var response = request.GetResponse(); //获取response
var stream = response.GetResponseStream();
var responseReader = new StreamReader(stream);
var content = responseReader.ReadToEnd(); //读取response(页面对应的html)
var match = Regex.Match(content, Pattern, RegexOptions.IgnorePatternWhitespace); //筛选内容
return FilterMatch(match);
}
} public class YouDaoScaper : GetScraperBase
{
protected override string Pattern
{
get
{
/* Target result in response:
<div class="trans-container">
<ul>
<li>n. 试验;检验</li>
<li>vt. 试验;测试</li>
<li>vi. 试验;测试</li>
<li>n. (Test)人名;(英)特斯特</li>
</ul>
*
* there are two groups in this pattern, first is '<li>(?<content>.+)</li>[\r\n\s]*'
* it's an unnamed group, it has four capture:
* first is '<li>n. 试验;检验</li>' and so on.
*
* another group is and named group 'content' , it has four capture, in this sampe:
* capture 1 is 'n. 试验;检验' and so on.
*/ return @"<div\sclass=""trans-container"">[\r\n\s]*
<ul>[\r\n\s]*
(<li>(?<content>.+)</li>[\r\n\s]*)*
</ul>";
}
} protected override Dictionary<string, string> FilterMatch(Match match)
{
var dict=new Dictionary<string, string>();
var content = "";
var group=match.Groups["content"];
if(group.Success)
{
foreach (Capture capture in group.Captures)
{
content += (capture.Value + "\n");
}
}
dict["content"]=content;
return dict;
} public string QueryWord(string word)
{
var url= "http://dict.youdao.com/search?q="+word;
var dict = Scrape(url);
return dict["content"];
}
}
}