作者: 乔克斯
查看: 36349|回复: 55

主题标签Tag

打印 上一主题 下一主题

[教程] 【网络爬虫类】HttpHelper网络爬虫类,Cookie、ssl、https都支持

  [复制链接]
跳转到指定楼层
楼主
乔克斯 发表于 2014-8-21 12:24:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
查看: 36349|回复: 55
HttpHelper网络爬虫类,Cookie、ssl、https都支持
    C#HttpHelper实现了C#HttpWebRequest抓取时无视编码,无视证书,无视Cookie,并且实现的代理的功能,使用它您可以进行GetPost请求,
可以很方便 的设置Cookie,证书,代理,编码问题您不用管,因为类会自动为您识别网页的编码。
    这个类是我以前写百度,和网络蜘蛛时使用的,经过上千万个网站的测试,上万个网站抓取的例子总结出来的,中间的方法也是我实验了很久之后方案,所以大家可以放心使用。
    我不敢说100%,但是应该是99%的网站都没有问题,都可以无视编码,证书,和Cookie,如果你确实发现那个网站在使用本类过程中有问题,出现乱码,或者是获取不了,不能带Cookie,不能带证书等问题,我非常乐意您能联系我,提出您的问题,您也可以直接回复本帖子,我会第一时间进行解答
    不要动不动就说我的类不行,类有Bug,获取不到Cookie,无法登录之类的,先看看教程,然后再看看自己获取的包是否有问题。类的Bug是很难出现的。
