使用TaskManager爬取2万条代理IP实现自动投票功能

话说某天心血来潮想到一个问题,朋友圈里面经常有人发投票链接,让帮忙给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

  
 
  1. string HTML = @"简单解析测试
  2.                     
  3.                         
  4.                              
  5.                                 
  6.                                 cn
  7.                             
  8.                         
  9. 1
  10.                     
  •                 ";
  •             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,重点关注我标红的代码

     
     
    1. /// 
    2.         /// 代理使用示例
    3.         /// 
    4.         /// 
    5.         /// 
    6.         /// 
    7.         public static string GetUrltoHtml(string Url, string type)
    8.         {
    9.             try
    10.             {
    11.                 System.Net.WebRequest wReq = System.Net.WebRequest.Create(Url);
    12.                 WebProxy myProxy = new WebProxy("192.168.15.11", 8015);
    13.                 //建议连接(代理需要身份认证,才需要用户名密码)
    14.                 myProxy.Credentials = new NetworkCredential("admin", "123456");
    15.                 //设置请求使用代理信息
    16.                 wReq.Proxy = myProxy;
    17.                 // Get the response instance.
    18.                 System.Net.WebResponse wResp = wReq.GetResponse();
    19.                 System.IO.Stream respStream = wResp.GetResponseStream();
    20.                 // Dim reader As StreamReader = New StreamReader(respStream)
    21.                 using (System.IO.StreamReader reader = new System.IO.StreamReader(respStream, Encoding.GetEncoding(type)))
    22.                 {
    23.                     return reader.ReadToEnd();
    24.                 }
    25.             }
    26.             catch (System.Exception ex)
    27.             {
    28.                 //errorMsg = ex.Message;
    29.             }
    30.             return "";
    31.         }

    了解如何使用代理IP,离我们的目标又近了一步,下面就是代理IP获取的实现了,由于代码有点多,我这里只贴出重要部分,IpProxyGet.cs源码可到文章末尾自行下载。

      
     
    1. /// 
    2.   /// 获取总页数
    3.   /// 
    4.   /// 总页数
    5.   private static int GetTotalPage(string IPURL, string ProxyIp)
    6.   {
    7.       var doc = new HtmlDocument();
    8.       doc.LoadHtml(GetHTML(IPURL, ProxyIp));
    9.       var res = doc.DocumentNode.SelectNodes(@"//div[@class='pagination']/a");
    10.       if (res != null && res.Count > 2)
    11.       {
    12.           int page;
    13.           if (int.TryParse(res[res.Count - 2].InnerText, out page))
    14.           {
    15.               return page;
    16.           }
    17.       }
    18.       return 1;
    19.   }

    解析每一页HTML数据

      
     
    1. /// 
    2.        /// 解析每一页数据
    3.        /// 
    4.        /// 
    5.        private static void DoWork(object param)
    6.        {
    7.            //参数还原
    8.            Hashtable table = param as Hashtable;
    9.            int start = Convert.ToInt32(table["start"]);
    10.            int end = Convert.ToInt32(table["end"]);
    11.            List list = table["list"] as List;
    12.            ProxyParam Param = table["param"] as ProxyParam;
    13.            //页面地址
    14.            string url = string.Empty;
    15.            string ip = string.Empty;
    16.            IPProxy item = null;
    17.            HtmlNodeCollection nodes = null;
    18.            HtmlNode node = null;
    19.            HtmlAttribute atr = null;
    20.            for (int i = start; i <= end; i++)
    21.            {
    22.                LogHelper.WriteLog(string.Format("开始解析,页码{0}~{1},当前页码{2}", start, end, i));
    23.                url = string.Format("{0}/{1}", Param.IPUrl, i);
    24.                var doc = new HtmlDocument();
    25.                doc.LoadHtml(GetHTML(url, Param.ProxyIp));
    26.                //获取所有数据节点tr
    27.                var trs = doc.DocumentNode.SelectNodes(@"//table[@id='ip_list']/tr");
    28.                if (trs != null && trs.Count > 1)
    29.                {
    30.                    LogHelper.WriteLog(string.Format("当前页码{0},请求地址{1},共{2}条数据", i, url, trs.Count));
    31.                    for (int j = 1; j < trs.Count; j++)
    32.                    {
    33.                        nodes = trs[j].SelectNodes("td");
    34.                        if (nodes != null && nodes.Count > 9)
    35.                        {
    36.                            ip = nodes[2].InnerText.Trim();
    37.                            if (Param.IsPingIp && !Ping(ip))
    38.                            {
    39.                                continue;
    40.                            }
    41.                            //有效的IP才添加
    42.                            item = new IPProxy();
    43.                            node = nodes[1].FirstChild;
    44.                            if (node != null)
    45.                            {
    46.                                atr = node.Attributes["alt"];
    47.                                if (atr != null)
    48.                                {
    49.                                    item.Country = atr.Value.Trim();
    50.                                }
    51.                            }
    52.                            item.IP = ip;
    53.                            item.Port = nodes[3].InnerText.Trim();
    54.                            item.ProxyIp = GetIP(item.IP, item.Port);
    55.                            item.Position = nodes[4].InnerText.Trim();
    56.                            item.Anonymity = nodes[5].InnerText.Trim();
    57.                            item.Type = nodes[6].InnerText.Trim();
    58.                            node = nodes[7].SelectSingleNode("div[@class='bar']");
    59.                            if (node != null)
    60.                            {
    61.                                atr = node.Attributes["title"];
    62.                                if (atr != null)
    63.                                {
    64.                                    item.Speed = atr.Value.Trim();
    65.                                }
    66.                            }
    67.                            node = nodes[8].SelectSingleNode("div[@class='bar']");
    68.                            if (node != null)
    69.                            {
    70.                                atr = node.Attributes["title"];
    71.                                if (atr != null)
    72.                                {
    73.                                    item.ConnectTime = atr.Value.Trim();
    74.                                }
    75.                            }
    76.                            item.VerifyTime = nodes[9].InnerText.Trim();
    77.                            list.Add(item);
    78.                        }
    79.                    }
    80.                    LogHelper.WriteLog(string.Format("当前页码{0},共{1}条数据", i, trs.Count));
    81.                }
    82.                LogHelper.WriteLog(string.Format("结束解析,页码{0}~{1},当前页码{2}", start, end, i));
    83.            }
    84.        }

    最终会获取2万多条数据

    自动投票简单实现

    这里使用.net的WebBrowser控件来加载页面,最终效果如下

      
     
    1. #region 设置代理IP
    2.         private void button2_Click(object sender, EventArgs e)
    3.         {
    4.             string proxy = this.textBox1.Text;
    5.             RefreshIESettings(proxy);
    6.             IEProxy ie = new IEProxy(proxy);
    7.             ie.RefreshIESettings();
    8.             //MessageBox.Show(ie.RefreshIESettings().ToString());
    9.         }
    10.         #endregion
    11.         #region 取消代理IP
    12.         private void button3_Click(object sender, EventArgs e)
    13.         {
    14.             IEProxy ie = new IEProxy(null);
    15.             ie.DisableIEProxy();
    16.         }
    17.         #endregion
    18.         #region 打开网页
    19.         private void button1_Click(object sender, EventArgs e)
    20.         {
    21.             string url = txt_url.Text.Trim();
    22.             if (string.IsNullOrEmpty(url))
    23.             {
    24.                 MessageBox.Show("请输入要打开的网址");
    25.                 return;
    26.             }
    27.             this.webBrowser1.Navigate(url, null, null, null);
    28.         }
    29.         #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。内容未经允许不得转载,或转载时需注明来源: 快上网

    成都快上网为您推荐相关内容

    网站内链知识

    同城分类信息