在进行网页自动化时我们做得最多的工作就是不停的往某个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. linux设置主机名

    第一种方式: hostname 在hostname 命名后面直接加想要更改的主机名,修改成功,键入hostname可以查看修改后的主机名,此种方式会立即生效,但是重启后还原.不会永久修改 第二种方式: ...

  2. 为什么要Cssreset

    1.CssReset是什么?由于html标签在各浏览器的默认样式解析出来的有所不同.例如<ul>标签在IE.firefox.chrome浏览器下默认边距是不一样的.各浏览器的默认样,会给我 ...

  3. Debian openvpn 配置

    1.安装openvpn 和 iptables -- Debain 可以使用命令行`apt-get install openvpn iptables` 2.配置服务器 -- ```shell cp -R ...

  4. 桶排序-Node.js

    , , , , ]; var a = [], i; ; i < b.length; i++) { var num = b[i]; a[num] = a[num]||; a[num] ++; nu ...

  5. 轻松学习Linux之AWK使用初步

    AWK最初是Unix平台上一种可以对文本进行逐行处理的编程语言,它来源于3个创作者的名字:Aho.(Peter)Weinberg和(Brain)Kernighan. 现在广泛应用于Linux,他与se ...

  6. 实体框架 (EF) 入门 => 四、CodeFirst 枚举支持

    当使用 Code First 开发时,通常是从编写用来定义概念(域)模型的 .NET Framework 类开始. 插入记录没有为 Budget 赋值. 数值类型默认值为0,数据库中都为not nul ...

  7. Kali Linux 安装教程-转

    rootoorotor昨天折腾了 Kali Linux 1.0,把大概的配置过程记录下来,希望对想接触或使用Kali Linux的同学有所帮助.   请注意: 1.本文为面向新手的教程,没技术含量,没 ...

  8. Gym 101064 D Black Hills golden jewels (二分)

    题目链接:http://codeforces.com/gym/101064/problem/D 问你两个数组合相加的第k大数是多少. 先sort数组,二分答案,然后判断其正确性(判断过程是枚举每个数然 ...

  9. HDU3874Necklace(树状数组+离线操作)

    此题的大意思说有一串珠子,每个珠子都有自己的欣赏值value,现在给你一串珠子每个的欣赏值,并给出一些询问,查询某个区间内部总欣赏值是多少,但是有一个约定就是如果这个区间内部有两个珠子的欣赏值是一样的 ...

  10. Classifier4J的中文支持

    Classifier4J是一个轻量级的分类工具,支持贝叶斯分类.向量空间模型.信息摘要等.然而它却不支持中文,异常信息大致如下: Exception in thread "main" ...