[致初学者]模拟Web请求——Get

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

答案是可以的。

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

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

效果图:

代码:

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);
                if (proxy != null)
                {
                    request.Proxy = proxy;//可能你在一些环境上不了网,得使用代理服务器
                }
                var response = request.GetResponse();
                var stream = response.GetResponseStream();
                var responseReader = new StreamReader(stream);
                var content = responseReader.ReadToEnd();
                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"];
        }
    }
}
时间: 2024-10-10 17:25:32

[致初学者]模拟Web请求——Get的相关文章

经验总结20--C#模拟WEB请求

非常多语言能够使用代码进行WEB请求,获取到须要的数据. 方便调用别人的接口,自己进行处理. HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; request.Method = "GET"; request.ContentType = "application/json; charset=utf-8"; //有时候须要该參数.限制浏览器 request.UserAgent = &qu

模拟web请求——简单的小程序提高工作效率

研究了一段时间爬虫,了解到了用代码发起http请求的方法,想练练手.突然想起工作上遇到的一个难题,感觉非常适合.问题是这样的:工作上维护的一个系统,有时候代码脚本有变更,需要通过一个前台页面进行刷新.但是因为服务器高可用的要求,总共部署了27个server,一次更新每个server都需要刷一遍,非常麻烦.刷新页面的url是这样的:http://ip:port/OpenEbus_srv/refreshScript.jsp刷新完成后:相当简单的页面,不同的server区别就在于ip和端口.之前研究了

Web后端语言模拟http请求(带用户名和密码)实例代码大全

RESTful API是目前比较成熟的一套互联网应用程序的API设计理论.而随着RESTful API的成熟和流行,应用开发方面就需要以模拟http请求的方式来调用RESTful API接口:经过一段时间的IBM的云平台Blumemix的学习及语言翻译服务的应用,积累了Java.ASP.NET.Nodejs.Go.PHP.Python.Ruby等语言调用Rest API的方法,这里整理到一起,和大家分享一下. 有关RESTful API请参考:理解RESTful架构,RESTful API 设计

java模拟web服务器代码

为了更好地理解web服务器(如tomcat)的运行原理,现用java代码模拟了一个web服务器: 1 import java.io.*; 2 import java.net.*; 3 public class MyWebServer 4 { 5 /*模拟web服务器*/ 6 public static void main(String[] args) throws Exception 7 { 8 ServerSocket ss = new ServerSocket(9999);//占用9999端

PHP+SOCKET 模拟HTTP请求

HTTP消息结构 客户端请求包括四部份:请求行(状态行).请求头.空行.请求主体(数据),如下图: 服务端响应包括四部份:响应行(状态行).响应头.空行.响应主体(数据),如图: HTTP请求方法: POST .GET  .HEADE.  PUT.  TRACE  .DELETE .OPTIONS .CONNECT  (前三种最实用),有这麽多的请求方法,但web服务器不一定所有的都支持. GET   基本一致,请求指定的页面信息,并返回实体主体. HEAD  基本和GET一致 ,只不过返回的响

20150108--HTTP协议+PHP模拟HTTP请求-02

HTTP协议 1. 什么是http协议? 协议:协议是一种双方约定好的规范,双方在做某一件事情的事情,必须按照事先定义好的规范去实现和操作. HTTP:超文本传输协议,HyperText Transport Protocol,超文本在服务器与浏览器之间传输的时候必须遵循的协议. 2. 什么是html? 超文本标记语言:HyperText Markup Language html的作用:保证同一数据在不同的电脑(用户),看到的效果一样. HTTP协议工作原理 HTTP协议特点 支持客户/服务器模式

使用fiddler模拟http请求

出处:http://zhuqil.cnblogs.com 概述  与httpwath相比,fiddler能模拟http请求.能断点调试.http分析统计吸引了我,使用之后感觉这个工具非常不错,这篇文章只单介绍一下fiddler工作原理,简单介绍一下它的重要功能,以及如何使用使用fiddler模拟http请求,满足移动服务端开发人员调试的问题.对于其他的功能大家可以自己研究一下. fiddler工作原理: 当你启动了Fiddler,程序将会把自己作为一个微软互联网服务的系统代理.作为系统代理,所有

Go语言和ASP.NET的一般处理程序在处理WEB请求时的速度比较

Go语言和ASP.NET的一般处理程序在处理WEB请求时的速度比较 1.首先写一个Go语言的简单WEB程序,就返回一个HelloWord! package main import ( f "fmt" "log" "net/http" // "strings" ) func sayhelloName(w http.ResponseWriter, r *http.Request) { // r.ParseForm() // f.P

利用 Apache Synapse 模拟 Web 服务

Apache Synapse 是一个简单.轻量级的高性能企业服务总线 (ESB),它是在 Apache Software Foundation 的 Apache License Version 2.0 下发布的.使用 Apache Synapse,您可以通过 HTTP.HTTPS.Java™ Message Service (JMS).简单邮件传输协议 (SMTP).邮局协议版本 3 (POP3).FTP.文件系统和许多其他传输介质筛选.转换.路由.操作和监视经过大型企业系统的 SOAP.二进制