简单方便统一封装的傻瓜式GET/POST库AliasNet正式公布~开源喽~
在进行网页自动化时我们做得最多的工作就是不停的往某个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正式公布~开源喽~的更多相关文章
- 最新最最最简单的Snagit傻瓜式破解教程(带下载地址)
最新最最最简单的Snagit傻瓜式破解教程(带下载地址) 下载地址 直接滑至文章底部下载 软件介绍 一个非常著名的优秀屏幕.文本和视频捕获.编辑与转换软件.可以捕获Windows屏幕.DOS屏幕:RM ...
- 【简单易用的傻瓜式图标设计工具】Logoist 3.1 for Mac
[简介] Logoist 是一款Mac上强大易用的傻瓜式图标设计制作工具,通过使用内置模板和预设效果,您可以立即创建高质量的图形内容和艺术作品.通过使用该应用程序,可用于制作图标LOGO. 一款用于创 ...
- 如何使用win7自带的备份还原以及创建系统镜像------傻瓜式教程
对于经常鼓捣电脑的童鞋来说,装系统是一件极其平常的事情,不过系统装多了之后,我们会感到比较烦躁,因为每一次装系统意味着驱动的重新安装,程序的重新安装,每次这么鼓捣几次,半天时间就花在这上面了,效率是在 ...
- .NET Core开发者的福音之玩转Redis的又一傻瓜式神器推荐
作者:依乐祝 原本链接:https://www.cnblogs.com/yilezhu/p/9947905.html 引子 为什么写这篇文章呢?因为.NET Core的生态越来越好了!之前玩转.net ...
- [翻译] C# 8.0 新特性 Redis基本使用及百亿数据量中的使用技巧分享(附视频地址及观看指南) 【由浅至深】redis 实现发布订阅的几种方式 .NET Core开发者的福音之玩转Redis的又一傻瓜式神器推荐
[翻译] C# 8.0 新特性 2018-11-13 17:04 by Rwing, 1179 阅读, 24 评论, 收藏, 编辑 原文: Building C# 8.0[译注:原文主标题如此,但内容 ...
- NOSDK--关于android傻瓜式的分包设想
一直以来,我总是以“够用就好”为理由,很少再维护过自己的一键打包的项目.最近接触了棱镜的sdk,感觉将apk包上传到棱镜服务器,后台来进行分包这种简单的方式很招人待见. 原理似乎不难,apk即zip压 ...
- 在线App开发平台——应用之星傻瓜式开发平台
随着智能手机及APP应用程序的普及,越来越多的企业和个人意识到APP的营销价值,出于对技术的敬畏,很多企业下意识认为开发APP是一个有难度的技术活,所以很多时候有心无力,也担心APP的后续的技术支持. ...
- Webpack 傻瓜式指南(一)
modules with dependencies webpack module bundler static assetss .js .js .png Webpack傻瓜式指南 n ...
- 初识springboot(傻瓜式教程)
初识springboot(傻瓜式教程) 项目所需的版本 IDEA 2018 maven 3.x jdk-1.8 IDEA创建spring-boot项目(maven方法) 1.创建一个maven工程 点 ...
随机推荐
- 数组名的含义.xml
pre{ line-height:1; color:#1e1e1e; background-color:#f0f0f0; font-size:16px;}.sysFunc{color:#627cf6; ...
- 30+学习Web设计和开发的优质新鲜资源
今天我们整理了一些最新的Web设计和开发的资源,这些资源都来自国外的流行站点,不过大家应该不会陌生,放在这里供大家收藏,在需要的时候方便翻阅和学习! 原文地址:http://www.goodfav.c ...
- iOS UITableView UIScrollView 的支持触摸事件
在使用了 UITableView 或UIScrollView的controller 里无法响应触摸事件touch事件, 自定义tableView.scrollView #import <UIKi ...
- 无法debug断点跟踪JDK源代码——missing line number attributes的解决方法
在项目工程->Properties->Java Build Path->Libraries中导入的JRE System Library库里,给jar包添加JDK源代码包后,能够直接打 ...
- HD2043猜密码
密码 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission ...
- xml velocity模板
. <?xml version="1.0" encoding="GBK"?> <PACKET type="REQUEST" ...
- [iOS微博项目 - 2.5] - 封装授权和用户信息读写业务
github: https://github.com/hellovoidworld/HVWWeibo A.封装授权业务 1.把app的授权信息移动到HVWWeibo-Prefix.pch中作为公共 ...
- 利用预渲染加速iOS设备的图像显示
最近在做一个UITableView的例子,发现滚动时的性能还不错.但来回滚动时,第一次显示的图像不如再次显示的图像流畅,出现前会有稍许的停顿感.于是我猜想显示过的图像肯定是被缓存起来了,查了下文档后发 ...
- apiCode/1/1.1/1.1.1
public abstract class myClass { private string id = ""; private string name = "" ...
- M站 滚动日历弹框
先放张效果图: 完整Demo: <!DOCTYPE html> <html lang="en"> <head> <meta http-eq ...