苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 3496|回复: 1

[反馈建议] 自定义404错误内容获取源码问题

[复制链接]
发表于 2013-7-17 09:32:41 | 显示全部楼层 |阅读模式
一般自定义的404错误会输出一个404StatusCode和自定义错误页面内容,HttpHelper遇到这种情况就产生WebException错误,不能获取具体错误页面
1.4.1版本GetHtml方法 修改的代码如下
public HttpResult GetHtml(HttpItem objhttpitem)
        {
            //返回参数
            HttpResult result = new HttpResult();
            try
            {
                //准备参数
                SetRequest(objhttpitem);
            }
            catch (Exception ex)
            {
                result = new HttpResult();
                result.Cookie = string.Empty;
                result.Header = null;
                result.Html = ex.Message;
                result.StatusDescription = "配置参数时出错:" + ex.Message;
                return result;
            }
            try
            {
                #region 得到请求的response
                //using (response = (HttpWebResponse)request.GetResponse())
                //{
                try
                {
                    response = (HttpWebResponse)request.GetResponse();
                }
                catch (WebException ex)
                {
                    //这里是在发生异常时返回的错误信息
                    response = (HttpWebResponse)ex.Response;
                }
                result.StatusCode = response.StatusCode;
                result.StatusDescription = response.StatusDescription;
                result.Header = response.Headers;
                if (response.Cookies != null) result.CookieCollection = response.Cookies;
                if (response.Headers["set-cookie"] != null) result.Cookie = response.Headers["set-cookie"];
                MemoryStream _stream = new MemoryStream();
                //GZIIP处理
                if (response.ContentEncoding != null && response.ContentEncoding.Equals("gzip", StringComparison.InvariantCultureIgnoreCase))
                {
                    //开始读取流并设置编码方式
                    //new GZipStream(response.GetResponseStream(), CompressionMode.Decompress).CopyTo(_stream, 10240);
                    //.net4.0以下写法
                    _stream = GetMemoryStream(new GZipStream(response.GetResponseStream(), CompressionMode.Decompress));
                }
                else
                {
                    //开始读取流并设置编码方式
                    //response.GetResponseStream().CopyTo(_stream, 10240);
                    //.net4.0以下写法
                    _stream = GetMemoryStream(response.GetResponseStream());
                }
                //获取Byte
                byte[] RawResponse = _stream.ToArray();
                _stream.Close();
                //是否返回Byte类型数据
                if (objhttpitem.ResultType == ResultType.Byte) result.ResultByte = RawResponse;
                //从这里开始我们要无视编码了
                if (encoding == null)
                {
                    Match meta = Regex.Match(Encoding.Default.GetString(RawResponse), "<meta([^<]*)charset=([^<]*)[\"']", RegexOptions.IgnoreCase);
                    string charter = (meta.Groups.Count > 1) ? meta.Groups[2].Value.ToLower() : string.Empty;
                    if (charter.Length > 2)
                        encoding = Encoding.GetEncoding(charter.Trim().Replace("\"", "").Replace("'", "").Replace(";", "").Replace("iso-8859-1", "gbk"));
                    else
                    {
                        if (string.IsNullOrEmpty(response.CharacterSet)) encoding = Encoding.UTF8;
                        else encoding = Encoding.GetEncoding(response.CharacterSet);
                    }
                }
                //得到返回的HTML
                result.Html = encoding.GetString(RawResponse);
                response.Close();
                //}
                #endregion
            }
            //catch (WebException ex)
            //{
            //    //这里是在发生异常时返回的错误信息
            //    response = (HttpWebResponse)ex.Response;
            //    result.Html = ex.Message;
            //    if (response != null)
            //    {
            //        result.StatusCode = response.StatusCode;
            //        result.StatusDescription = response.StatusDescription;
            //    }
            //}
            catch (Exception ex)
            {
                result.Html = ex.Message;
            }
            if (objhttpitem.IsToLower) result.Html = result.Html.ToLower();
            return result;
        }

建议在HttpItem的时候加个控制是否返回详细内容或错误信息
[i]嬠/i]



1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2013-7-17 10:13:21 | 显示全部楼层
你给我一下你所说的不能返回信息的404页面我做下测试
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-12-23 18:21

© 2014-2021

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