程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 應用TaskManager爬取2萬條署理IP完成主動投票功效

應用TaskManager爬取2萬條署理IP完成主動投票功效

編輯:C#入門知識

應用TaskManager爬取2萬條署理IP完成主動投票功效。本站提示廣大學習愛好者:(應用TaskManager爬取2萬條署理IP完成主動投票功效)文章只能為提供參考,不一定能成為您想要的結果。以下是應用TaskManager爬取2萬條署理IP完成主動投票功效正文


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(完整開源的),使之成為一款可以或許進步生涯便捷 性的對象,添加許多新義務。好比:第二天要下雨或許下雪,發個郵件提示,帶上雨傘…。好了到了放出源代碼的時光了。敬請等待下一篇!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved