如何在采集程序中共享火狐的Cookie?

原文作者:西安鲲之鹏

原文链接:http://www.site-digger.com/html/articles/20120531/36.html

对于需要登录后才能进行的采集,采用共享火狐浏览器Cookie的方案好处是:不用自己在再写登录过程,直接在火狐中进行登录即可。

火狐的Cookie存储在哪儿?

  • 临时性Cookie,即关闭浏览器后就会过期的Cookie存储在sessionstore.js中,格式为JSON,结构如下:
  • 永久性Cookie存放在cookies.sqlite中,格式为SQLite数据库,结构如下:

这两个文件的路径在不同的操作系统(不同用户)下是不一样的,比如Win7上的路径是:C:\Users\Administrator\AppData\Roaming\Mozilla\Firefox\Profiles\d4371ep6.default。

如何使用这些Cookie数据?

读取cookies.sqlite和sessionstore.js将其转换为统一的、我们的采集程序可用的Cookie格式。

我们的采集程序采用Python编写,Python的cookielib.MozillaCookieJar()可识别的Cookie格式为:

view plain
copy to clipboard
print
?

  1. # Netscape HTTP Cookie File
  2. # http://www.netscape.com/newsref/std/cookie_spec.html
  3. # This file was generated by libcurl! Edit at your own risk.
  4. www.example.com  FALSE /  FALSE 1338534278  cookiename value
  5. 前面几行为注释行(以#开头),后面为Cookie数据,每行为一项,元素之间采用制表符\t分隔。
  6. 各部分的含义如下:
  7. domain - 可被使用的域;
  8. flag - 是否允许所有子域使用该项,可根据domain是否已点开头来判断;
  9. path - 可被使用的路径;
  10. secure - 是否需要安全连接(HTTPS);
  11. expiration - 过期时间,Unix时间戳。
  12. name - Cookie项名;
  13. value - Cookie项对应的值;

我们的实现方案如下:

view plain
copy to clipboard
print
?

  1. import os
  2. import cookielib
  3. import urllib2
  4. from pysqlite2 import dbapi2 as sqlite
  5. def firefox_cookie(ffc_path=r‘C:\Users\Administrator\AppData\Roaming\Mozilla\Firefox\Profiles\d4371ep6.default‘):
  6. con = sqlite.connect(os.path.join(ffc_path, ‘cookies.sqlite‘))
  7. cur = con.cursor()
  8. cur.execute("select host, path, isSecure, expiry, name, value from moz_cookies")
  9. ftstr = [‘FALSE‘, ‘TRUE‘]
  10. s = StringIO()
  11. s.write(‘# Netscape HTTP Cookie File\n‘)
  12. s.write(‘# http://www.netscape.com/newsref/std/cookie_spec.html\n‘)
  13. s.write(‘# This is a generated file!  Do not edit\n‘)
  14. for item in cur.fetchall():
  15. s.write("%s\t%s\t%s\t%s\t%s\t%s\t%s\n" % (item[0], ftstr[item[0].startswith(‘.‘)], item[1], ftstr[item[2]], item[3], item[4], item[5]))
  16. js_path = os.path.join(ffc_path, ‘sessionstore.js‘)
  17. if os.path.exists(js_path):
  18. try:
  19. js_data = json.loads(open(js_path, ‘rb‘).read())
  20. except Exception, e:
  21. print str(e)
  22. else:
  23. if ‘windows‘ in js_data:
  24. for window in js_data[‘windows‘]:
  25. for cookie in window[‘cookies‘]:
  26. s.write("%s\t%s\t%s\t%s\t%s\t%s\t%s\n" % (cookie.get(‘host‘, ‘‘), ftstr[cookie.get(‘host‘, ‘‘).startswith(‘.‘)], \
  27. cookie.get(‘path‘, ‘‘), False, str(int(time.time()) + 3600*24*7), cookie.get(‘name‘, ‘‘), cookie.get(‘value‘, ‘‘)))
  28. s.seek(0)
  29. cookie_jar = cookielib.MozillaCookieJar()
  30. cookie_jar._really_load(s, ‘‘, True, True)
  31. opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie_jar))
  32. return self.opener

特别说明:该文章为西安鲲之鹏的原创文章 ,你除了可以发表评论外,还可以转载到你的网站或博客,但是请保留源地址,谢谢!!(尊重他人劳动,你我共同努力)

时间: 2024-09-29 02:39:45

如何在采集程序中共享火狐的Cookie?的相关文章

在采集程序中增加定时发送邮件以及关机处理的实现

我们在采集特定数据的时候,往往需要耗费较长的时间,有时候因为一些事情,不可能长久的在电脑前等待结果,那么需要程序在一段时间后自动给我们发送邮件等通知,以及执行退出程序或者关机等处理善后工作,以节省资源或者电源,那么需要实现这个过程是如何的呢.本篇随笔基于这个采集程序的基础上增加这些功能的实现,介绍其中的一些处理技巧. 1.邮件配置 如果我们需要实现发送邮件.或者发送短信等通知途径,那么我们就需要把这些处理过程涉及到的参数提前录入到系统里面,是在不行硬编码也行,不过为了可扩展性,我倾向于使用配置界

PHP采集程序中的常用函数

PHP采集程序常用函数分享

分享一些php采集程序中的常用函数,省得以后满地找了,想用时来这里看看,哈哈. //当前的脚本网址 function get_php_url(){ if(!empty($_SERVER["REQUEST_URI"])){ $scriptName = $_SERVER["REQUEST_URI"]; $nowurl = $scriptName; }else{ $scriptName = $_SERVER["PHP_SELF"]; if(empty(

Android应用程序组件Content Provider在应用程序之间共享数据的原理分析

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6967204 在Android系统中,不同的应用程序是不能直接读写对方的数据文件的,如果它们想共享数据的话,只能通过 Content Provider组件来实现.那么,Content Provider组件又是如何突破应用程序边界权限控制来实现在不同的应用程序之间共享数据的呢?在前面的文章中,我们已经简要介绍过它是通过 Binder进程间通信机制以

在java程序中访问windows有用户名和密码保护的共享目录

在java程序中访问windows有用户名和密码保护的共享目录 Posted on 2015-11-20 14:03 云自无心水自闲 阅读(3744) 评论(0)  编辑  收藏 --> Java程序中访问拥有全部读写权限的目录相对比较简单,和普通的目录没有什么差别.但是要访问一个需要用户和密码验证的目录就需要一点点小技巧了.这里介绍一个开源的库能够比较容易的实现这一需求.1. 下载库文件: https://jcifs.samba.org/ 下载的zip文件中, 不仅包含了jar文件,还有文档和

PHP采集程序大全

在论坛好久了没有怎么正式的发表过东西,今天给大家共享一下我的采集代码! 思路: 采集程序的思路很简单大体可以分为以下几个步骤: 1.获取远程文件源代码(file_get_contents或用fopen).2.分析代码得到自己想要的内容(这里用正规匹配,一般是得到分页). 3.跟根得到的内容进行下载入库等操作. 在这里第二步有可能要重复的操作好几次,比如说要先分析一下分页地址,在分析一下内页的内容才能取得我们想要的东西. 代码: 记的以前发部过部分的代码今天我在这里在简单的发部一下复制php内容到

iOS应用程序间共享数据(转)

我们知道iOS由于沙盒的存在,应用程序不能越过自己的区域去访问别的存储空间的内容,不过可能有许多场景我们需要在应用程序之间共享数据,比如多个应用共用用户名密码进行登录等.虽然我们不能直接通过文件系统来分享数据,不过还是有些方法可以实现,为了方便说明,这里同时创建了两个工程Example1和Example2,实现这两个app之间的信息共享,Example1负责写数据,Example2负责读数据,具体的demo代码可以到这里获取 UIPasteboard 剪贴板是应用程序之间传递数据的简单方式,建议

在C#程序中实现插件架构

阅读提示:这篇文章将讲述如何利用C#奇妙的特性,实现插件架构,用插件(plug-ins)机制建立可扩展的解决方案. 在.NET框架下的C#语言,和其他.NET语言一样提供了很多强大的特性和机制.其中一些是全新的,而有些则是从以前的语言和平台上照搬过来的.然而,这种巧妙的结合产生了一些有趣的方法可以用来解决我们的问题.这篇文章将讲述如何利用这些奇妙的特性,用插件(plug-ins)机制建立可扩展的解决方案.后面也将提供一个简要的例子,你甚至可以用这个东西来替换那些已经在很多系统中广泛使用的独立的程

WPF 程序中启动和关闭外部.exe程序

当需要在WPF程序启动时,启动另一外部程序(.exe程序)时,可以按照下面的例子来: C#后台代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; u