TornadoHTTPClient 是一個基于Tornado的高效的異步HTTP客戶端庫, 支持Cookie和代理, 目前僅在Python2.7平臺上測試過, 不支持Python3
聽取了仙子君的意見, 直接對tornado.curl_httpclient.CurlAsyncHTTPClient進行封裝
安裝
首先從git clone 下代碼
git clone https://github.com/coldnight/tornadohttpclient.git
然后安裝它
cd tornadohttpclient python setup.py install
教程
GET
TornadoHTTPClient的get方法可以發(fā)起一個get請求
from tornadohttpclient import TornadoHTTPClient # 實例化 http = TornadoHTTPClient() # 發(fā)出get請求 http.get("http://www.linuxzen.com") # 開始主事件循環(huán) http.start()
POST
TornadoHTTPClient的post方法可以發(fā)起一個post請求
讀取響應(yīng)
上面僅僅發(fā)出了請求, 但是我們無法讀取GET請求回來的數(shù)據(jù), 我們可以使用一個回調(diào)來讀取響應(yīng)
from tornadohttpclient import TornadoHTTPClient http = TornadoHTTPClient() def callback(response): print response.body http.stop() http.get("http://www.linuxzen.com", callback = callback) http.start()
通過callback關(guān)鍵字參數(shù)我們可以傳進一個回調(diào)函數(shù), 當(dāng)請求成功時會調(diào)用此函數(shù), 并給此函數(shù)傳遞一個與urllib2.urlopen返回一樣的reponse實例
上傳文件
upload方法可以上傳文件, 其接受一個url和文件的field和文件路徑, 還有其他post參數(shù)
from tornadohttpclient import TornadoHTTPClient http = TornadoHTTPClient() def callback(response): print("打開圖片鏈接", end = " ") print(response.effective_url) http.stop() http.upload("http://paste.linuxzen.com", "img", "img_test.png", callback = callback) http.start()
給callback傳遞參數(shù)
有時候callback可能需要訪問局部變量, 可以通過 args和kwargs關(guān)鍵字參數(shù), 將callback的參數(shù)傳遞給get/post方法, args參數(shù)將會在response參數(shù)之后被傳遞, args參數(shù)類型應(yīng)當(dāng)是一個元組, kwargs參數(shù)類型應(yīng)當(dāng)是一個字典
from tornadohttpclient import TornadoHTTPClient http = TornadoHTTPClient() def callback(response, times): print response.body print times if times == 9: http.stop() for i in range(10): http.get("http://www.linuxzen.com", callback = callback, args = (i, )) http.start()
發(fā)送延遲請求
有時我們需要延遲幾秒也發(fā)送請求或每隔幾秒就發(fā)送一個請求, get/post方法的delay關(guān)鍵字參數(shù)可以解決, delay參數(shù)接受一個單位為秒的數(shù)字, 并延遲delay秒后發(fā)起請求
from tornadohttpclient import TornadoHTTPClient http = TornadoHTTPClient() def callback(response, times): print response.body if times < 9: # 延遲10秒發(fā)送此請求 http.get("http://www.linuxzen.com", callback = callback, args = (times + 1, ), delay = 10) else: http.stop() http.get("http://www.linuxzen.com", callback = callback, args = (1, )) http.start()
給請求傳遞參數(shù)
TornadoHTTPClient 的 get/post方法的第二個參數(shù)params可以定義請求時傳遞的參數(shù)params的類型為字典或者((key, value), )類型的元組或列表,例如使用百度搜索TornadoHTTPClient
from tornadohttpclient import TornadoHTTPClient http = TornadoHTTPClient() def callback(response): print response.body http.stop() http.get("http://www.baidu.com/s", (("wd", "tornado"),), callback = callback) http.start()
以上也使用與POST方法, 比如登錄網(wǎng)站
from tornadohttpclient import TornadoHTTPClient http = TornadoHTTPClient() def callback(response): print response.body http.stop() http.post("http://ip.or.domain/login", (("username", "cold"), ("password", "pwd")), callback = callback) http.start()
指定HTTP頭
TornadoHTTPClient 的get/post方法的 headers關(guān)鍵字參數(shù)可以自定額外的HTTP頭信息, 參數(shù)類型為一個字典
指定User-Agent頭
from tornadohttpclient import TornadoHTTPClient http = TornadoHTTPClient() def callback(response): print response.body http.stop() headers = dict((("User-Agent", "Mozilla/5.0 (X11; Linux x86_64)" " AppleWebKit/537.11 (KHTML, like Gecko)" " Chrome/23.0.1271.97 Safari/537.11"), )) http.get("http://www.linuxzen.com", headers=headers, callback = callback)
使用代理
TornadoHTTPClient 的set_proxy方法可以設(shè)置代理, 其接受兩個參數(shù), 分別是代理的 主機名/ip 代理的端口, unset_proxy可以取消代理
from tornadohttpclient import TornadoHTTPClient http = TornadoHTTPClient() def callback(response): print response.body http.unset_proxy() http.stop() http.set_proxy("127.0.0.1", 8087) http.get("http://shell.appspot.com", callback = callback) http.start()
Cookie
TornadoHTTPClient會自動記錄和裝載Cookie, 可以通過 TornadoHTTPClient實例屬性 cookie 獲取Cookie
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com