您的位置:首页 >新闻资讯 > 正文

成功爬取代理IP的案例分享

来源:互联网 作者:admin 时间:2019-09-24 14:33:16

  在我们需要进行爬取数据的时候,需要用到代理IP来帮助我们让爬虫程序不被网站的反爬虫机制给封杀。如果只是简单用一下来进行练习的话,那么我们可以抓取一些免费的代理IP来练练手。下面给大家分享一个成功抓取的案例。


  代理IP爬虫实现


  会了HtmlAgilityPack的一些简单操作之后进入正式爬取过程,由于需要爬取的网页带IP封锁功能(一段时间请求频率过高封锁当前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获取的实现了,由于代码有点多,这里只贴出重要部分。


  /// <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万多条数据

  

成功爬取代理IP的案例分享


  不过免费代理IP虽然是可以不用花钱,但是IP的有效性质量实在是比较堪忧,如果是一些比较大型的爬虫项目,建议大家还是不要省这笔钱,找个靠谱的代理服务商才是王道。


相关文章内容简介