Trip: 給Requests加上協程,一百份網路請求一份時間

Trip 是一個協程的網路庫,如 Requests 一般簡單的操作,程序不再被網路阻塞。

你可以在這裡獲取本項目的源碼:github

兼容 Python 2.7+ 的所有版本,主流三大操作系統。

基於兩大依賴包:TRIP: Tornado & Requests In Pair

感謝Tornado與Requests讓想法可以快速變成現實,坦誠的說,這個項目我只做了一些簡單的工作。

讓協程變的簡單

這是一個讓協程變的簡單的項目,你只需要這樣:

import tripnn@trip.coroutinendef main():n r = yield trip.get(https://httpbin.org/get, auth=(user, pass))n print(r.content)nntrip.run(main)n

一百份請求一份時間

基於 Tornado 的協程讓網路阻塞不再成為問題:(這裡演示兼容用法)

import time, functoolsnnimport requests, tripnndef timeit(fn):n start_time = time.time()n fn()n return time.time() - start_timennurl = http://httpbin.org/getntimes = 10 # 100 changed for inland network delaynndef fetch():n r = [requests.get(url) for i in range(times)]n return rnn@trip.coroutinendef async_fetch():n r = yield [trip.get(url) for i in range(times)]n raise trip.Return(r)nnprint(Non-trip cost: %ss % timeit(fetch))nprint(Trip cost: %ss % timeit(functools.partial(trip.run, async_fetch)))nn# Result:n# Non-trip cost: 17.90799999237sn# Trip cost: 0.172300004959sn

由於協程的特性,所有的等待時間重合在了一起。

你不需要每個請求開一個線程,主線程中一切也可以井然有序的進行。

可以想像如果你在寫一個爬蟲,這將節省多少時間!

讓協程服務人類

基於 Requests 的操作方式讓協程 HTTP 從未如此簡單:(這裡使用 Python3 演示async/await)

>>> async def main():n... global rn... r = await trip.get(https://httpbin.org/basic-auth/user/pass, auth=(user, pass))n...n>>> trip.run(main)n>>> r.status_coden200n>>> r.headers[content-type]napplication/jsonn>>> r.encodingnNonen>>> r.textnu{"authenticated": true,...n>>> r.json()n{uauthenticated: True, uuser: uuser}n

只要你有一些 Requests 基礎就可以輕鬆使用 Trip,協程不再遙不可及。

重現了幾乎所有 Requests 的操作,最大限度的減少了你的學習成本。

以一個爬蟲為例

為了不打擾正常網站的運行,這裡以httpbin.org作為目標網站。

設置 Cookies 模擬登陸,get 請求模擬爬取內容。

那麼普通 Requests 是這樣的:

import requestsnnurl = http://httpbin.orgns = requests.Session()nndef fetch(times=10):n s.get(%s/cookies/set?name=value % url)n r = [s.get(%s/get % url) for i in range(times)]n print rnnfetch()n

使用 Trip 以後就會變成這樣:

import tripnnurl = http://httpbin.orgns = trip.Session()nn@trip.coroutinendef fetch(times=10):n yield s.get(%s/cookies/set?name=value % url)n r = yield [s.get(%s/get % url) for i in range(times)]n print rnntrip.run(fetch)n

幾乎不需要修改代碼,爬蟲就獲得了協程的特性!

最後

爬蟲耗時太久優化困難嗎?

各種協程網路框架難以使用嗎?

大型爬蟲框架臃腫無法靈活定製嗎?

試試Trip,你不會後悔的!


推薦閱讀:

如何在瀏覽器中高效抓包分析數據?
Scrapy爬圖片(一)
未來的旅遊的熱點是什麼?旅遊點評數據分析
從零開始寫Python爬蟲 --- 2.6 爬蟲實踐:重構排行榜小說爬蟲&Mysql資料庫
從零開始寫Python爬蟲 --- 爬蟲實踐:螺紋鋼數據&Cookies

TAG:Python | 爬虫 | 协程 |