天天看點

Twisted異步采集網站資料

簡介

Twisted是一個基于Reactor模式的異步IO網絡架構,利用循環體來等待事件,進而實作異步程式設計和非阻塞IO,利用​

​deferred​

​來管理回調函數。

應用舉例

使用DeferredList管理

from twisted.web.client import getPage, defer
from twisted.internet import reactor


def all_done():
    """
    停止reactor事件循環
    :return:
    """
    reactor.stop()


def error_back(e):
    print(e)


def parse_page(res):
    """
    定義回調函數
    :param res:
    :return:
    """
    print(res)
    return True


defer_list = []
urls = [
    'https://www.xx.org',
    'http://www.baidu.com',
    'http://www.qq.com'
]
for url in urls:
    # getPage會傳回一個deferred對象
    obj = getPage(url.encode('utf-8'))
    # 給Deferred對象添加回調
    obj.addCallback(parse_page)
    # 給Deferred添加錯誤回調
    obj.addErrback(error_back)
    # 将Deferred對象添加到清單中
    defer_list.append(obj)
# 任務清單結束後,無論成敗都調用reactor.stop()停止
defer.DeferredList(defer_list).addBoth(all_done)
# 啟動事件循環監聽
reactor.run()      

getPage發送POST請求

from twisted.internet import reactor
from twisted.web.client import getPage
import urllib.parse


def one_done(arg):
    """
    停止循環體
    :param arg:
    :return:
    """
    print(arg)
    reactor.stop()


post_data = urllib.parse.urlencode({'username': 'abc'})
post_data = bytes(post_data, encoding='utf8')
headers = {b'Content-Type': b'application/x-www-form-urlencoded'}
# getPage傳回deferred,deferred用來管理回調
response = getPage(bytes('http://test/login', encoding='utf8'),
                   method=bytes('POST', encoding='utf8'),
                   postdata=post_data,
                   cookies={},
                   headers=headers)
# 請求正常或異常都調用one_done
response.addBoth(one_done)

# 啟動循環體
reactor.run()      

參考

繼續閱讀