天天看点

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()      

参考

继续阅读