成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

使用TaskManager爬取2萬(wàn)條代理IP實(shí)現(xiàn)自動(dòng)投票功能

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

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

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

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

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爬蟲實(shí)現(xiàn)細(xì)節(jié),你需要準(zhǔn)備的知識(shí):HtmlAgilityPack解析HTML,Quart.net

代理IP介紹

百度百科介紹:代理(英語(yǔ):Proxy),也稱網(wǎng)絡(luò)代理,是一種特殊的網(wǎng)絡(luò)服務(wù),允許一個(gè)網(wǎng)絡(luò)終端(一般為客戶端)通過(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在線獲取,但是很多都是提供幾十個(gè)試用的,如果想使用更多的代理IP,則需付費(fèi)購(gòu)買。這里我找到了一個(gè)提供很多代理IP的網(wǎng)站,可以自行百度“代理ip”(以免認(rèn)為我打廣告),或者參考開源TaskManager介紹這篇文章。

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

HtmlAgilityPack使用

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

解析簡(jiǎn)單的HTML

  1. string HTML = @"<html><head><title>簡(jiǎn)單解析測(cè)試</title></head><body> 
  2.                     <div id='div1' title='div1'
  3.                         <table> 
  4.                              <tr> 
  5.                                 <td>1</td> 
  6.                                 <td title='cn'>cn</td> 
  7.                             </tr> 
  8.                         </table> 
  9.                     </div> 
  10.                 </body></html>"; 
  11.             var doc = new HtmlDocument(); 
  12.             doc.LoadHtml(HTML); 
  13.             //輸出頁(yè)面標(biāo)題 
  14.             Console.WriteLine("頁(yè)面title:"+doc.DocumentNode.SelectSingleNode("/html/head/title").InnerText); 
  15.             //獲取div1節(jié)點(diǎn)  方式1 
  16.             HtmlNode divNode1 = doc.GetElementbyId("div1"); 
  17.             //獲取div1節(jié)點(diǎn)  方式2 
  18.             HtmlNode divNode2 = doc.DocumentNode.SelectSingleNode("//div[@id='div1']"); 
  19.             //判斷節(jié)點(diǎn)1和節(jié)點(diǎn)2是否相同 
  20.             Console.WriteLine("斷節(jié)點(diǎn)1和節(jié)點(diǎn)2是否相同:" + (divNode1 == divNode2)); 
  21.             //獲取頁(yè)面所有table 
  22.             HtmlNodeCollection tableCollection = doc.DocumentNode.SelectNodes("//table"); 
  23.             Console.WriteLine("頁(yè)面table數(shù)量:"+tableCollection.Count); 
  24.             //獲取table下所有td并輸出信息 
  25.             HtmlNodeCollection tdCollection = tableCollection[0].SelectNodes("tr/td"); 
  26.             foreach (var td in tdCollection) 
  27.             { 
  28.                 HtmlAttribute atr = td.Attributes["title"]; 
  29.                 Console.WriteLine("td InnerText:" + td.InnerText + " | td title屬性值:" + (atr == null ? "" : atr.Value)); 
  30.             } 
  31.             Console.Read(); 

代理IP爬蟲實(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. /// <summary> 
  2.         /// 代理使用示例 
  3.         /// </summary> 
  4.         /// <param name="Url"></param> 
  5.         /// <param name="type"></param> 
  6.         /// <returns></returns> 
  7.         public static string GetUrltoHtml(string Url, string type) 
  8.         { 
  9.             try 
  10.             { 
  11.                 System.Net.WebRequest wReq = System.Net.WebRequest.Create(Url); 
  12.  
  13.                 WebProxy myProxy = new WebProxy("192.168.15.11"8015); 
  14.                 //建議連接(代理需要身份認(rèn)證,才需要用戶名密碼) 
  15.                 myProxy.Credentials = new NetworkCredential("admin""123456"); 
  16.                 //設(shè)置請(qǐng)求使用代理信息 
  17.                 wReq.Proxy = myProxy; 
  18.                 // Get the response instance. 
  19.                 System.Net.WebResponse wResp = wReq.GetResponse(); 
  20.                 System.IO.Stream respStream = wResp.GetResponseStream(); 
  21.                 // Dim reader As StreamReader = New StreamReader(respStream) 
  22.                 using (System.IO.StreamReader reader = new System.IO.StreamReader(respStream, Encoding.GetEncoding(type))) 
  23.                 { 
  24.                     return reader.ReadToEnd(); 
  25.                 } 
  26.             } 
  27.             catch (System.Exception ex) 
  28.             { 
  29.                 //errorMsg = ex.Message; 
  30.             } 
  31.             return ""
  32.         } 

了解如何使用代理IP,離我們的目標(biāo)又近了一步,下面就是代理IP獲取的實(shí)現(xiàn)了,由于代碼有點(diǎn)多,我這里只貼出重要部分,IpProxyGet.cs源碼可到文章末尾自行下載。 

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

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

  1. /// <summary> 
  2.        /// 解析每一頁(yè)數(shù)據(jù) 
  3.        /// </summary> 
  4.        /// <param name="param"></param> 
  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<IPProxy> list = table["list"] as List<IPProxy>; 
  12.            ProxyParam Param = table["param"] as ProxyParam; 
  13.  
  14.            //頁(yè)面地址 
  15.            string url = string.Empty; 
  16.            string ip = string.Empty; 
  17.            IPProxy item = null
  18.            HtmlNodeCollection nodes = null
  19.            HtmlNode node = null
  20.            HtmlAttribute atr = null
  21.            for (int i = start; i <= end; i++) 
  22.            { 
  23.                LogHelper.WriteLog(string.Format("開始解析,頁(yè)碼{0}~{1},當(dāng)前頁(yè)碼{2}", start, end, i)); 
  24.                url = string.Format("{0}/{1}", Param.IPUrl, i); 
  25.                var doc = new HtmlDocument(); 
  26.                doc.LoadHtml(GetHTML(url, Param.ProxyIp)); 
  27.                //獲取所有數(shù)據(jù)節(jié)點(diǎn)tr 
  28.                var trs = doc.DocumentNode.SelectNodes(@"//table[@id='ip_list']/tr"); 
  29.                if (trs != null && trs.Count > 1
  30.                { 
  31.                    LogHelper.WriteLog(string.Format("當(dāng)前頁(yè)碼{0},請(qǐng)求地址{1},共{2}條數(shù)據(jù)", i, url, trs.Count)); 
  32.                    for (int j = 1; j < trs.Count; j++) 
  33.                    { 
  34.                        nodes = trs[j].SelectNodes("td"); 
  35.                        if (nodes != null && nodes.Count > 9
  36.                        { 
  37.                            ip = nodes[2].InnerText.Trim(); 
  38.                            if (Param.IsPingIp && !Ping(ip)) 
  39.                            { 
  40.                                continue
  41.                            } 
  42.                            //有效的IP才添加 
  43.                            item = new IPProxy(); 
  44.  
  45.                            node = nodes[1].FirstChild; 
  46.                            if (node != null
  47.                            { 
  48.                                atr = node.Attributes["alt"]; 
  49.                                if (atr != null
  50.                                { 
  51.                                    item.Country = atr.Value.Trim(); 
  52.                                } 
  53.                            } 
  54.  
  55.                            item.IP = ip; 
  56.                            item.Port = nodes[3].InnerText.Trim(); 
  57.                            item.ProxyIp = GetIP(item.IP, item.Port); 
  58.                            item.Position = nodes[4].InnerText.Trim(); 
  59.                            item.Anonymity = nodes[5].InnerText.Trim(); 
  60.                            item.Type = nodes[6].InnerText.Trim(); 
  61.  
  62.                            node = nodes[7].SelectSingleNode("div[@class='bar']"); 
  63.                            if (node != null
  64.                            { 
  65.                                atr = node.Attributes["title"]; 
  66.                                if (atr != null
  67.                                { 
  68.                                    item.Speed = atr.Value.Trim(); 
  69.                                } 
  70.                            } 
  71.  
  72.                            node = nodes[8].SelectSingleNode("div[@class='bar']"); 
  73.                            if (node != null
  74.                            { 
  75.                                atr = node.Attributes["title"]; 
  76.                                if (atr != null
  77.                                { 
  78.                                    item.ConnectTime = atr.Value.Trim(); 
  79.                                } 
  80.                            } 
  81.                            item.VerifyTime = nodes[9].InnerText.Trim(); 
  82.                            list.Add(item); 
  83.                        } 
  84.                    } 
  85.                    LogHelper.WriteLog(string.Format("當(dāng)前頁(yè)碼{0},共{1}條數(shù)據(jù)", i, trs.Count)); 
  86.                } 
  87.                LogHelper.WriteLog(string.Format("結(jié)束解析,頁(yè)碼{0}~{1},當(dāng)前頁(yè)碼{2}", start, end, i)); 
  88.            } 
  89.        } 

最終會(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 打開網(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)輸入要打開的網(wǎng)址"); 
  25.                 return
  26.             } 
  27.             this.webBrowser1.Navigate(url, nullnullnull); 
  28.         } 
  29.         #endregion 

總結(jié)

本篇要介紹的內(nèi)容到此結(jié)束了,下面寫點(diǎn)我的期待!希望有喜歡的朋友一起來(lái)完善TaskManager(完全開源的),使之成為一款能夠提高生活便捷 性的工具,添加很多新任務(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)行安裝。

責(zé)任編輯:王雪燕 來(lái)源: 焰尾迭
相關(guān)推薦

2021-07-03 09:04:22

XPathPython免費(fèi)代理IP

2018-07-25 13:47:51

彭于晏邪不壓正Python

2018-08-27 09:39:33

租房數(shù)據(jù)北漂

2019-08-21 07:44:32

離線消息拉取開發(fā)

2013-05-16 10:15:11

信息泄密彭博Bloomberg

2022-04-12 16:39:55

數(shù)據(jù)泄露網(wǎng)絡(luò)攻擊

2018-07-23 08:52:56

Python 數(shù)據(jù)獲取數(shù)據(jù)處理

2017-08-21 10:05:57

Python影評(píng) 爬蟲

2022-10-09 11:09:48

黑客數(shù)據(jù)泄露

2013-10-25 09:22:14

2009-06-22 15:10:00

java 編程AOP

2014-01-21 17:36:58

2022-04-28 20:12:44

二分法搜索算法

2010-01-12 12:20:42

2015-07-07 10:55:05

個(gè)人信息個(gè)人信息安全信息安全

2025-03-07 11:17:09

2010-07-27 16:10:22

2019-07-16 08:51:03

熱搜新浪微博數(shù)據(jù)

2018-09-13 09:39:03

騰訊運(yùn)維IT

2023-10-19 15:13:25

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲 欧美 另类 日韩 | 自拍偷拍一区二区三区 | 免费毛片在线 | 日韩视频国产 | 亚洲一区二区三区视频免费观看 | 91视频免费| 日韩三级在线 | 九九热精品视频 | 国产精品日韩 | 韩日一区二区三区 | 99re视频这里只有精品 | 成人国产一区二区三区精品麻豆 | 国产剧情一区二区三区 | 国产精品久久久久久久久免费桃花 | 成年人在线观看视频 | 国产一区二区久久 | 性一交一乱一伦视频免费观看 | 操操日 | 91精品国产91久久久久久最新 | 国产乡下妇女做爰 | 国产精品1区| 日韩a视频 | 毛片一区二区三区 | 91视频网 | 中文字幕国产 | 久久蜜桃av一区二区天堂 | 国产视频三区 | 国产高清一区二区三区 | 久久一二区 | 国产精品久久久久久av公交车 | 日本精品国产 | 91精品国产综合久久香蕉922 | 亚洲欧美国产精品久久 | 久久久精品视频一区二区三区 | 看片wwwwwwwwwww| h片免费在线观看 | 欧美自拍日韩 | 国产免费视频在线 | 国产aaaaav久久久一区二区 | 精品久久久久久久久久久 | 国产高清自拍视频在线观看 |