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)在我希望能在客戶端手動(dòng)插入一些 cookie 值,但是不管是 HTTPCookieProcessor 還是 cookielib 里的 CookieJar 都沒有提供類似的方法可以來實(shí)現(xiàn)。
看起來,也并不是我一個(gè)人有這樣的需求,因?yàn)槲以诓檎医鉀Q方案的時(shí)候,還找到了有人給 Python 提交的這個(gè) Patch,就是添加這個(gè)功能。不過看起來好像還沒有被 accept 的樣子,這樣對(duì)標(biāo)準(zhǔn)庫做暴力 patch 的方式可移植性似乎也不好。所以我還是另外找了解決方案,其實(shí)也很簡(jiǎn)單:看了 HTTPCookieProcessor 的實(shí)現(xiàn)代碼之后,發(fā)現(xiàn)我可以做類似的事情,也就是在寫一個(gè) handler ,把我想要的 cookie 值強(qiáng)制放到 request 對(duì)象的 header 中去。
于是我查了 Python 的文檔,對(duì)于 handler 的接口好像幾乎沒有描述,于是我就照著 HTTPCookieProcessor 來寫了。這個(gè) handler 應(yīng)該放在正常的 cookie 處理 handler 的后面,然后檢查已經(jīng)存在的 cookie header ,再進(jìn)行合并一下。不過比較詭異的是在 Python 的文檔里并沒有找到 Request 對(duì)象有 get_header 之類的方法可以得到已經(jīng)存在的 header 項(xiàng)的值,覺得很詭異,于是直接查了源代碼,才找到了,確實(shí)有這個(gè)方法。之前有聽人說過 Ruby 的文檔做得如何如何的爛,Python 的文檔做得如何如何的好,我雖然沒覺得 Ruby 的文檔很爛,但是也覺得 Python 的文檔確實(shí)不錯(cuò),我最喜歡它末尾的 Examples 。兩個(gè)文檔系統(tǒng)倒是走的不同的路,Ruby 的文檔是從代碼中抽?。ㄌ囟ǜ袷降模┳⑨寔碜詣?dòng)生成的,類似于 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)庫中吧。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
- 詳談python http長(zhǎng)連接客戶端
- 使用httplib模塊來制作Python下HTTP客戶端的方法
- 使用基于Python的Tornado框架的HTTP客戶端的教程
- 如何用python實(shí)現(xiàn)一個(gè)HTTP連接池
- Python Http請(qǐng)求json解析庫用法解析
- python3從網(wǎng)絡(luò)攝像機(jī)解析mjpeg http流的示例
- 基于Python模擬瀏覽器發(fā)送http請(qǐng)求
- Python requests HTTP驗(yàn)證登錄實(shí)現(xiàn)流程
- Python實(shí)現(xiàn)http接口自動(dòng)化測(cè)試的示例代碼
- 詳解用python -m http.server搭一個(gè)簡(jiǎn)易的本地局域網(wǎng)
- python用700行代碼實(shí)現(xiàn)http客戶端
相關(guān)文章
連接pandas以及數(shù)組轉(zhuǎn)pandas的方法
今天小編就為大家分享一篇連接pandas以及數(shù)組轉(zhuǎn)pandas的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-06-06
Django文件存儲(chǔ) 自己定制存儲(chǔ)系統(tǒng)解析
這篇文章主要介紹了Django文件存儲(chǔ) 自己定制存儲(chǔ)系統(tǒng)解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
Python實(shí)現(xiàn)提取給定網(wǎng)頁內(nèi)的所有鏈接
這篇文章主要和大家分享一個(gè)實(shí)用的Python腳本,可以實(shí)現(xiàn)從給定的網(wǎng)頁中檢索所有鏈接,并將其保存為txt文件,需要的小伙伴可以收藏一下2023-05-05
使用Python實(shí)現(xiàn)租車計(jì)費(fèi)系統(tǒng)的兩種方法
本文通過兩種方法給大家分享了使用Python實(shí)現(xiàn)租車計(jì)費(fèi)系統(tǒng),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-09-09
Python異常處理知識(shí)點(diǎn)總結(jié)
在本篇文章中小編給大家分享了關(guān)于Python異常處理的相關(guān)知識(shí)點(diǎn)以及對(duì)應(yīng)的實(shí)例內(nèi)容,需要的朋友們學(xué)習(xí)下。2019-02-02
如何基于opencv實(shí)現(xiàn)簡(jiǎn)單的數(shù)字識(shí)別
現(xiàn)在很多場(chǎng)景需要使用的數(shù)字識(shí)別,比如銀行卡識(shí)別,以及車牌識(shí)別等,在AI領(lǐng)域有很多圖像識(shí)別算法,大多是居于opencv 或者谷歌開源的tesseract 識(shí)別,下面這篇文章主要給大家介紹了關(guān)于如何基于opencv實(shí)現(xiàn)簡(jiǎn)單的數(shù)字識(shí)別,需要的朋友可以參考下2021-09-09

