日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
使用TaskManager爬取2萬(wàn)條代理IP實(shí)現(xiàn)自動(dòng)投票功能

話(huà)說(shuō)某天心血來(lái)潮想到一個(gè)問(wèn)題,朋友圈里面經(jīng)常有人發(fā)投票鏈接,讓幫忙給XX投票,以前呢會(huì)很自覺(jué)打開(kāi)鏈接幫忙投一票??墒沁@種事做多了就會(huì)考慮能不能使用工具來(lái)進(jìn)行投票呢,身為一名程序猿決定研究解決這個(gè)問(wèn)題。于是有了以下思考

公司主營(yíng)業(yè)務(wù):成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶(hù)真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶(hù)帶來(lái)驚喜。創(chuàng)新互聯(lián)推出尼木免費(fèi)做網(wǎng)站回饋大家。

1.是否能一個(gè)人投多票,如果不行又是什么限制了一人投多票?

答:投票網(wǎng)站限制了一個(gè)IP或者一個(gè)用戶(hù)只能投一票,防止惡意刷票行為

2.如果是一個(gè)IP一票那是否代表著多個(gè)IP就能投多票了呢?

答:答案是肯定的

3.用什么方法能夠在代碼里面改變自己請(qǐng)求的IP?

答:HTTP請(qǐng)求的時(shí)候設(shè)置代理IP

4.多個(gè)代理IP從哪里獲取,獲取到之后我又該如何使用代碼自動(dòng)化投票?

答:請(qǐng)看文章后面內(nèi)容

本篇將介紹TaskManager內(nèi)置任務(wù)-代理IP爬蟲(chóng)實(shí)現(xiàn)細(xì)節(jié),你需要準(zhǔn)備的知識(shí):HtmlAgilityPack解析HTML,Quart.net。

代理IP介紹

百度百科介紹:代理(英語(yǔ):Proxy),也稱(chēng)網(wǎng)絡(luò)代理,是一種特殊的網(wǎng)絡(luò)服務(wù),允許一個(gè)網(wǎng)絡(luò)終端(一般為客戶(hù)端)通過(guò)這個(gè)服務(wù)與另一個(gè)網(wǎng)絡(luò)終端 (一般為服務(wù)器)進(jìn)行非直接的連接。一些網(wǎng)關(guān)、路由器等網(wǎng)絡(luò)設(shè)備具備網(wǎng)絡(luò)代理功能。一般認(rèn)為代理服務(wù)有利于保障網(wǎng)絡(luò)終端的隱私或安全,防止攻擊。

目前有很多廠商提供代理IP在線(xiàn)獲取,但是很多都是提供幾十個(gè)試用的,如果想使用更多的代理IP,則需付費(fèi)購(gòu)買(mǎi)。這里我找到了一個(gè)提供很多代理IP的網(wǎng)站,可以自行百度“代理ip”(以免認(rèn)為我打廣告),或者參考開(kāi)源TaskManager介紹這篇文章。

有了這么多在線(xiàn)的代理IP可以解決文章開(kāi)頭的問(wèn)題4了,可是還有個(gè)問(wèn)題這些數(shù)據(jù)都是網(wǎng)頁(yè)上的,我在代碼里面怎么使用呢?這就用到了HtmlAgilityPack工具包,看名稱(chēng)就能猜到是用來(lái)解析HTML的。

HtmlAgilityPack使用

HtmlAgilityPack是一個(gè)開(kāi)源的解析HTML元素的類(lèi)庫(kù),最大的特點(diǎn)是可以通過(guò)XPath來(lái)解析HMTL,如果您以前用C#操作過(guò)XML,那么使用起HtmlAgilityPack也會(huì)得心應(yīng)手。

