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

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

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

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

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

查看: 3019|回复: 4

[求助] 退出登录后马上登录失败

[复制链接]
发表于 2015-7-11 09:02:06 | 显示全部楼层 |阅读模式
我试图抓取一个网站的内容,类似网络爬虫吧,因为在测试,需要重复登录。现登录和抓取都能解决,苦恼的是,一旦退出后马上再登陆,就被拒绝,原因是一次只能有一个用户登录,估计上次的session还未过期(退出后五分钟才过期)。
用HttpWatch查看了用浏览器做类似的请求和响应的头和cookie,发现退出后有几个cookie的值归零。但在程序中如何实现像浏览器那样重置cookie呢? 以下是退出部分的代码,请各位指点迷津:


[C#] 纯文本查看 复制代码
        public HttpResult logout()
        {
            HttpHelper http = new HttpHelper();
            HttpItem item = new HttpItem()
            {
                URL = "https://www.mysite.com/logoff.j",
                Method = "get",
                ResultCookieType = ResultCookieType.CookieCollection,
                Allowautoredirect = true,
            };
            HttpResult res = http.GetHtml(item);

            return res;
        }



1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
 楼主| 发表于 2015-7-11 09:07:53 | 显示全部楼层
补充:估计任务完成后关闭程序,但返回的cookie没有覆盖原来的cookie。但程序重新运行时,就只能调用退出前的还有效的cookie,所以被拒。有什么办法可以检查前面的还有效呢?
发表于 2015-7-13 08:54:32 | 显示全部楼层
退出时,模拟下网站的退出,不就可以了嘛~
 楼主| 发表于 2015-7-13 09:46:56 | 显示全部楼层
谢谢回复!我一直想模拟像浏览器那样退出网站,但就是不行,执行上面的退出代码,响应显示Ok,cookie也与浏览器响应中的一致。但接着登陆,又出现“只允许一个用户登录,可能是关掉浏览器,忘了退出”的信息(翻译)。 可我没有用浏览器,登录和退出只是模拟而已。我的执行顺序是这样的,我有一个应用,启动dll(内部调用线程,模拟登录网站,抓取数据,接收数据后,传给主界面,如此循环,直到调用命令关停所有背景任务),停止dll及其管理的所有背景任务及线程。
后来,我想每次退出时将最后得到的CookieCollection存到文件里,每次登录前再载入并赋值给item。我在HttpHelper的setRequest和getData里分别做了如下改动,还是不行:
[C#] 纯文本查看 复制代码
 
BinaryFormatter formatter = new BinaryFormatter();
        string sfile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "cookies.dat"); 


在setRequest里加入:

[C#] 纯文本查看 复制代码
 
if (item.ResultCookieType == ResultCookieType.CookieCollection && item.CookieCollection == null)
            {
                CookieCollection retrievedCookies = null;
                if (File.Exists(sfile))
                {
                    using (Stream s = File.OpenRead(sfile))
                        retrievedCookies = (CookieCollection)formatter.Deserialize(s);
                }
                item.CookieCollection = retrievedCookies;
            }


在getData里:


[C#] 纯文本查看 复制代码
 
using (Stream s = File.Create(sfile))
                formatter.Serialize(s, response.Cookies);   



 楼主| 发表于 2015-7-15 20:02:07 | 显示全部楼层
问题已解决,无需保存cookie到文本。原来的问题出在我的程序关闭时使用了TerminateProcess, 因此造成退出不完整或无法执行,原来的session还有效,马上登录就被拒。现在取消使用TerminateProcess,改用其它停止运行的指令,允许正确退出,这样再登录就没问题了。
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

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

GMT+8, 2024-5-18 06:07

© 2014-2021

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