Python HTTP客戶端自定義Cookie實(shí)現(xiàn)實(shí)例
Python HTTP客戶端自定義Cookie實(shí)現(xiàn)實(shí)例
幾乎所有腳本語言都提供了方便的 HTTP 客戶端處理的功能,Python 也不例外,使用 urllib 和 urllib2 可以很方便地進(jìn)行 HTTP GET 和 POST 等各種操作。并且還允許以類似于插件的形式加入一些 handler ,來定制 request 和 response ,比如代理的支持和 cookie 的支持都是這樣添加進(jìn)來的。具體來說,通過如下方式構(gòu)造一個(gè) opener :
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor())
然后這個(gè) opener 就可以處理 cookie 了,相當(dāng)方便,并且可定制性也……好吧,總之,現(xiàn)在我希望能在客戶端手動插入一些 cookie 值,但是不管是 HTTPCookieProcessor 還是 cookielib 里的 CookieJar 都沒有提供類似的方法可以來實(shí)現(xiàn)。
看起來,也并不是我一個(gè)人有這樣的需求,因?yàn)槲以诓檎医鉀Q方案的時(shí)候,還找到了有人給 Python 提交的這個(gè) Patch,就是添加這個(gè)功能。不過看起來好像還沒有被 accept 的樣子,這樣對標(biāo)準(zhǔn)庫做暴力 patch 的方式可移植性似乎也不好。所以我還是另外找了解決方案,其實(shí)也很簡單:看了 HTTPCookieProcessor 的實(shí)現(xiàn)代碼之后,發(fā)現(xiàn)我可以做類似的事情,也就是在寫一個(gè) handler ,把我想要的 cookie 值強(qiáng)制放到 request 對象的 header 中去。
于是我查了 Python 的文檔,對于 handler 的接口好像幾乎沒有描述,于是我就照著 HTTPCookieProcessor 來寫了。這個(gè) handler 應(yīng)該放在正常的 cookie 處理 handler 的后面,然后檢查已經(jīng)存在的 cookie header ,再進(jìn)行合并一下。不過比較詭異的是在 Python 的文檔里并沒有找到 Request 對象有 get_header 之類的方法可以得到已經(jīng)存在的 header 項(xiàng)的值,覺得很詭異,于是直接查了源代碼,才找到了,確實(shí)有這個(gè)方法。之前有聽人說過 Ruby 的文檔做得如何如何的爛,Python 的文檔做得如何如何的好,我雖然沒覺得 Ruby 的文檔很爛,但是也覺得 Python 的文檔確實(shí)不錯(cuò),我最喜歡它末尾的 Examples 。兩個(gè)文檔系統(tǒng)倒是走的不同的路,Ruby 的文檔是從代碼中抽?。ㄌ囟ǜ袷降模┳⑨寔碜詣由傻?,類似于 javadoc ;而 Python 現(xiàn)在用的是獨(dú)立于源代碼的文檔系統(tǒng),人工寫的,不過到頭來居然連函數(shù)都漏掉了,可見人工維護(hù)文檔的弊端還是很明顯的。其實(shí)我見過的文檔系統(tǒng),最好用的應(yīng)該還是屬于 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
然后,構(gòu)造 opener 的時(shí)候加上這個(gè) handler 就可以了:
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(), SimpleCookieHandler())
但總歸是一個(gè) workaround ,期待那個(gè) patch 被加入到標(biāo)準(zhǔn)庫中吧。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
- 詳談python http長連接客戶端
- 使用httplib模塊來制作Python下HTTP客戶端的方法
- 使用基于Python的Tornado框架的HTTP客戶端的教程
- 如何用python實(shí)現(xiàn)一個(gè)HTTP連接池
- Python Http請求json解析庫用法解析
- python3從網(wǎng)絡(luò)攝像機(jī)解析mjpeg http流的示例
- 基于Python模擬瀏覽器發(fā)送http請求
- Python requests HTTP驗(yàn)證登錄實(shí)現(xiàn)流程
- Python實(shí)現(xiàn)http接口自動化測試的示例代碼
- 詳解用python -m http.server搭一個(gè)簡易的本地局域網(wǎng)
- python用700行代碼實(shí)現(xiàn)http客戶端
相關(guān)文章
Python使用enumerate獲取迭代元素下標(biāo)
這篇文章主要介紹了python使用enumerate獲取迭代元素下標(biāo),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02Python?Setuptools的?setup.py實(shí)例詳解
setup.py是一個(gè)?python?文件,它的存在表明您要安裝的模塊/包可能已經(jīng)用?Setuptools?打包和分發(fā),這是分發(fā)?Python?模塊的標(biāo)準(zhǔn)。?它的目的是正確安裝軟件,本文給大家講解Python?Setuptools的?setup.py感興趣的朋友跟隨小編一起看看吧2022-12-12jupyter?notebook內(nèi)核啟動失敗問題及解決方法
這篇文章主要介紹了解決jupyter?notebook內(nèi)核啟動失敗問題,本文給大家介紹了問題原因分析及解決方案,圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04基于opencv的selenium滑動驗(yàn)證碼的實(shí)現(xiàn)
這篇文章主要介紹了基于opencv的selenium滑動驗(yàn)證碼的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07用Python編寫一個(gè)基于終端的實(shí)現(xiàn)翻譯的腳本
這篇文章主要介紹了用Python編寫一個(gè)基于終端的實(shí)現(xiàn)翻譯的腳本,代碼基于Python2.x,需要的朋友可以參考下2015-04-04基于Python實(shí)現(xiàn)通過微信搜索功能查看誰把你刪除了
這篇文章主要介紹了基于Python實(shí)現(xiàn)微信搜索查看誰把你刪除了的相關(guān)資料,需要的朋友可以參考下2016-01-01