话说某天心血来潮想到一个问题,朋友圈里面经常有人发投票链接,让帮忙给XX投票,以前呢会很自觉打开链接帮忙投一票。可是这种事做多了就会考虑能不能使用工具来进行投票呢,身为一名程序猿决定研究解决这个问题。于是有了以下思考

公司主营业务:成都网站建设、成都网站制作、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联推出尼木免费做网站回馈大家。
1.是否能一个人投多票,如果不行又是什么限制了一人投多票?
答:投票网站限制了一个IP或者一个用户只能投一票,防止恶意刷票行为
2.如果是一个IP一票那是否代表着多个IP就能投多票了呢?
答:答案是肯定的
3.用什么方法能够在代码里面改变自己请求的IP?
答:HTTP请求的时候设置代理IP
4.多个代理IP从哪里获取,获取到之后我又该如何使用代码自动化投票?
答:请看文章后面内容
本篇将介绍TaskManager内置任务-代理IP爬虫实现细节,你需要准备的知识:HtmlAgilityPack解析HTML,Quart.net。
代理IP介绍
百度百科介绍:代理(英语:Proxy),也称网络代理,是一种特殊的网络服务,允许一个网络终端(一般为客户端)通过这个服务与另一个网络终端 (一般为服务器)进行非直接的连接。一些网关、路由器等网络设备具备网络代理功能。一般认为代理服务有利于保障网络终端的隐私或安全,防止攻击。
目前有很多厂商提供代理IP在线获取,但是很多都是提供几十个试用的,如果想使用更多的代理IP,则需付费购买。这里我找到了一个提供很多代理IP的网站,可以自行百度“代理ip”(以免认为我打广告),或者参考开源TaskManager介绍这篇文章。
有了这么多在线的代理IP可以解决文章开头的问题4了,可是还有个问题这些数据都是网页上的,我在代码里面怎么使用呢?这就用到了HtmlAgilityPack工具包,看名称就能猜到是用来解析HTML的。
HtmlAgilityPack使用
HtmlAgilityPack是一个开源的解析HTML元素的类库,最大的特点是可以通过XPath来解析HMTL,如果您以前用C#操作过XML,那么使用起HtmlAgilityPack也会得心应手。
解析简单的HTML
- string HTML = @"
 简单解析测试 
1 cn - ";
 - var doc = new HtmlDocument();
 - doc.LoadHtml(HTML);
 - //输出页面标题
 - Console.WriteLine("页面title:"+doc.DocumentNode.SelectSingleNode("/html/head/title").InnerText);
 - //获取div1节点 方式1
 - HtmlNode divNode1 = doc.GetElementbyId("div1");
 - //获取div1节点 方式2
 - HtmlNode divNode2 = doc.DocumentNode.SelectSingleNode("//div[@id='div1']");
 - //判断节点1和节点2是否相同
 - Console.WriteLine("断节点1和节点2是否相同:" + (divNode1 == divNode2));
 - //获取页面所有table
 - HtmlNodeCollection tableCollection = doc.DocumentNode.SelectNodes("//table");
 - Console.WriteLine("页面table数量:"+tableCollection.Count);
 - //获取table下所有td并输出信息
 - HtmlNodeCollection tdCollection = tableCollection[0].SelectNodes("tr/td");
 - foreach (var td in tdCollection)
 - {
 - HtmlAttribute atr = td.Attributes["title"];
 - Console.WriteLine("td InnerText:" + td.InnerText + " | td title属性值:" + (atr == null ? "" : atr.Value));
 - }
 - Console.Read();
 
代理IP爬虫实现
会了HtmlAgilityPack的一些简单操作之后进入正式爬取过程,由于需要爬取的网页带IP封锁功能(一段时间请求频率过高封锁当前IP),在设计过程中我采用了爬取五次自动换代理IP突破网站限制(感觉自己坏坏的)。
整体实现逻辑
在.net里面使用WebRequest可以模拟HTTP的get Post请求,最终要的一点能设置请求时使用的代理IP,重点关注我标红的代码
- ///
 - /// 代理使用示例
 - ///
 - ///
 - ///
 - ///
 - public static string GetUrltoHtml(string Url, string type)
 - {
 - try
 - {
 - System.Net.WebRequest wReq = System.Net.WebRequest.Create(Url);
 - WebProxy myProxy = new WebProxy("192.168.15.11", 8015);
 - //建议连接(代理需要身份认证,才需要用户名密码)
 - myProxy.Credentials = new NetworkCredential("admin", "123456");
 - //设置请求使用代理信息
 - wReq.Proxy = myProxy;
 - // Get the response instance.
 - System.Net.WebResponse wResp = wReq.GetResponse();
 - System.IO.Stream respStream = wResp.GetResponseStream();
 - // Dim reader As StreamReader = New StreamReader(respStream)
 - using (System.IO.StreamReader reader = new System.IO.StreamReader(respStream, Encoding.GetEncoding(type)))
 - {
 - return reader.ReadToEnd();
 - }
 - }
 - catch (System.Exception ex)
 - {
 - //errorMsg = ex.Message;
 - }
 - return "";
 - }
 
了解如何使用代理IP,离我们的目标又近了一步,下面就是代理IP获取的实现了,由于代码有点多,我这里只贴出重要部分,IpProxyGet.cs源码可到文章末尾自行下载。
- ///
 - /// 获取总页数
 - ///
 - ///
 总页数 - private static int GetTotalPage(string IPURL, string ProxyIp)
 - {
 - var doc = new HtmlDocument();
 - doc.LoadHtml(GetHTML(IPURL, ProxyIp));
 - var res = doc.DocumentNode.SelectNodes(@"//div[@class='pagination']/a");
 - if (res != null && res.Count > 2)
 - {
 - int page;
 - if (int.TryParse(res[res.Count - 2].InnerText, out page))
 - {
 - return page;
 - }
 - }
 - return 1;
 - }
 
