python 用已登录的cookie发送请求

jungua1990 2013-09-17 02:08:23
如题,比如现在已经手动用ie登录了csdn,然后可以在ie的缓存里面找到对应的cookie,能否用这个cookie请求我的博客等需要登录的页面呢?网络上找了很多中方法,但是没有一种尝试成功的。
#coding=utf-8
import cookielib, urllib2
import os
ckjar = cookielib.MozillaCookieJar(os.path.join('C:\Users\abcd\AppData\Roaming\Microsoft\Windows\Cookies', 'VOTG0G8U.txt'))
#ckjar = cookielib.CookieJar();
demoUrl = "http://bbs.csdn.net/topics/new/"
req = urllib2.Request(demoUrl)
req.add_header('User-Agent', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)')
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(ckjar) )

w = opener.open(req)
fi = open('1.html','w')
fi.write(w.read())
fi.close()

以上是我尝试的代码,不能成功!不知道问题处在哪里,大神求指导啊,或者有别的方法?
...全文
5352 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
ImN1 2013-09-22
  • 打赏
  • 举报
回复
另外,从写程序(做项目)的角度看,理应写成全自动,不应借助另一个工具(指界面) 即使验证码也应从OCR考虑,尽可能核心程序完成,必要时(不能识别)再考虑生成一个界面手动输入 但我写代码只是自用,所以就偷懒了,生成界面也省了,验证码登录过程交给浏览器,代码就接管这个过程产生的结果
ImN1 2013-09-22
  • 打赏
  • 举报
回复
引用 10 楼 crifan 的回复:
[quote=引用 9 楼 snmr_com 的回复:] [quote=引用 7 楼 crifan 的回复:] 你直接拿别处(浏览器中获得)的cookie,等价于,直接从工具抓取出来的过程中,拷贝对应参数, 这样的思路,就是错的,详见: 【总结】静态网页抓取,动态网页抓取,模拟登陆的注意事项和心得 中的: “写程序模拟执行过程时,不能直接拷贝分析而得的数据,而要自己用程序模拟出来”
这个不能说是错的,只是他拿到浏览器的cookies不会分析应用而已,我就是在浏览器登陆了才交给爬虫用的[/quote] 说实话,这种直接从浏览器拿cookie的做法,我还真的没试过 不过,据我了解: 你这样做,应该只是部分的时候,有效。 更多的时候,会遇到: cookie是有时间限制的 -> 过段时间就过期了 -> 即使你手动更改expires属性,估计都不行,因为可能是服务器端做的限制,过期就处理掉,比如重新获取 cookie的生成,本身如果和时间或其他因素(比如登陆地点)等等,有关,那么你直接拿来用,则可能无法使用。 所以,我的意思是: 如果想要程序,无需人工干预(不用说动从浏览器获得登陆后的cookie) 且,保证不会失效,始终保证可用 则还是自己代码模拟去实现, 会比较好。[/quote] 我明白你的意思,如果环境是使用urllib或类似封装好的模块,从这个角度看你说的是对的 但我拿到cookies是交给socket,所以中间就一定需要分析这些cookies,而不是像LZ那样简单直接借用一个文件 然后有第二个问题——会否漏掉cookies 我是长期的firefox用户,对ie、chrome、opera等就不太了解(我以后再花时间去了解一下),但firefox的cookies我是比较了解的。它是分两个文件保存cookies,一个sqlite3格式,一个json格式,前者保存长时效的cookies,后者保存一次性的cookies,分析这两个文件就能得到所需要的cookies,基本不会漏掉,当然前提是不要重启firefox,以保证后者不被刷写 得到cookies怎么用就是另一个问题
crifan 2013-09-22
  • 打赏
  • 举报
