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

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

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

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

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

查看: 10707|回复: 11

[求助] 很奇怪,明明携带了Cookie,发出的请求却不完整

[复制链接]
发表于 2014-6-29 23:10:31 | 显示全部楼层 |阅读模式
[C#] 纯文本查看 复制代码
//拿到BAIDUID
                this.HP.GetHtml("http://www.baidu.com/", true);
                //得到token
                string html = this.HP.GetHtml("https://passport.baidu.com/v2/api/?getapi&tpl=mn&apiver=v3&tt=1385512949190&class=login&logintype=dialogLogin&callback=bd__cbs__j3jwk9", true);



[C#] 纯文本查看 复制代码
public string GetHtml(string url,bool saveCookie)
        {
            HttpHelper http=new HttpHelper();
            HttpItem item = new HttpItem()
            {
                URL = url,//必需项
                Timeout = 15000,//30秒超时
                Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
                Encoding = null,//编码格式(utf-8,gb2312,gbk)     可选项 默认类会自动识别
                Method = "get",
                CookieCollection = this.mycookie,//使用Cookie
                UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36",
                ProxyIp = "127.0.0.1:8888",
                ResultCookieType = ResultCookieType.CookieCollection
            };
            HttpResult result = http.GetHtml(item);
            string content = result.Html;
            this.mycookie.Add(result.CookieCollection);//存储Cookie
            //this.mycookie = result.Cookie;
            return content;
        }


1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
 楼主| 发表于 2014-6-29 23:13:18 | 显示全部楼层
ProxyIp = "127.0.0.1:8888" 是我自己用工具抓包看的。在第一次访问www.baidu.com的时候,返回了3个cookie对,我调试的时候确认他们已经都存到我的全局变量
private CookieCollection mycookie = new CookieCollection();  
里面了。
[C#] 纯文本查看 复制代码
Set-Cookie: BAIDUID=14AEB3805D82EB128A57826A6752D4FC:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BDSVRTM=0; path=/
Set-Cookie: H_PS_PSSID=6622_7048_5228_1467_5224_6995_6757_7344_6505_7233_6017_7202_6930_7133_7390_6983; path=/; domain=.baidu.com


但第二次访问passport.baidu.com的时候,构造的item,里面明明带了3对值,实际发出的请求中却只剩了最后一个:

[C#] 纯文本查看 复制代码
Cookie: H_PS_PSSID=6622_7048_5228_1467_5224_6995_6757_7344_6505_7233_6017_7202_6930_7133_7390_6983
 楼主| 发表于 2014-6-29 23:14:34 | 显示全部楼层
以前用的也是一样的方式,很多cookie值都没问题,今天写个新的程序,突然就这样了,想了一晚上没想明白。

希望能得到指教。
 楼主| 发表于 2014-6-29 23:16:54 | 显示全部楼层
这是调试时,构造的item里的CookieCollection
cookie.jpg
发表于 2014-6-30 08:18:23 | 显示全部楼层
ProxyIp = "127.0.0.1:8888",为什么要加这个啊,不用使用代理吧。
 楼主| 发表于 2014-6-30 12:39:05 | 显示全部楼层
站长苏飞 发表于 2014-6-30 08:18
ProxyIp = "127.0.0.1:8888",为什么要加这个啊,不用使用代理吧。

这个是Fiddler的代理,我抓包用的。不加代理也是一样的,我用了最新版的HttpHelper,开始还以为新版有问题,又换回了以前用的旧版,结果还是一样。
 楼主| 发表于 2014-6-30 12:42:46 | 显示全部楼层
站长苏飞 发表于 2014-6-30 08:18
ProxyIp = "127.0.0.1:8888",为什么要加这个啊,不用使用代理吧。

从代码上我自己找不出任何问题了,调试的时候都调到HttpHelper里看了。如果可以的话,我把项目打包发给您,刚开始写,就一点代码。VS2012, .net4.0
发表于 2014-6-30 13:18:07 | 显示全部楼层
提供下完整的包信息看看,你第二个方法,访问的是什么URl,刚才是什么,
 楼主| 发表于 2014-6-30 14:01:29 | 显示全部楼层
[C#] 纯文本查看 复制代码
private HttpHelp _hp= new HttpHelp();
        public HttpHelp HP
        {
            get { return this._hp; }
            set { this._hp = value; }
        }
private bool isReady()                                             //这个是获取2个参数的,一个BAIDUID,一个Token,前者是cookie,后者是一个提交参数
        {
            try
            {
                this.HP = new HttpHelp();
                //拿到BAIDUID
                this.HP.GetHtml("http://www.baidu.com/", true);
                //得到token
                string html = this.HP.GetHtml("https://passport.baidu.com/v2/api/?getapi&tpl=mn&apiver=v3&tt=1385512949190&class=login&logintype=dialogLogin&callback=bd__cbs__j3jwk9", true);
                string pattern = "(?<=\"token\" : \")\\S+?(?=\")";
                this.Token = MatchHelp.GetString(html, pattern);
                if (!string.IsNullOrEmpty(this.Token))
                {
                    this.tokenDone = true;
                    return true;

                }
                else
                {
                    return false;
                }
            }
            catch
            {
                return false;
            }
        }



[C#] 纯文本查看 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Web;

namespace SuperBlockServer
{
    public class HttpHelp
    {
        private CookieCollection mycookie = new CookieCollection();
        
        //private string mycookie;
        public string GetHtml(string url,bool saveCookie)
        {
            HttpHelper http=new HttpHelper();
            HttpItem item = new HttpItem()
            {
                URL = url,//必需项
                Timeout = 15000,//30秒超时
                Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
                Encoding = null,//编码格式(utf-8,gb2312,gbk)     可选项 默认类会自动识别
                Method = "get",
                CookieCollection = this.mycookie,//使用Cookie
                UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36",
                //ProxyIp = "127.0.0.1:8888",
                ResultCookieType = ResultCookieType.CookieCollection
            };
            HttpResult result = http.GetHtml(item);
            string content = result.Html;
            this.mycookie.Add(result.CookieCollection);//存储Cookie
            //this.mycookie = result.Cookie;
            return content;
        }
        public string PostHtml(string url, string postStr, bool saveCookie)
        {
            HttpHelper http = new HttpHelper();
            HttpItem item = new HttpItem()
            {
                URL = url,//必需项
                Timeout = 15000,//30秒超时
                Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
                Encoding = null,//编码格式(utf-8,gb2312,gbk)     可选项 默认类会自动识别
                Method = "post",
                UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36",
                ContentType = "application/x-www-form-urlencoded",
                Postdata=postStr,
                //CookieCollection = this.mycookie,//使用Cookie
                ProxyIp = "127.0.0.1:8888",
                ResultCookieType = ResultCookieType.CookieCollection
            };
            HttpResult result = http.GetHtml(item);
            string content = result.Html;
            if (result.StatusCode == System.Net.HttpStatusCode.OK)
            {
                if (saveCookie)
                {
                    this.mycookie.Add(result.CookieCollection);//存储Cookie
                }
                return content;
            }
            else
            {
                return null;
            }
        }
    }
}
 楼主| 发表于 2014-6-30 14:03:00 | 显示全部楼层
站长苏飞 发表于 2014-6-30 13:18
提供下完整的包信息看看,你第二个方法,访问的是什么URl,刚才是什么,

代码在楼上。第一次是访问百度首页www.baidu.com 第二次是访问https://passport.baidu.com 获取登录时的token串
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

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

GMT+8, 2024-12-23 05:14

© 2014-2021

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