原文作者:西安鲲之鹏
原文链接: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
?
- # Netscape HTTP Cookie File
- # http://www.netscape.com/newsref/std/cookie_spec.html
- # This file was generated by libcurl! Edit at your own risk.
- www.example.com FALSE / FALSE 1338534278 cookiename value
- 前面几行为注释行(以#开头),后面为Cookie数据,每行为一项,元素之间采用制表符\t分隔。
- 各部分的含义如下:
- domain - 可被使用的域;
- flag - 是否允许所有子域使用该项,可根据domain是否已点开头来判断;
- path - 可被使用的路径;
- secure - 是否需要安全连接(HTTPS);
- expiration - 过期时间,Unix时间戳。
- name - Cookie项名;
- value - Cookie项对应的值;
我们的实现方案如下:
view plain
copy to clipboard
print
?
- import os
- import cookielib
- import urllib2
- from pysqlite2 import dbapi2 as sqlite
- def firefox_cookie(ffc_path=r‘C:\Users\Administrator\AppData\Roaming\Mozilla\Firefox\Profiles\d4371ep6.default‘):
- con = sqlite.connect(os.path.join(ffc_path, ‘cookies.sqlite‘))
- cur = con.cursor()
- cur.execute("select host, path, isSecure, expiry, name, value from moz_cookies")
- ftstr = [‘FALSE‘, ‘TRUE‘]
- s = StringIO()
- s.write(‘# Netscape HTTP Cookie File\n‘)
- s.write(‘# http://www.netscape.com/newsref/std/cookie_spec.html\n‘)
- s.write(‘# This is a generated file! Do not edit\n‘)
- for item in cur.fetchall():
- 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]))
- js_path = os.path.join(ffc_path, ‘sessionstore.js‘)
- if os.path.exists(js_path):
- try:
- js_data = json.loads(open(js_path, ‘rb‘).read())
- except Exception, e:
- print str(e)
- else:
- if ‘windows‘ in js_data:
- for window in js_data[‘windows‘]:
- for cookie in window[‘cookies‘]:
- s.write("%s\t%s\t%s\t%s\t%s\t%s\t%s\n" % (cookie.get(‘host‘, ‘‘), ftstr[cookie.get(‘host‘, ‘‘).startswith(‘.‘)], \
- cookie.get(‘path‘, ‘‘), False, str(int(time.time()) + 3600*24*7), cookie.get(‘name‘, ‘‘), cookie.get(‘value‘, ‘‘)))
- s.seek(0)
- cookie_jar = cookielib.MozillaCookieJar()
- cookie_jar._really_load(s, ‘‘, True, True)
- opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie_jar))
- return self.opener
特别说明:该文章为西安鲲之鹏的原创文章 ,你除了可以发表评论外,还可以转载到你的网站或博客,但是请保留源地址,谢谢!!(尊重他人劳动,你我共同努力)
时间: 2024-09-29 02:39:45