Python HTTP客戶端自定義Cookie實現實例
幾乎所有腳本語言都提供了方便的 HTTP 客戶端處理的功能,Python 也不例外,使用 urllib 和 urllib2 可以很方便地進行 HTTP GET 和 POST 等各種操作。并且還允許以類似于插件的形式加入一些 handler ,來定制 request 和 response ,比如代理的支持和 cookie 的支持都是這樣添加進來的。具體來說,通過如下方式構造一個 opener :
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor())
然后這個 opener 就可以處理 cookie 了,相當方便,并且可定制性也……好吧,總之,現在我希望能在客戶端手動插入一些 cookie 值,但是不管是 HTTPCookieProcessor 還是 cookielib 里的 CookieJar 都沒有提供類似的方法可以來實現。
看起來,也并不是我一個人有這樣的需求,因為我在查找解決方案的時候,還找到了有人給 Python 提交的這個 Patch,就是添加這個功能。不過看起來好像還沒有被 accept 的樣子,這樣對標準庫做暴力 patch 的方式可移植性似乎也不好。所以我還是另外找了解決方案,其實也很簡單:看了 HTTPCookieProcessor 的實現代碼之后,發現我可以做類似的事情,也就是在寫一個 handler ,把我想要的 cookie 值強制放到 request 對象的 header 中去。
于是我查了 Python 的文檔,對于 handler 的接口好像幾乎沒有描述,于是我就照著 HTTPCookieProcessor 來寫了。這個 handler 應該放在正常的 cookie 處理 handler 的后面,然后檢查已經存在的 cookie header ,再進行合并一下。不過比較詭異的是在 Python 的文檔里并沒有找到 Request 對象有 get_header 之類的方法可以得到已經存在的 header 項的值,覺得很詭異,于是直接查了源代碼,才找到了,確實有這個方法。之前有聽人說過 Ruby 的文檔做得如何如何的爛,Python 的文檔做得如何如何的好,我雖然沒覺得 Ruby 的文檔很爛,但是也覺得 Python 的文檔確實不錯,我最喜歡它末尾的 Examples 。兩個文檔系統倒是走的不同的路,Ruby 的文檔是從代碼中抽取(特定格式的)注釋來自動生成的,類似于 javadoc ;而 Python 現在用的是獨立于源代碼的文檔系統,人工寫的,不過到頭來居然連函數都漏掉了,可見人工維護文檔的弊端還是很明顯的。其實我見過的文檔系統,最好用的應該還是屬于 Emacs/Elisp 了吧。 不過,廢話少講,handler 如下:
class SimpleCookieHandler(urllib2.BaseHandler): def http_request(self, req): simple_cookie = 'cc98Simple=1' if not req.has_header('Cookie'): req.add_unredirected_header('Cookie', simple_cookie) else: cookie = req.get_header('Cookie') req.add_unredirected_header('Cookie', simple_cookie + '; ' + cookie) return req
然后,構造 opener 的時候加上這個 handler 就可以了:
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(), SimpleCookieHandler())
但總歸是一個 workaround ,期待那個 patch 被加入到標準庫中吧。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
