zoukankan      html  css  js  c++  java
  • C#多线程爬虫抓取免费代理IP

    本人开发的开发者技术变现资源聚集地,大家支持下,下面是网址

    https://www.baiydu.com

       这里用到一个HTML解析辅助类:HtmlAgilityPack,如果没有网上找一个增加到库里,这个插件有很多版本,如果你开发环境是使用VS2005就2.0的类库,VS2010就使用4.0,以此类推..........然后直接创建一个控制台应用,将我下面的代码COPY替换就可以运行,下面就来讲讲我两年前做爬虫经历,当时是给一家公司做,也是用的C#,不过当时遇到一个头痛的问题就是抓的图片有病毒,然后系统挂了几次。所以抓网站图片要注意安全,虽然我这里没涉及到图片,但是还是提醒下看文章的朋友。

     class Program
        {
            //存放所有抓取的代理
            public static List<proxy> masterPorxyList = new List<proxy>();
            //代理IP类
            public class proxy
            {
                public string ip;
    
                public string port;
                public int  speed;
    
                public proxy(string pip,string pport,int pspeed)
                
                {
                    this.ip = pip;
                    this.port = pport;
                    this.speed = pspeed;
                 }
    
    
            }
           //抓去处理方法
            static void getProxyList(object pageIndex)
            {
    
                string urlCombin = "http://www.xicidaili.com/wt/" + pageIndex.ToString();
                string catchHtml = catchProxIpMethord(urlCombin, "UTF8");
                
    
                HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
               doc.LoadHtml(catchHtml);
    
    
               HtmlNode table = doc.DocumentNode.SelectSingleNode("//div[@id='wrapper']//div[@id='body']/table[1]");
    
               HtmlNodeCollection collectiontrs = table.SelectNodes("./tr");   
    
     
               
                   for (int i = 0; i < collectiontrs.Count; i++)
                   {
                       HtmlAgilityPack.HtmlNode itemtr = collectiontrs[i];
    
    
                       HtmlNodeCollection collectiontds = itemtr.ChildNodes;
                       //table中第一个是能用的代理标题,所以这里从第二行TR开始取值
                       if (i>0)
                       {
                           HtmlNode itemtdip = (HtmlNode)collectiontds[3];
    
                           HtmlNode itemtdport = (HtmlNode)collectiontds[5];
    
                           HtmlNode itemtdspeed = (HtmlNode)collectiontds[13];
     
                           string ip = itemtdip.InnerText.Trim();
                           string port = itemtdport.InnerText.Trim();
    
    
                           string speed = itemtdspeed.InnerHtml;
                           int beginIndex = speed.IndexOf(":", 0, speed.Length);
                           int endIndex = speed.IndexOf("%", 0, speed.Length);
    
                           int subSpeed = int.Parse(speed.Substring(beginIndex + 1, endIndex - beginIndex - 1));
                           //如果速度展示条的值大于90,表示这个代理速度快。
                         if (subSpeed > 90)
                            {
                                proxy temp = new proxy(ip, port, subSpeed);
                                
                                masterPorxyList.Add(temp);
                                Console.WriteLine("当前是第:" + masterPorxyList.Count.ToString() + "个代理IP");
                           }
                        
                          }
    
    
                   }
     
            }
    
            //抓网页方法
            static string catchProxIpMethord(string url,string encoding )
            {
    
                string htmlStr = "";
                try
                {
                    if (!String.IsNullOrEmpty(url))
                    {
                        WebRequest request = WebRequest.Create(url);    
                        WebResponse response = request.GetResponse();           
                        Stream datastream = response.GetResponseStream(); 
                        Encoding ec = Encoding.Default;
                        if (encoding == "UTF8")
                        {
                            ec = Encoding.UTF8;
                        }
                        else if (encoding == "Default")
                        {
                            ec = Encoding.Default;
                        }
                        StreamReader reader = new StreamReader(datastream, ec);
                        htmlStr = reader.ReadToEnd();               
                        reader.Close();
                        datastream.Close();
                        response.Close();
                    }
                }
                catch { }
                return htmlStr;
            }
    
    
          static void Main(string[] args)
             {
                 //多线程同时抓15页
                 for (int i = 1; i <= 15; i++)
                 {
                    
                      
                     ThreadPool.QueueUserWorkItem(getProxyList, i);
                 }
                 Console.Read();
             }
    
        }

    本人创业做的一款androidApp, 下载量已经有2000多万,各种当前热门的网络手机奖励红包全部集成,另外还有热门电影和淘宝高额优惠券!很适合各类型的用户。

     

  • 相关阅读:
    USACO Milk2 区间合并
    Codeforces 490B Queue【模拟】
    HDU 3974 Assign the task 简单搜索
    HDU 5119 Happy Matt Friends(2014北京区域赛现场赛H题 裸背包DP)
    Cin、Cout 加快效率方法
    POJ 1159 回文LCS滚动数组优化
    POJ 2479 不相交最大子段和
    POJ 1458 最长公共子序列 LCS
    在阿里最深刻的,还是职场之道给我的震撼
    精细化
  • 原文地址:https://www.cnblogs.com/xiaoliao/p/7436711.html
Copyright © 2011-2022 走看看