回复
引用 9 楼 snmr_com 的回复:
[quote=引用 7 楼 crifan 的回复:] 你直接拿别处(浏览器中获得)的cookie,等价于,直接从工具抓取出来的过程中,拷贝对应参数, 这样的思路,就是错的,详见: 【总结】静态网页抓取,动态网页抓取,模拟登陆的注意事项和心得 中的: “写程序模拟执行过程时,不能直接拷贝分析而得的数据,而要自己用程序模拟出来”
这个不能说是错的,只是他拿到浏览器的cookies不会分析应用而已,我就是在浏览器登陆了才交给爬虫用的[/quote] 说实话,这种直接从浏览器拿cookie的做法,我还真的没试过 不过,据我了解: 你这样做,应该只是部分的时候,有效。 更多的时候,会遇到: cookie是有时间限制的 -> 过段时间就过期了 -> 即使你手动更改expires属性,估计都不行,因为可能是服务器端做的限制,过期就处理掉,比如重新获取 cookie的生成,本身如果和时间或其他因素(比如登陆地点)等等,有关,那么你直接拿来用,则可能无法使用。 所以,我的意思是: 如果想要程序,无需人工干预(不用说动从浏览器获得登陆后的cookie) 且,保证不会失效,始终保证可用 则还是自己代码模拟去实现, 会比较好。
ImN1 2013-09-22
  • 打赏
  • 举报
回复
引用 7 楼 crifan 的回复:
你直接拿别处(浏览器中获得)的cookie,等价于,直接从工具抓取出来的过程中,拷贝对应参数, 这样的思路,就是错的,详见: 【总结】静态网页抓取,动态网页抓取,模拟登陆的注意事项和心得 中的: “写程序模拟执行过程时,不能直接拷贝分析而得的数据,而要自己用程序模拟出来”
这个不能说是错的,只是他拿到浏览器的cookies不会分析应用而已,我就是在浏览器登陆了才交给爬虫用的
crifan 2013-09-22
  • 打赏
  • 举报
回复
引用 4 楼 jungua1990 的回复:
[quote=引用 2 楼 iasky 的回复:] 最好模拟登录一次后获取cookie,用这个cookie来做 还有,可能是你的header的问题,吧firebug等看到的请求header都加上吧,一般是可以的。
感谢你的回答,但是我不是对单一站点,站点是随机的,不可能针对每个站点都去手动加header[/quote] 普通的,常见的,header,比如User-Agent等,都是通用的,不用每个站点都手动加一遍, 只需要写个通用的函数,每次调用即可。 但是其他的,处理每个网站,需要某些特定的header的话,则是必须的。 但是前提是你分析出来的逻辑,的确需要,否则也无需加的。 一两句无法说的透彻的。 更详细的解释,还是去看前面提到的教程吧。
crifan 2013-09-22
  • 打赏
  • 举报
回复
你直接拿别处(浏览器中获得)的cookie,等价于,直接从工具抓取出来的过程中,拷贝对应参数, 这样的思路,就是错的,详见: 【总结】静态网页抓取,动态网页抓取,模拟登陆的注意事项和心得 中的: “写程序模拟执行过程时,不能直接拷贝分析而得的数据,而要自己用程序模拟出来”
crifan 2013-09-22
  • 打赏
  • 举报
