• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > 利用TaskManager爬取2万条代理IP实现自动投票功能

利用TaskManager爬取2万条代理IP实现自动投票功能

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了taskmanager,securitytaskmanager,taskmanager是什么,taskmanager.apk,taskmanagerplayer等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

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();
</div>

回

代理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 ""; 
 } 
</div>

了解如何使用代理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; 
 } 
</div>

解析每一页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.Coun



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 利用TaskManager爬取2万条代理IP实现自动投票功能

相关文章

  • 2017-05-28C#接口(Interface)用法分析
  • 2017-05-28C#实现刷新桌面的方法
  • 2017-05-28C# JsonHelper 操作辅助类,拿来直接用
  • 2017-05-28C#多线程学习之(四)使用线程池进行多线程的自动管理
  • 2017-05-28解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
  • 2017-05-28DevExpress根据条件设置GridControl RepositoryItem是否可编辑
  • 2017-05-28利用C#实现网络爬虫
  • 2017-05-28C#位移的介绍与例子
  • 2017-05-28DevExpress之ChartControl实现柱状图演示实例
  • 2017-05-28C#连接操作 MySQL 数据库实例(使用官方驱动)

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 采用easyui tree编写简单角色权限代码的方法
    • c#将list类型转换成DataTable方法示例
    • C#使用WinRar命令进行压缩和解压缩操作的实现方法
    • C#中的 == 和equals()区别浅析
    • C#实现简单的Http请求实例
    • IIS下调用证书出现异常的解决方法 (C#)
    • C#发送内置图片html格式邮件的方法
    • C#文件断点续传实现方法
    • C#留言时间格式化
    • C#进阶系列 WebApi身份认证解决方案推荐:Basic基础认证

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有