在进行网页自动化时我们做得最多的工作就是不停的往某个URL GET/POST数据并得到相应的Response,通过分析Response的结果再进行下一步操作,通过网页自动化我们可以做很多工作,比如去某个网站抓取我们想要的数据,批量注册,模拟人工操作网页,批量提交,去年12306网上订火车票的系统出来后相继开发出来的各种抢票工具就是这一网页自动化应用的最好注脚。非常幸运的是,.NET C#提供了强大的函数库可以轻易的完成这一作,但是现在我要发布的AliasNet将把这一工作变得更为简单。有我简单?一句话就OK。

总的来说:AliasNet,提供一种简单,方便,封装,统一的GET/POST方法。

1. AliasNet的基本使用

string response=new GetAndPostHelper().GETString("http://www.baidu.com") ;

OK,response里保存的就将是百度首页的HTML内容。

2. AliasNet的高级使用

GETAndPostHelper() helper=new GetAndPostHelper();//初始化HTTP的GETAndPostHelper
GETAndPostHelper() helper=new GetAndPostHelper(true);//初始化HTTPS的GETAndPostHelper
helper.SetCookies(CookieContainer cookies);//设置本次连接的Cookie
helper.SetCredential(userName,password);//设置本次连接的认证信息(这在内部网站里很有用)
helper.SetProxy(proxyIP,proxyPort);//设置本次连接的代理
helper.GETString(url);//GET数据,返回string
helper.GETBytes(url);//GET数据,返回byte[]
helper.POSTString(url,parameter);//POST数据,返回string
helper.POSTBytes(url,paremeter);//POST数据,返回byte[]
helper.DownloadFile(url,fileName);//将url内容保存为本地文件,这对下载图片网页等很有用

GET数据时,参数就连到URL里面作为QueryString传递到服务器,但是当POST数据时,我们需要显式的传递一个参数parameter,它是类Parameter的实体,其中类Parameter定义如下:


  /// <summary>

    /// Parameter类,继承自 Dictionary<string, string>
    /// 以Key-Value的形式保存GET/POST的数
    /// </summary>
    public class Parameters : Dictionary<string, string>
    {
        /// <summary>
        /// 重写ToString方法,以QueryString的方式连接各值
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            StringBuilder sb = new StringBuilder();
            foreach (KeyValuePair<string, string> pair in this)
            {
                sb.Append(string.Format("{0}={1}&", pair.Key, pair.Value));
            }
            if (sb.Length > 0)
                sb.Remove(sb.Length - 1, 1);
            return sb.ToString();
        } 
    } 

可以看到Parameter就是一个string-string的字典,我们把需要POST的数据放到里面去就OK了。

3.GET/POST 响应数据的处理办法

一般来说我们GET/POST数据无非是两种需求,一是下载相应的文件(可以用helper.DownloadFile)实现 ,二是获取返回结果提取数据(可以用helper.GETString(POSTStrin))实现。现重点说说后者。

根据服务器的返回结果,我们可以把他们为以下三类:

(1)HTML

处理HTML字符串当然首推HtmlAgilityPack.dll  了,可以用HTMLDocumnet载入 HTML字符串,再用XPath搜索想要的节点,最后用HTMLNode的innerText,innerHTML,GetAttribute 等方法就可以很方便的得到数据。

(2)JSON

处理JSOn数据我最喜欢使用Newtonsoft.Json  来实例化一个实体类,然后操作类来实现。AliasNet提供了JsonClassBase基类来处理JSON数据,一般来说,分析JSON数据的结构并写出现应的.NET实体类,并让之继承自JsonClassBase基类,使用调用 JsonClassBase.FromJson<T>(string json)方法就可以把JSON数据轻易的转换为.NET实体类了。

(3)包括XML等的其它

4.实例:利用AliasNet从无忧代理上获取最新的代理

无忧代理是我喜欢上的几个代理网上,每隔几小时它都会更新当前最新最好用的代理IP和端口,所以我们可以用AliasNet来自动抓取代理信息。

下面的例子将会抓取http://www.51proxied.com/http_anonymous.html 即无忧代理的匿名HTTP代理


// <summary>
        /// 从无忧代理网站得到当前最新的代理
        /// </summary>
        /// <param name="proxyUrl">代理Web URL</param>
        /// <param name="regionFilter">过滤指定的region,不过滤使用""或null</param>
        /// <returns>代理命令</returns>
        public static List<Proxy> _51proxied_HttpProxy(string proxyUrl, string regionFilter)
        {
            string resultString = new GetAndPostHelper().GETString(proxyUrl);
            HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
            doc.LoadHtml(resultString);
            HtmlNode divNode = doc.GetElementbyId("tb");
            HtmlNodeCollection tdNodesCollection = divNode.SelectNodes("//div/table//td");
            List<HtmlNode> tdNodes = new List<HtmlNode>();
            foreach (HtmlNode node in tdNodesCollection)
                tdNodes.Add(node);
            List<Proxy> proxy = new List<Proxy>();
            for (int i = 0; i < tdNodes.Count / 4; i++)
            {
                string region = tdNodes[i * 4 + 3].InnerText.Trim();
                if (string.IsNullOrEmpty(regionFilter) || region == regionFilter)
                {
                    Proxy p = new Proxy();
                    p.IP = tdNodes[i * 4 + 1].InnerText.Trim(); ;
                    p.Port = int.Parse(tdNodes[i * 4 + 2].InnerText.Trim());
                    p.Region = region;
                    proxy.Add(p);
                }
            }
            return proxy;         } 

这个方法我也封装成了ProxyFinder放到了AliasNet里面,一方面可以做为AliasNet使用的一个例子,一方面也算是额外的福利吧,反正我抓代理用得也蛮多的。

总结:

AliasNet现已托管到GitHub上并全面开源,感兴趣的可以访问:https://github.com/superliujian/AliasNet  或者联系我:liu_jian_china@qq.com

另外预告一下:简单自适应的轻量级数据库访问库AliasDB也已经开源,近期将公布。 AliasDB使得用户只需要提供一个连接字符串就可以运用统一的访问访问MySQL/SQLServer/Oracle/SQLite以及通过支持ODBC/OleDb 的所有数据库(比如Access), 而且,当你的数据库结构变化时,比如字段增删等,该访问仍然有效,不用再做任意的ORM,或者 自己写SQL语句或者 自己编写数据库实体。这在中小型系统中十分有用。