解析簡(jiǎn)單的HTML

  
 
  1. string HTML = @"簡(jiǎn)單解析測(cè)試
  2.                     
  3.                         
  4.                              
  5.                                 
  6.                                 cn
  7.                             
  8.                         
  9. 1
  10.                     
  •                 ";
  •             var doc = new HtmlDocument();
  •             doc.LoadHtml(HTML);
  •             //輸出頁(yè)面標(biāo)題
  •             Console.WriteLine("頁(yè)面title:"+doc.DocumentNode.SelectSingleNode("/html/head/title").InnerText);
  •             //獲取div1節(jié)點(diǎn)  方式1
  •             HtmlNode divNode1 = doc.GetElementbyId("div1");
  •             //獲取div1節(jié)點(diǎn)  方式2
  •             HtmlNode divNode2 = doc.DocumentNode.SelectSingleNode("http://div[@id='div1']");
  •             //判斷節(jié)點(diǎn)1和節(jié)點(diǎn)2是否相同
  •             Console.WriteLine("斷節(jié)點(diǎn)1和節(jié)點(diǎn)2是否相同:" + (divNode1 == divNode2));
  •             //獲取頁(yè)面所有table
  •             HtmlNodeCollection tableCollection = doc.DocumentNode.SelectNodes("http://table");
  •             Console.WriteLine("頁(yè)面table數(shù)量:"+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爬蟲(chóng)實(shí)現(xiàn)

    會(huì)了HtmlAgilityPack的一些簡(jiǎn)單操作之后進(jìn)入正式爬取過(guò)程,由于需要爬取的網(wǎng)頁(yè)帶IP封鎖功能(一段時(shí)間請(qǐng)求頻率過(guò)高封鎖當(dāng)前IP),在設(shè)計(jì)過(guò)程中我采用了爬取五次自動(dòng)換代理IP突破網(wǎng)站限制(感覺(jué)自己壞壞的)。

    整體實(shí)現(xiàn)邏輯

    在.net里面使用WebRequest可以模擬HTTP的get Post請(qǐng)求,最終要的一點(diǎn)能設(shè)置請(qǐng)求時(shí)使用的代理IP,重點(diǎn)關(guān)注我標(biāo)紅的代碼

     
     
    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.                 //建議連接(代理需要身份認(rèn)證,才需要用戶(hù)名密碼)
    14.                 myProxy.Credentials = new NetworkCredential("admin", "123456");
    15.                 //設(shè)置請(qǐng)求使用代理信息
    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,離我們的目標(biāo)又近了一步,下面就是代理IP獲取的實(shí)現(xiàn)了,由于代碼有點(diǎn)多,我這里只貼出重要部分,IpProxyGet.cs源碼可到文章末尾自行下載。

      
     
    1. /// 
    2.   /// 獲取總頁(yè)數(shù)
    3.   /// 
    4.   /// 總頁(yè)數(shù)
    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(@"http://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.   }

    解析每一頁(yè)HTML數(shù)據(jù)

      
     
    1. /// 
    2.        /// 解析每一頁(yè)數(shù)據(jù)
    3.        /// 
    4.        /// 
    5.        private static void DoWork(object param)
    6.        {
    7.            //參數(shù)還原
    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.            //頁(yè)面地址
    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("開(kāi)始解析,頁(yè)碼{0}~{1},當(dāng)前頁(yè)碼{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.                //獲取所有數(shù)據(jù)節(jié)點(diǎn)tr
    27.                var trs = doc.DocumentNode.SelectNodes(@"http://table[@id='ip_list']/tr");
    28.                if (trs != null && trs.Count > 1)
    29.                {
    30.                    LogHelper.WriteLog(string.Format("當(dāng)前頁(yè)碼{0},請(qǐng)求地址{1},共{2}條數(shù)據(jù)", 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("當(dāng)前頁(yè)碼{0},共{1}條數(shù)據(jù)", i, trs.Count));
    81.                }
    82.                LogHelper.WriteLog(string.Format("結(jié)束解析,頁(yè)碼{0}~{1},當(dāng)前頁(yè)碼{2}", start, end, i));
    83.            }
    84.        }

    最終會(huì)獲取2萬(wàn)多條數(shù)據(jù)

    自動(dòng)投票簡(jiǎn)單實(shí)現(xiàn)

    這里使用.net的WebBrowser控件來(lái)加載頁(yè)面,最終效果如下

      
     
    1. #region 設(shè)置代理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 打開(kāi)網(wǎng)頁(yè)
    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("請(qǐng)輸入要打開(kāi)的網(wǎng)址");
    25.                 return;
    26.             }
    27.             this.webBrowser1.Navigate(url, null, null, null);
    28.         }
    29.         #endregion

    總結(jié)

    本篇要介紹的內(nèi)容到此結(jié)束了,下面寫(xiě)點(diǎn)我的期待!希望有喜歡的朋友一起來(lái)完善TaskManager(完全開(kāi)源的),使之成為一款能夠提高生活便捷 性的工具,添加很多新任務(wù)。比如:第二天要下雨或者下雪,發(fā)個(gè)郵件提醒,帶上雨傘…。好了到了放出源代碼的時(shí)間了。敬請(qǐng)期待下一篇!

    簡(jiǎn)單投票源代碼:http://files.cnblogs.com/files/yanweidie/SimpleIP.rar

    TaskManagerSVN地址:http://code.taobao.org/svn/TaskManagerPub/Branch   使用svn checkout指令進(jìn)行下載。

    GitHub地址:https://github.com/CrazyJson/TaskManager

    體驗(yàn)工具下載地址:TaskManager  解壓后文件執(zhí)行合并SQL,修改Config.xml數(shù)據(jù)庫(kù)連接,使用WSWinForm進(jìn)行安裝。


    當(dāng)前題目:使用TaskManager爬取2萬(wàn)條代理IP實(shí)現(xiàn)自動(dòng)投票功能
    分享URL:http://www.dlmjj.cn/article/dpjgcpe.html