解析每一页HTML数据
- ///
 - /// 解析每一页数据
 - ///
 - ///
 - private static void DoWork(object param)
 - {
 - //参数还原
 - Hashtable table = param as Hashtable;
 - int start = Convert.ToInt32(table["start"]);
 - int end = Convert.ToInt32(table["end"]);
 - List
 list = table["list"] as List ; - ProxyParam Param = table["param"] as ProxyParam;
 - //页面地址
 - string url = string.Empty;
 - string ip = string.Empty;
 - IPProxy item = null;
 - HtmlNodeCollection nodes = null;
 - HtmlNode node = null;
 - HtmlAttribute atr = null;
 - for (int i = start; i <= end; i++)
 - {
 - LogHelper.WriteLog(string.Format("开始解析,页码{0}~{1},当前页码{2}", start, end, i));
 - url = string.Format("{0}/{1}", Param.IPUrl, i);
 - var doc = new HtmlDocument();
 - doc.LoadHtml(GetHTML(url, Param.ProxyIp));
 - //获取所有数据节点tr
 - var trs = doc.DocumentNode.SelectNodes(@"//table[@id='ip_list']/tr");
 - if (trs != null && trs.Count > 1)
 - {
 - LogHelper.WriteLog(string.Format("当前页码{0},请求地址{1},共{2}条数据", i, url, trs.Count));
 - for (int j = 1; j < trs.Count; j++)
 - {
 - nodes = trs[j].SelectNodes("td");
 - if (nodes != null && nodes.Count > 9)
 - {
 - ip = nodes[2].InnerText.Trim();
 - if (Param.IsPingIp && !Ping(ip))
 - {
 - continue;
 - }
 - //有效的IP才添加
 - item = new IPProxy();
 - node = nodes[1].FirstChild;
 - if (node != null)
 - {
 - atr = node.Attributes["alt"];
 - if (atr != null)
 - {
 - item.Country = atr.Value.Trim();
 - }
 - }
 - item.IP = ip;
 - item.Port = nodes[3].InnerText.Trim();
 - item.ProxyIp = GetIP(item.IP, item.Port);
 - item.Position = nodes[4].InnerText.Trim();
 - item.Anonymity = nodes[5].InnerText.Trim();
 - item.Type = nodes[6].InnerText.Trim();
 - node = nodes[7].SelectSingleNode("div[@class='bar']");
 - if (node != null)
 - {
 - atr = node.Attributes["title"];
 - if (atr != null)
 - {
 - item.Speed = atr.Value.Trim();
 - }
 - }
 - node = nodes[8].SelectSingleNode("div[@class='bar']");
 - if (node != null)
 - {
 - atr = node.Attributes["title"];
 - if (atr != null)
 - {
 - item.ConnectTime = atr.Value.Trim();
 - }
 - }
 - item.VerifyTime = nodes[9].InnerText.Trim();
 - list.Add(item);
 - }
 - }
 - LogHelper.WriteLog(string.Format("当前页码{0},共{1}条数据", i, trs.Count));
 - }
 - LogHelper.WriteLog(string.Format("结束解析,页码{0}~{1},当前页码{2}", start, end, i));
 - }
 - }
 
最终会获取2万多条数据
自动投票简单实现
这里使用.net的WebBrowser控件来加载页面,最终效果如下
- #region 设置代理IP
 - private void button2_Click(object sender, EventArgs e)
 - {
 - string proxy = this.textBox1.Text;
 - RefreshIESettings(proxy);
 - IEProxy ie = new IEProxy(proxy);
 - ie.RefreshIESettings();
 - //MessageBox.Show(ie.RefreshIESettings().ToString());
 - }
 - #endregion
 - #region 取消代理IP
 - private void button3_Click(object sender, EventArgs e)
 - {
 - IEProxy ie = new IEProxy(null);
 - ie.DisableIEProxy();
 - }
 - #endregion
 - #region 打开网页
 - private void button1_Click(object sender, EventArgs e)
 - {
 - string url = txt_url.Text.Trim();
 - if (string.IsNullOrEmpty(url))
 - {
 - MessageBox.Show("请输入要打开的网址");
 - return;
 - }
 - this.webBrowser1.Navigate(url, null, null, null);
 - }
 - #endregion
 
总结
本篇要介绍的内容到此结束了,下面写点我的期待!希望有喜欢的朋友一起来完善TaskManager(完全开源的),使之成为一款能够提高生活便捷 性的工具,添加很多新任务。比如:第二天要下雨或者下雪,发个邮件提醒,带上雨伞…。好了到了放出源代码的时间了。敬请期待下一篇!
简单投票源代码:http://files.cnblogs.com/files/yanweidie/SimpleIP.rar
TaskManagerSVN地址:http://code.taobao.org/svn/TaskManagerPub/Branch 使用svn checkout指令进行下载。
GitHub地址:https://github.com/CrazyJson/TaskManager
体验工具下载地址:TaskManager 解压后文件执行合并SQL,修改Config.xml数据库连接,使用WSWinForm进行安装。
                本文题目:使用TaskManager爬取2万条代理IP实现自动投票功能
                
                网页链接:http://www.csdahua.cn/qtweb/news27/73277.html
            
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网