http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

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

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

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

查看: 29395|回复: 16

[综合] 当HttpHelper类遇到请求头含有 x-requested-with: XMLHttpRequest 的解决方法。。

[复制链接]
发表于 2013-5-7 14:11:45 | 显示全部楼层 |阅读模式
在使用 HttpHelper类时遇到一个问题,就是当抓包时某些请求头里含有,x-requested-with: XMLHttpRequest

这个时候,按正常的请求参数,WebRequest请求始终得不到响应或者得到504.。


这时候只需要在 发送请求的时候添加以下代码即可:



[code=csharp]ProtocolVersion = new Version("1.0"); [/code]      





本帖被以下淘专辑推荐:



1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2013-5-7 14:17:03 | 显示全部楼层
没看懂,这种直接在Header里添加参数也行吧。如下代码[code=csharp]
HttpHelper http = new HttpHelper();
            HttpItem item = new HttpItem()
            {
                URL = "http://www.sufeinet.com",//URL     必需项
                Encoding = null,//编码格式(utf-8,gb2312,gbk)     可选项 默认类会自动识别
                 //Encoding = Encoding.Default,
                Method = "get",//URL     可选项 默认为Get
            };
            item.Header.Add("x-requested-with", "XMLHttpRequest");
         
            //得到HTML代码
            HttpResult result = http.GetHtml(item);[/code]
你的这个写法要怎么用啊,只是写个ProtocolVersion = new Version("1.0");要怎么写到Httphelper里呢?
发表于 2013-5-7 14:17:55 | 显示全部楼层
求用法
 楼主| 发表于 2013-5-7 21:37:55 | 显示全部楼层
直接加到 Header里貌似不行,我试过。

必须这样:

[code=csharp]        /// <summary>
        /// 为请求准备参数
        /// </summary>
        ///<param name="objhttpItem">参数列表</param>
        /// <param name="_Encoding">读取数据时的编码方式</param>
        private void SetRequest(HttpItem objhttpItem)
        {
            // 验证证书
            SetCer(objhttpItem);
            //设置Header参数
            if (objhttpItem.Header != null && objhttpItem.Header.Count > 0)
            {
                foreach (string item in objhttpItem.Header.AllKeys)
                {
                    request.Headers.Add(item, objhttpItem.Header[item]);
                }
            }
            // 设置代理
            SetProxy(objhttpItem);
            //请求方式Get或者Post
            request.Method = objhttpItem.Method;
            request.Timeout = objhttpItem.Timeout;
            request.ProtocolVersion = new Version("1.0");                //加上这句
            request.ReadWriteTimeout = objhttpItem.ReadWriteTimeout;
            //Accept
            request.Accept = objhttpItem.Accept;
            //ContentType返回类型
            request.ContentType = objhttpItem.ContentType;
            //UserAgent客户端的访问类型,包括浏览器版本和操作系统信息
            request.UserAgent = objhttpItem.UserAgent;
            // 编码
            encoding = objhttpItem.Encoding;
            //设置Cookie
            SetCookie(objhttpItem);
            //来源地址
            request.Referer = objhttpItem.Referer;
            //是否执行跳转功能
            request.AllowAutoRedirect = objhttpItem.Allowautoredirect;
            //设置Post数据
            SetPostData(objhttpItem);
            //设置最大连接
            if (objhttpItem.Connectionlimit > 0)
                request.ServicePoint.ConnectionLimit = objhttpItem.Connectionlimit;
        }[/code]

发表于 2013-5-7 21:41:06 | 显示全部楼层
cyberarmy 发表于 2013-5-7 21:37
直接加到 Header里貌似不行,我试过。

必须这样:

ProtocolVersion = new Version("1.0");  楼主没看到你用这个啊,
你上面写的是苏飞Httphelper类的源代码,好像没什么变化吧
 楼主| 发表于 2013-5-7 21:43:16 | 显示全部楼层
站长苏飞 发表于 2013-5-7 14:17
没看懂,这种直接在Header里添加参数也行吧。如下代码
你的这个写法要怎么用啊,只是写个ProtocolVersion  ...

在加入这个代码的同时,修改 SetRequest方法。。

代码如下:


[code=csharp]item.Header.Add("x-requested-with", "XMLHttpRequest");       //必须[/code]





[code=csharp]        /// <summary>
        /// 为请求准备参数
        /// </summary>
        ///<param name="objhttpItem">参数列表</param>
        /// <param name="_Encoding">读取数据时的编码方式</param>
        private void SetRequest(HttpItem objhttpItem)
        {
            // 验证证书
            SetCer(objhttpItem);
            //设置Header参数
            if (objhttpItem.Header != null && objhttpItem.Header.Count > 0)
            {
                foreach (string item in objhttpItem.Header.AllKeys)
                {
                    request.Headers.Add(item, objhttpItem.Header[item]);
                }
            }
            // 设置代理
            SetProxy(objhttpItem);
            //请求方式Get或者Post
            request.Method = objhttpItem.Method;
            request.Timeout = objhttpItem.Timeout;
            request.ProtocolVersion = new Version("1.0");        //必须
            request.ReadWriteTimeout = objhttpItem.ReadWriteTimeout;
            //Accept
            request.Accept = objhttpItem.Accept;
            //ContentType返回类型
            request.ContentType = objhttpItem.ContentType;
            //UserAgent客户端的访问类型,包括浏览器版本和操作系统信息
            request.UserAgent = objhttpItem.UserAgent;
            // 编码
            encoding = objhttpItem.Encoding;
            //设置Cookie
            SetCookie(objhttpItem);
            //来源地址
            request.Referer = objhttpItem.Referer;
            //是否执行跳转功能
            request.AllowAutoRedirect = objhttpItem.Allowautoredirect;
            //设置Post数据
            SetPostData(objhttpItem);
            //设置最大连接
            if (objhttpItem.Connectionlimit > 0)
                request.ServicePoint.ConnectionLimit = objhttpItem.Connectionlimit;
        }[/code]
发表于 2013-5-7 21:44:50 | 显示全部楼层
cyberarmy 发表于 2013-5-7 21:43
在加入这个代码的同时,修改 SetRequest方法。。

代码如下:

看到了,你是说这两个参数都必须要加是吧。
 楼主| 发表于 2013-5-7 23:48:19 | 显示全部楼层
yangying 发表于 2013-5-7 21:44
看到了,你是说这两个参数都必须要加是吧。

对,两个地方都需要设置。
发表于 2013-5-8 06:15:14 | 显示全部楼层
cyberarmy 发表于 2013-5-7 23:48
对,两个地方都需要设置。

嗯好的谢谢,我记录下,我们下次升级,也加下这个属性,可以发下你访问的那个网站吗
发表于 2013-5-8 06:15:16 | 显示全部楼层
cyberarmy 发表于 2013-5-7 23:48
对,两个地方都需要设置。

嗯好的谢谢,我记录下,我们下次升级,也加下这个属性,可以发下你访问的那个网站吗
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

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

GMT+8, 2024-5-2 04:59

© 2014-2021

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