标签:cells plain 细节 use 标准输出 根据 os.path 方法 blob
这事本来是有个 browsercookie 库可以做的,但是初看它就有不少问题:
我在尝试解决这些问题时,又发现了额外的问题:它每次都要把所有的 cookie 全部读取。再加上不必要地导入 keyring、Crypto 等库,让我想放弃了。
于是我考虑自己实现一个 cookiejar。但发现它有如下问题:
这样扩展起来就十分令人不爽了,也不知道能正常工作多久。
也罢,cookiejar 是个十分复杂的东西,我不如实现一个获取匹配的 cookie 的独立功能,然后通过各种姿势传给 HTTP 客户端库好了。
火狐的 cookie 数据库文件「cookies.sqlite」里就一个「moz_cookies」表,其结构也挺简单的。但是,怎么做 cookie 的匹配呢?既然决定放弃 Python 自带的 cookiejar,那就不看它,直接看火狐的源码好了。
于是去 DXR 上搜索火狐的源码。没费多少力气就找到了相关的部分,然后跟着代码就能知道是怎么匹配的了:
祼域名使用 tldextract 库来做,其它属性的匹配算法直接看火狐的代码。虽然是不熟悉的 C++ 代码,但是写得很棒,很容易理解。
把自己需要的部分写成 Python,得一新模块——firefoxcookies。就一个方法,返回一个 cookie 的字典,用起来也很方便。比如在我的 requestsutils.RequestsBase 中,这么干就可以了:
1
2
3
4
5
6
7
8
9
10
11
12
|
class FireRequests(RequestsBase): def initialize( self ): self ._fc = FirefoxCookies(os.path.expanduser( ‘~/.mozilla/firefox/nightly/cookies.sqlite‘ )) def request( self , url, method = None , * args, * * kwargs): if self .baseurl: url = urljoin( self .baseurl, url) cookies = self ._fc.get_cookies(url) return super ().request(url, method = method, cookies = cookies) |
就这样就满足我的需求了。以后再有别的需求,再慢慢扩展。
标签:cells plain 细节 use 标准输出 根据 os.path 方法 blob
原文地址:http://www.cnblogs.com/pyxiaomangshe/p/7842687.html