关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » .NET »教你如何使用TaskManager爬取2万条代理IP实现自动投票功能

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

    2015-09-20 00:00:00 出处:richieyang
    分享

    话说某天心血来潮想到一个问题,朋友圈里面经常有人发投票链接,让帮忙给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 = @"<html><head><title>简单解析测试</title></head><body>
                        <div id='div1' title='div1'>
                            <table>
                                 <tr>
                                    <td>1</td>
                                    <td title='cn'>cn</td>
                                </tr>
                            </table>
                        </div>
                    </body></html>";
                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,重点关注我标红的代码

    /// <summary>
            /// 代理使用示例
            /// </summary>
            /// <param name="Url"></param>
            /// <param name="type"></param>
            /// <returns></returns>
            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源码可到文章末尾自行下载。

            /// <summary>
            /// 获取总页数
            /// </summary>
            /// <returns>总页数</returns>
            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数据

     /// <summary>
            /// 解析每一页数据
            /// </summary>
            /// <param name="param"></param>
            private static void DoWork(object param)
            {
                //参数还原
                Hashtable table = param as Hashtable;
                int start = Convert.ToInt32(table["start"]);
                int end = Convert.ToInt32(table["end"]);
                List<IPProxy> list = table["list"] as List<IPProxy>;
                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进行安装。

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    帝国CMS7.5编辑器上传图片取消宽高的三种方法

    帝国cms如何自动生成缩略图的实现方法

    Windows 12即将到来,将彻底改变人机交互

    帝国CMS 7.5忘记登陆账号密码怎么办?可以phpmyadmin中重置管理员密码

    帝国CMS 7.5 后台编辑器换行,修改回车键br换行为p标签

    Windows 11 版本与 Windows 10比较,新功能一览

    Windows 11激活产品密钥收集及专业版激活方法

    如何从 Windows 11 中完全删除/卸载 OneNote?无解!

    抖音安全与信任开放日:揭秘推荐算法,告别单一标签依赖

    ultraedit编辑器打开文件时,总是提示是否转换为DOS格式,如何关闭?

    IT头条

    华为Pura80系列新机预热,余承东力赞其复杂光线下的视频拍摄实力

    01:28

    阿里千问3开源首战告捷:全球下载破千万,国产AI模型崛起新高度!

    01:22

    DeepSeek R1小版本试升级:网友实测编程能力已达到国际一线水平

    23:15

    NVIDIA 与 Dell 合作,大规模交付 Blackwell AI 系统

    20:52

    Cerebras 以最快的 Llama 4 Maverick 性能引领 LLM 推理竞赛

    20:51

    技术热点

    PHP中的随机性——你觉得自己幸运吗?

    搞定Ubuntu Linux下WPA无线上网

    Java使用内存映射实现大文件的上传

    MySQL安全性指南

    MySQL两项性能的基本测试浅谈

    教您使用UniqueIdentifier选取SQL Server主键

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。