简单方便统一封装的傻瓜式GET/POST库AliasNet正式公布~开源喽~的更多相关文章

  1. 最新最最最简单的Snagit傻瓜式破解教程(带下载地址)

    最新最最最简单的Snagit傻瓜式破解教程(带下载地址) 下载地址 直接滑至文章底部下载 软件介绍 一个非常著名的优秀屏幕.文本和视频捕获.编辑与转换软件.可以捕获Windows屏幕.DOS屏幕:RM ...

  2. 【简单易用的傻瓜式图标设计工具】Logoist 3.1 for Mac

    [简介] Logoist 是一款Mac上强大易用的傻瓜式图标设计制作工具,通过使用内置模板和预设效果,您可以立即创建高质量的图形内容和艺术作品.通过使用该应用程序,可用于制作图标LOGO. 一款用于创 ...

  3. 如何使用win7自带的备份还原以及创建系统镜像------傻瓜式教程

    对于经常鼓捣电脑的童鞋来说,装系统是一件极其平常的事情,不过系统装多了之后,我们会感到比较烦躁,因为每一次装系统意味着驱动的重新安装,程序的重新安装,每次这么鼓捣几次,半天时间就花在这上面了,效率是在 ...

  4. .NET Core开发者的福音之玩转Redis的又一傻瓜式神器推荐

    作者:依乐祝 原本链接:https://www.cnblogs.com/yilezhu/p/9947905.html 引子 为什么写这篇文章呢?因为.NET Core的生态越来越好了!之前玩转.net ...

  5. [翻译] C# 8.0 新特性 Redis基本使用及百亿数据量中的使用技巧分享(附视频地址及观看指南) 【由浅至深】redis 实现发布订阅的几种方式 .NET Core开发者的福音之玩转Redis的又一傻瓜式神器推荐

    [翻译] C# 8.0 新特性 2018-11-13 17:04 by Rwing, 1179 阅读, 24 评论, 收藏, 编辑 原文: Building C# 8.0[译注:原文主标题如此,但内容 ...

  6. NOSDK--关于android傻瓜式的分包设想

    一直以来,我总是以“够用就好”为理由,很少再维护过自己的一键打包的项目.最近接触了棱镜的sdk,感觉将apk包上传到棱镜服务器,后台来进行分包这种简单的方式很招人待见. 原理似乎不难,apk即zip压 ...

  7. 在线App开发平台——应用之星傻瓜式开发平台

    随着智能手机及APP应用程序的普及,越来越多的企业和个人意识到APP的营销价值,出于对技术的敬畏,很多企业下意识认为开发APP是一个有难度的技术活,所以很多时候有心无力,也担心APP的后续的技术支持. ...

  8. Webpack 傻瓜式指南(一)

    modules with dependencies   webpack   module bundler   static  assetss   .js .js .png Webpack傻瓜式指南 n ...

  9. 初识springboot(傻瓜式教程)

    初识springboot(傻瓜式教程) 项目所需的版本 IDEA 2018 maven 3.x jdk-1.8 IDEA创建spring-boot项目(maven方法) 1.创建一个maven工程 点 ...

随机推荐

  1. 多态.xml

    pre{ line-height:1; color:#1e1e1e; background-color:#f0f0f0; font-size:16px;}.sysFunc{color:#627cf6; ...

  2. Ubuntu 16.04 Mxnet CPU 版本安装

    在安装前配置好更新源,基本要求就是速度越快越好: 1.安装Python   apt-get install python 2.安装Git    apt-get install git 3.安装依赖包  ...

  3. C语言实现strcpy

    strcpy.h: #ifndef STRCPY_H #define STRCPY_H #include <stdio.h> char *cat_strcpy(char *dst, con ...

  4. 数往知来 ASP.NET 表单的提交_url传值_重定向 <十八>

    一.表单提交时注意 如果是以get方式提交数据的时候,在接收时是用QueryString方式进行接收 如果是以post请求数据时在接收时是用Form进行接收 为什么么要这样做呢?我们用Request[ ...

  5. SAS、R以及SPSS的比较__统计语言大战

  6. iOS优秀博客收录(持续更新)

    唐巧 王巍 破船之家 NSHipster Limboy 无网不剩 念茜的博客 Xcode Dev Ted’s Homepage txx’s blog KEVIN BLOG 阿毛的蛋疼地 亚庆的 Blo ...

  7. ubuntu ip

    一.使用命令设置Ubuntu IP地址 1.修改配置文件blacklist.conf禁用IPV6 sudo vi /etc/modprobe.d/blacklist.conf 在文档最后添加 blac ...

  8. Hadoop MapReduce概念学习系列之shuffle大揭秘(十九)

    shuffle是非常重要!一定要深入理解和多实践. 缓存,分组,排序,转发,这些都是mr的shuffle. Soga 我想得到按流量来排序,而且还是倒序,怎么达到实现呢?这就牵扯到排序的的问题 默认是 ...

  9. 【转】jsp页面中jstl标签详解

    原文地址: JSLT标签库,是日常开发经常使用的,也是众多标签中性能最好的.把常用的内容,放在这里备份一份,随用随查.尽量做到不用查,就可以随手就可以写出来.这算是Java程序员的基本功吧,一定要扎实 ...

  10. WebBrowser的各种使用方法(未完待续)(XE8+WIN7)

    相关资料: 占时想不起来了,有时间我补上吧. 程序下载: http://download.csdn.net/detail/zhujianqiangqq/9666390 实例代码: unit Unit1 ...