在webBrowser中取Cookie的方法:
[C#] 纯文本查看 复制代码
//取当前webBrowser登录后的Cookie值   
        [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
        static extern bool InternetGetCookieEx(string pchURL, string pchCookieName, StringBuilder pchCookieData, ref int pcchCookieData, int dwFlags, object lpReserved);
        //取出Cookie,当登录后才能取    
        private static string GetCookieString(string url)
        {
            // Determine the size of the cookie      
            int datasize = 256;
            StringBuilder cookieData = new StringBuilder(datasize);
            if (!InternetGetCookieEx(url, null, cookieData, ref datasize, 0x00002000, null))
            {
                if (datasize < 0)
                    return null;
                // Allocate stringbuilder large enough to hold the cookie    
                cookieData = new StringBuilder(datasize);
                if (!InternetGetCookieEx(url, null, cookieData, ref datasize, 0x00002000, null))
 
                    return null;
            }
            return cookieData.ToString();
        }


去掉所有的Html代码:
[C#] 纯文本查看 复制代码
        /// <summary>
        /// 过滤html标签
        /// </summary>
        /// <param name="strHtml">html的内容</param>
        /// <returns></returns>
        public static string StripHTML(string stringToStrip)
        {
            // paring using RegEx           //
            stringToStrip = Regex.Replace(stringToStrip, "</p(?:\\s*)>(?:\\s*)<p(?:\\s*)>", "\n\n", RegexOptions.IgnoreCase | RegexOptions.Compiled);
            stringToStrip = Regex.Replace(stringToStrip, "
", "\n", RegexOptions.IgnoreCase | RegexOptions.Compiled);
            stringToStrip = Regex.Replace(stringToStrip, "\"", "''", RegexOptions.IgnoreCase | RegexOptions.Compiled);
            stringToStrip = StripHtmlXmlTags(stringToStrip);
            return stringToStrip;
        }
        private static string StripHtmlXmlTags(string content)
        {
            return Regex.Replace(content, "<[^>]+>", "", RegexOptions.IgnoreCase | RegexOptions.Compiled);
        }
设置URl格式的问题
public static string URLDecode(string text)
       {
           return HttpUtility.UrlDecode(text, Encoding.Default);
       }
       public static string URLEncode(string text)
       {
           return HttpUtility.UrlEncode(text, Encoding.Default);
       }


HttpHelper类使用方法:
[C#] 纯文本查看 复制代码
HttpHelper http = new HttpHelper();
            HttpItem item = new HttpItem()
            {
                URL = "http://www.cskin.net",//URL     必需项
                Encoding = null,//编码格式(utf-8,gb2312,gbk)     可选项 默认类会自动识别
                //Encoding = Encoding.Default,
                Method = "get",//URL     可选项 默认为Get
                Timeout = 100000,//连接超时时间     可选项默认为100000
                ReadWriteTimeout = 30000,//写入Post数据超时时间     可选项默认为30000
                IsToLower = false,//得到的HTML代码是否转成小写     可选项默认转小写
                Cookie = "",//字符串Cookie     可选项
                UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)",//用户的浏览器类型,版本,操作系统     可选项有默认值
                Accept = "text/html, application/xhtml+xml, */*",//    可选项有默认值
                ContentType = "text/html",//返回类型    可选项有默认值
                Referer = "http://www.cskin.net",//来源URL     可选项
                Allowautoredirect = true,//是否根据301跳转     可选项
                CerPath = "d:\\123.cer",//证书绝对路径     可选项不需要证书时可以不写这个参数
                Connectionlimit = 1024,//最大连接数     可选项 默认为1024
                Postdata = "C:\\PERKYSU_20121129150608_ScrubLog.txt",//Post数据     可选项GET时不需要写
                PostDataType = PostDataType.FilePath,//默认为传入String类型,也可以设置PostDataType.Byte传入Byte类型数据
                ProxyIp = "192.168.1.105:8015",//代理服务器ID 端口可以直接加到后面以:分开就行了    可选项 不需要代理 时可以不设置这三个参数
                ProxyPwd = "123456",//代理服务器密码     可选项
                ProxyUserName = "administrator",//代理服务器账户名     可选项
                ResultType = ResultType.Byte,//返回数据类型,是Byte还是String
                PostdataByte = System.Text.Encoding.Default.GetBytes("测试一下"),//如果PostDataType为Byte时要设置本属性的值
                CookieCollection = new System.Net.CookieCollection(),//可以直接传一个Cookie集合进来
            };
            item.Header.Add("测试Key1", "测试Value1");
            item.Header.Add("测试Key2", "测试Value2");
            //得到HTML代码
            HttpResult result = http.GetHtml(item);
            //取出返回的Cookie
            string cookie = result.Cookie;
            //返回的Html内容
            string html = result.Html;
            if (result.StatusCode == System.Net.HttpStatusCode.OK)
            {
                //表示访问成功,具体的大家就参考HttpStatusCode类
            }
            //表示StatusCode的文字说明与描述
            string statusCodeDescription = result.StatusDescription;
            //把得到的Byte转成图片
            Image img = byteArrayToImage(result.ResultByte);
        }
        /// <summary>
        /// 字节数组生成图片
        /// </summary>
        /// <param name="Bytes">字节数组</param>
        /// <returns>图片</returns>
   private Image byteArrayToImage(byte[] Bytes)
        {
                MemoryStream ms = new MemoryStream(Bytes);
                Image outputImg = Image.FromStream(ms);
                return outputImg;
        }}


最简单的Post与Get的写法:
[C#] 纯文本查看 复制代码
HttpHelper http = new HttpHelper();
           HttpItem item = new HttpItem()
           {
               URL = "http://www.sufeinet.com",//URL这里都是测试     必需项
               Method = "get",//URL     可选项 默认为Get
           };
           //得到HTML代码
           HttpResult result = http.GetHtml(item);
           item = new HttpItem()
          {
              URL = "http://www.cskin.net",//URL这里都是测试URl   必需项
              Encoding = null,//编码格式(utf-8,gb2312,gbk)     可选项 默认类会自动识别
              //Encoding = Encoding.Default,
              Method = "post",//URL     可选项 默认为Get
              Postdata = "user=123123&pwd=1231313"
          };
           //得到新的HTML代码
           result = http.GetHtml(item);


HttpHelper设置Header参考的方法:
[C#] 纯文本查看 复制代码
HttpHelper http = new HttpHelper();
          HttpItem item = new HttpItem()
          {
              URL = "http://www.cskin.net",//URL     必需项
              Encoding = null,//编码格式(utf-8,gb2312,gbk)     可选项 默认类会自动识别
               //Encoding = Encoding.Default,
              Method = "get",//URL     可选项 默认为Get
          };
          item.Header.Add("测试Key1", "测试Value1");
          item.Header.Add("测试Key2", "测试Value2");
          //得到HTML代码
          HttpResult result = http.GetHtml(item);
          //取出返回的Cookie
          string cookie = result.Cookie;
          //返回的Html内容
          string html = result.Html;
          if (result.StatusCode == System.Net.HttpStatusCode.OK)
          {
              //表示访问成功,具体的大家就参考HttpStatusCode类
          }
          //表示StatusCode的文字说明与描述
          string statusCodeDescription = result.StatusDescription;


HttpHelper获取图片的方式:
[C#] 纯文本查看 复制代码
HttpHelper http = new HttpHelper();
          HttpItem item = new HttpItem()
          {
              URL = "http://www.cskin.net",//URL     必需项
              Encoding = null,//编码格式(utf-8,gb2312,gbk)     可选项 默认类会自动识别
              //Encoding = Encoding.Default,
              ResultType = ResultType.Byte
          };
          //得到HTML代码
          HttpResult result = http.GetHtml(item);
          if (result.StatusCode == System.Net.HttpStatusCode.OK)
          {
              //表示访问成功,具体的大家就参考HttpStatusCode类
          }
          //表示StatusCode的文字说明与描述
          string statusCodeDescription = result.StatusDescription;
          //把得到的Byte转成图片
          Image img = byteArrayToImage(result.ResultByte);
      }
 
      /// <summary>
      /// 字节数组生成图片
      /// </summary>
      /// <param name="Bytes">字节数组</param>
      /// <returns>图片</returns>
      private Image byteArrayToImage(byte[] Bytes)
      {
              MemoryStream ms = new MemoryStream(Bytes);
              Image outputImg = Image.FromStream(ms);
              return outputImg;
      }


二次或多次使用Cookie的方式:
[C#] 纯文本查看 复制代码
HttpHelper http = new HttpHelper();
          HttpItem item = new HttpItem()
          {
              URL = "http://www.cskin.net",//URL这里都是测试     必需项
              Encoding = null,//编码格式(utf-8,gb2312,gbk)     可选项 默认类会自动识别
              //Encoding = Encoding.Default,
              Method = "get",//URL     可选项 默认为Get
          };
          //得到HTML代码
          HttpResult result = http.GetHtml(item);
          item = new HttpItem()
         {
             URL = "http://www.cskin.net",//URL这里都是测试URl   必需项
             Encoding = null,//编码格式(utf-8,gb2312,gbk)     可选项 默认类会自动识别
             //Encoding = Encoding.Default,
             Method = "get",//URL     可选项 默认为Get
             Cookie = result.Cookie,
         };
          //得到新的HTML代码
          result = http.GetHtml(item);


CookieCollection类型的Cookie使用方法:
[C#] 纯文本查看 复制代码
HttpHelper http = new HttpHelper();
           HttpItem item = new HttpItem()
           {
               URL = "http://www.cskin.net",//URL这里都是测试     必需项
               Encoding = null,//编码格式(utf-8,gb2312,gbk)     可选项 默认类会自动识别
               //Encoding = Encoding.Default,
               Method = "get",//URL     可选项 默认为Get
               ResultCookieType = ResultCookieType.CookieCollection
           };
           //得到HTML代码
           HttpResult result = http.GetHtml(item);
           item = new HttpItem()
           {
               URL = "http://www.cskin.net",//URL这里都是测试URl   必需项
               Encoding = null,//编码格式(utf-8,gb2312,gbk)     可选项 默认类会自动识别
               //Encoding = Encoding.Default,
               Method = "get",//URL     可选项 默认为Get
               CookieCollection = result.CookieCollection,
               ResultCookieType = ResultCookieType.CookieCollection
           };
           //得到新的HTML代码
           result = http.GetHtml(item);


案例源码下载:

评分

参与人数 1金钱 +1 收起 理由
不同的世界 + 1 感谢分享,LZ辛苦了~

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏15 转播转播
回复 论坛版权

使用道具 举报

沙发
gjfabc 发表于 2014-9-4 16:24:33 | 只看该作者
下载一个,研究一下,谢谢分享。
板凳
jiasongmao 发表于 2014-9-12 13:45:03 | 只看该作者
做了简单的测试,这个类确实写的不错。
地板
bbspcs 发表于 2014-10-31 11:38:30 | 只看该作者
支持一下!
回复

使用道具 举报

5#
判囚 发表于 2014-11-1 16:54:35 | 只看该作者
强力的支持哈
6#
longgun119 发表于 2014-12-17 10:43:00 | 只看该作者
下载一个,研究一下,谢谢分享。
7#
evilatom 发表于 2014-12-29 16:08:32 | 只看该作者
下载一个,研究一下,谢谢分享。
8#
傲风残月 发表于 2014-12-30 16:54:00 | 只看该作者
学习学习,好想很叼
9#
ssxh_tanhc 发表于 2015-1-4 15:24:08 | 只看该作者
GOOD JOB, THANKS
10#
kunkun0921 发表于 2015-4-13 15:30:30 | 只看该作者
这个应该是苏飞的HttpHelper类把
您需要登录后才可以回帖 登录 | 加入CSkin博客

本版积分规则

QQ|申请友链|小黑屋|手机版|Archiver|CSkin ( 粤ICP备13070794号

Powered by Discuz! X3.2  © 2001-2013 Comsenz Inc.  Designed by ARTERY.cn
GMT+8, 2024-12-23 05:52, Processed in 0.630597 second(s), 40 queries , Gzip On.

快速回复 返回顶部 返回列表