国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

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

2020-01-24 01:27:41
字體:
供稿:網(wǎng)友

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

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

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

答:答案是肯定的

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

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

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

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

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

代理IP介紹

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

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

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

HtmlAgilityPack使用

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

解析簡單的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);   //輸出頁面標(biāo)題   Console.WriteLine("頁面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));   //獲取頁面所有table   HtmlNodeCollection tableCollection = doc.DocumentNode.SelectNodes("http://table");   Console.WriteLine("頁面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爬蟲實(shí)現(xiàn)

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

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

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

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

/// <summary>  /// 獲取總頁數(shù)  /// </summary>  /// <returns>總頁數(shù)</returns>  private static int GetTotalPage(string IPURL, string ProxyIp)  {  var doc = new HtmlDocument();  doc.LoadHtml(GetHTML(IPURL, ProxyIp));  var res = doc.DocumentNode.SelectNodes(@"http://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數(shù)據(jù)

/// <summary>  /// 解析每一頁數(shù)據(jù)  /// </summary>  /// <param name="param"></param>  private static void DoWork(object param)  {   //參數(shù)還原   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},當(dāng)前頁碼{2}", start, end, i));   url = string.Format("{0}/{1}", Param.IPUrl, i);   var doc = new HtmlDocument();   doc.LoadHtml(GetHTML(url, Param.ProxyIp));   //獲取所有數(shù)據(jù)節(jié)點(diǎn)tr   var trs = doc.DocumentNode.SelectNodes(@"http://table[@id='ip_list']/tr");   if (trs != null && trs.Count > 1)   {    LogHelper.WriteLog(string.Format("當(dāng)前頁碼{0},請求地址{1},共{2}條數(shù)據(jù)", 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("當(dāng)前頁碼{0},共{1}條數(shù)據(jù)", i, trs.Count));   }   LogHelper.WriteLog(string.Format("結(jié)束解析,頁碼{0}~{1},當(dāng)前頁碼{2}", start, end, i));   }  }

最終會獲取2萬多條數(shù)據(jù)

自動投票簡單實(shí)現(xiàn)

這里使用.net的WebBrowser控件來加載頁面,最終效果如下

#region 設(shè)置代理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 打開網(wǎng)頁  private void button1_Click(object sender, EventArgs e)  {   string url = txt_url.Text.Trim();   if (string.IsNullOrEmpty(url))   {   MessageBox.Show("請輸入要打開的網(wǎng)址");   return;   }   this.webBrowser1.Navigate(url, null, null, null);  }  #endregion 

總結(jié)

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 湘潭县| 正蓝旗| 永嘉县| 泰宁县| 新邵县| 苏州市| 墨玉县| 伊金霍洛旗| 长阳| 四平市| 利辛县| 黄陵县| 辽宁省| 屏山县| 灵武市| 乐安县| 疏附县| 乌恰县| 石景山区| 弋阳县| 襄城县| 扶余县| 航空| 香格里拉县| 宝鸡市| 高雄县| 民乐县| 天水市| 开封市| 乐平市| 梅河口市| 延吉市| 北海市| 深泽县| 兰坪| 郁南县| 三亚市| 开鲁县| 张家界市| 宝丰县| 威远县|