回复
1.“能否用这个cookie请求我的博客等需要登录的页面呢?“ 能。 如何做? 需要你先去搞懂,登陆后访问你的页面的逻辑 然后再写python代码实现这套逻辑。 具体需要什么逻辑 用何种工具 如何用代码实现 简单说: 十有八九是需要访问页面地址时,确保传递了对应的cookie了。 另外,或许还需要提交某些特定的header,或者参数以及其值 具体是哪些,只能靠你自己去分析逻辑后,再写代码模拟。 复杂说: 我之前已写了详尽的教程解释了,自己去看: 详解抓取网站,模拟登陆,抓取动态网页的原理和实现(Python,C#等) 和: Python专题教程:抓取网站,模拟登陆,抓取动态网页 2. ”网络上找了很多中方法,但是没有一种尝试成功的。” 正常。我之前也是遇到你这样的: 想要弄网页抓取,模拟登陆,但是一堆人,给的代码不具有可读性,而且还没解释清楚原理。 原理都不懂,怎么可能很清楚如何实现,怎么能写出正确代码,好代码。 即使蒙对了,下次换个网站去处理,你又不会了。 所以,我才写上面的教程的, 主要目的在于,让你搞清楚逻辑,其次才是用代码实现。
ImN1 2013-09-22
  • 打赏
  • 举报
回复
你的办法我不知道,很少用urllib,其实只要知道cookies保存在哪,读出来(不要遗漏),分析,组织成header再发送给网站就是这样,你的问题估计是有些cookies遗漏了,或者某些必要的header缺少了 建议你最好用抓包工具,在浏览器模拟一次完整的过程,记下有什么header要发过去,以及有什么cookies的条目是不可缺少的
引用 19 楼 jungua1990 的回复:
[quote=引用 16 楼 snmr_com 的回复:] 呃,明白了,大家沟通有点不畅,各说各的,都把自己的细节省略了 我用浏览器的cookies通常也不会在浏览器离线的情况下用,一般都是事前打开浏览器,刷一次那个网站的某一页,就像是更新cookies/session一样(顺便确认是否已登录);不可能用很久以前的cookies,因为服务器session已经不同了,要告诉网站那边我“要开一个新session了”——这个操作如果不需要验证码或者登录,也可以用socket等做,但这样做就跑题了,跟单独程序完成一样了,不是这里讨论的
感谢两位的热心回答,我需要的也是这样每次打开网站登录一下,保证最新的cookie 不会有过期的问题,我比较菜鸟,处理的方式太简单,你说可以用cookie处理cookie,不止能否给个例子,先谢过了[/quote]
jungua1990 2013-09-22
  • 打赏
  • 举报
回复
引用 16 楼 snmr_com 的回复:
呃,明白了,大家沟通有点不畅,各说各的,都把自己的细节省略了 我用浏览器的cookies通常也不会在浏览器离线的情况下用,一般都是事前打开浏览器,刷一次那个网站的某一页,就像是更新cookies/session一样(顺便确认是否已登录);不可能用很久以前的cookies,因为服务器session已经不同了,要告诉网站那边我“要开一个新session了”——这个操作如果不需要验证码或者登录,也可以用socket等做,但这样做就跑题了,跟单独程序完成一样了,不是这里讨论的
感谢两位的热心回答,我需要的也是这样每次打开网站登录一下,保证最新的cookie 不会有过期的问题,我比较菜鸟,处理的方式太简单,你说可以用cookie处理cookie,不止能否给个例子,先谢过了
crifan 2013-09-22
  • 打赏
  • 举报
回复
引用 17 楼 snmr_com 的回复:
另外,我的firefox有lastpass插件,像csdn这种不需要验证码的网站,即使过了一周,刷一次就自动登陆了
够懒,
ImN1 2013-09-22
  • 打赏
  • 举报
回复
另外,我的firefox有lastpass插件,像csdn这种不需要验证码的网站,即使过了一周,刷一次就自动登陆了
ImN1 2013-09-22
  • 打赏
  • 举报
回复
呃,明白了,大家沟通有点不畅,各说各的,都把自己的细节省略了 我用浏览器的cookies通常也不会在浏览器离线的情况下用,一般都是事前打开浏览器,刷一次那个网站的某一页,就像是更新cookies/session一样(顺便确认是否已登录);不可能用很久以前的cookies,因为服务器session已经不同了,要告诉网站那边我“要开一个新session了”——这个操作如果不需要验证码或者登录,也可以用socket等做,但这样做就跑题了,跟单独程序完成一样了,不是这里讨论的
crifan 2013-09-22
  • 打赏
  • 举报
回复
引用 11 楼 snmr_com 的回复:
[quote=引用 10 楼 crifan 的回复:] [quote=引用 9 楼 snmr_com 的回复:] [quote=引用 7 楼 crifan 的回复:] 你直接拿别处(浏览器中获得)的cookie,等价于,直接从工具抓取出来的过程中,拷贝对应参数, 这样的思路,就是错的,详见: 【总结】静态网页抓取,动态网页抓取,模拟登陆的注意事项和心得 中的: “写程序模拟执行过程时,不能直接拷贝分析而得的数据,而要自己用程序模拟出来”
这个不能说是错的,只是他拿到浏览器的cookies不会分析应用而已,我就是在浏览器登陆了才交给爬虫用的[/quote] 说实话,这种直接从浏览器拿cookie的做法,我还真的没试过 不过,据我了解: 你这样做,应该只是部分的时候,有效。 更多的时候,会遇到: cookie是有时间限制的 -> 过段时间就过期了 -> 即使你手动更改expires属性,估计都不行,因为可能是服务器端做的限制,过期就处理掉,比如重新获取 cookie的生成,本身如果和时间或其他因素(比如登陆地点)等等,有关,那么你直接拿来用,则可能无法使用。 所以,我的意思是: 如果想要程序,无需人工干预(不用说动从浏览器获得登陆后的cookie) 且,保证不会失效,始终保证可用 则还是自己代码模拟去实现, 会比较好。[/quote] 我明白你的意思,如果环境是使用urllib或类似封装好的模块,从这个角度看你说的是对的 但我拿到cookies是交给socket,所以中间就一定需要分析这些cookies,而不是像LZ那样简单直接借用一个文件 然后有第二个问题——会否漏掉cookies 我是长期的firefox用户,对ie、chrome、opera等就不太了解(我以后再花时间去了解一下),但firefox的cookies我是比较了解的。它是分两个文件保存cookies,一个sqlite3格式,一个json格式,前者保存长时效的cookies,后者保存一次性的cookies,分析这两个文件就能得到所需要的cookies,基本不会漏掉,当然前提是不要重启firefox,以保证后者不被刷写 得到cookies怎么用就是另一个问题[/quote] 关于cookie保存的知识,分享一个我知道的: IE,是保存在(浏览网页时的那个)临时文件夹内的 文件名倒是随机(用一定算法生成)的 文件内容中,就是纯文本,可以看到对应的cookie的内容的。 所以,调试时,可以选择cookie文件,拷贝到别处,用文本工具打开,查看的。
crifan 2013-09-22
  • 打赏
  • 举报
回复
引用 11 楼 snmr_com 的回复:
[quote=引用 10 楼 crifan 的回复:] [quote=引用 9 楼 snmr_com 的回复:] [quote=引用 7 楼 crifan 的回复:] 你直接拿别处(浏览器中获得)的cookie,等价于,直接从工具抓取出来的过程中,拷贝对应参数, 这样的思路,就是错的,详见: 【总结】静态网页抓取,动态网页抓取,模拟登陆的注意事项和心得 中的: “写程序模拟执行过程时,不能直接拷贝分析而得的数据,而要自己用程序模拟出来”
这个不能说是错的,只是他拿到浏览器的cookies不会分析应用而已,我就是在浏览器登陆了才交给爬虫用的[/quote] 说实话,这种直接从浏览器拿cookie的做法,我还真的没试过 不过,据我了解: 你这样做,应该只是部分的时候,有效。 更多的时候,会遇到: cookie是有时间限制的 -> 过段时间就过期了 -> 即使你手动更改expires属性,估计都不行,因为可能是服务器端做的限制,过期就处理掉,比如重新获取 cookie的生成,本身如果和时间或其他因素(比如登陆地点)等等,有关,那么你直接拿来用,则可能无法使用。 所以,我的意思是: 如果想要程序,无需人工干预(不用说动从浏览器获得登陆后的cookie) 且,保证不会失效,始终保证可用 则还是自己代码模拟去实现, 会比较好。[/quote] 我明白你的意思,如果环境是使用urllib或类似封装好的模块,从这个角度看你说的是对的 但我拿到cookies是交给socket,所以中间就一定需要分析这些cookies,而不是像LZ那样简单直接借用一个文件 然后有第二个问题——会否漏掉cookies 我是长期的firefox用户,对ie、chrome、opera等就不太了解(我以后再花时间去了解一下),但firefox的cookies我是比较了解的。它是分两个文件保存cookies,一个sqlite3格式,一个json格式,前者保存长时效的cookies,后者保存一次性的cookies,分析这两个文件就能得到所需要的cookies,基本不会漏掉,当然前提是不要重启firefox,以保证后者不被刷写 得到cookies怎么用就是另一个问题[/quote] 可能上面我解释不够清楚,再说一句: 我的意思是: 有些cookie,即使你本身(firefox)保存了。 但是过段时间,还是会失效的。 比如有些网站,比如cdsn,登陆时可以点击 2周内不再登陆 类似的功能的话,底层cookie,应该就是设置了expires 甚至是服务器端,做了一定校验和限制 即使2周后,你本地保存了该cookie,此时,也已失效。 所以,长期来看,不是稳妥的做法。 当然,如果只是: 此时此刻,保证有效 又或者是: 就是写着代码玩玩,没考虑这么多 那就另当别论了。
crifan 2013-09-22
  • 打赏
  • 举报
回复
引用 12 楼 snmr_com 的回复:
另外,从写程序(做项目)的角度看,理应写成全自动,不应借助另一个工具(指界面) 即使验证码也应从OCR考虑,尽可能核心程序完成,必要时(不能识别)再考虑生成一个界面手动输入 但我写代码只是自用,所以就偷懒了,生成界面也省了,验证码登录过程交给浏览器,代码就接管这个过程产生的结果
这个是可以的,也是完全可以理解的。 不过到目前为止,即使是自己写着玩,我也基本没用那种直接拿cookie的方式,
iasky 2013-09-17
  • 打赏
  • 举报
回复
引用 4 楼 jungua1990 的回复:
[quote=引用 2 楼 iasky 的回复:] 最好模拟登录一次后获取cookie,用这个cookie来做 还有,可能是你的header的问题,吧firebug等看到的请求header都加上吧,一般是可以的。
感谢你的回答,但是我不是对单一站点,站点是随机的,不可能针对每个站点都去手动加header[/quote] 每个站点的处理情况可能不同的,一般来说,你加上那些header就OK了 主要有:
headers = {
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            'Accept-Encoding': 'gzip, deflate',
            'Accept-Language': 'en-US,en;q=0.5',
            'Referer':'http://xxx',
            'Host': 'xxx',
            'User-Agent': ' Mozilla/5.0 (Windows NT 6.1; rv:23.0) Gecko/20100101 Firefox/23.0'
            }
jungua1990 2013-09-17
  • 打赏
  • 举报
回复
引用 2 楼 iasky 的回复:
最好模拟登录一次后获取cookie,用这个cookie来做 还有,可能是你的header的问题,吧firebug等看到的请求header都加上吧,一般是可以的。
感谢你的回答,但是我不是对单一站点,站点是随机的,不可能针对每个站点都去手动加header
jungua1990 2013-09-17
  • 打赏
  • 举报
回复
引用 1 楼 snmr_com 的回复:
既然是txt,读出来用add_header 记忆中ie的cookies格式和通用的网景格式不同
那我用cookielib.LWPCookieJar也不行啊
iasky 2013-09-17
  • 打赏
  • 举报
回复
最好模拟登录一次后获取cookie,用这个cookie来做 还有,可能是你的header的问题,吧firebug等看到的请求header都加上吧,一般是可以的。
ImN1 2013-09-17
  • 打赏
  • 举报
回复
既然是txt,读出来用add_header 记忆中ie的cookies格式和通用的网景格式不同

37,742

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