3

我正在尝试使用扭曲的 Web 客户端应用程序,但在使用 cookie 时遇到了一些问题。有人有我可以看的例子吗?

4

3 回答 3

7

虽然getPage确实不容易允许直接访问请求或响应标头(这只是一个getPage不是超级棒的 AP​​I 的示例),但实际上支持 cookie。

cookies = {cookies: tosend}
d = getPage(url, cookies=cookies)
def cbPage(result):
    print 'Look at my cookies:', cookies
d.addCallback(cbPage)

字典中的任何 cookie 在传递给时getPage都会被发送。服务器为响应请求而设置的任何新 cookie 都将添加到字典中。

您可能在查看时错过了此功能,getPage因为getPage签名中的任何地方都没有cookies参数!但是,它确实需要**kwargs,这cookies就是支持的方式:传递给它的任何额外参数getPage,它不知道自己,它传递给HTTPClientFactory.__init__. 查看该方法的签名以查看您可以传递给的所有内容getPage

于 2009-11-06T14:23:05.763 回答
2

事实证明,没有简单的方法 afaict 标头存储在twisted.web.client.HTTPClientFactory 中,但不能从twisted.web.client.getPage() 中获得,这是为拉回网页而设计的函数。我最终重写了函数:

from twisted.web import client

def getPage(url, contextFactory=None, *args, **kwargs):
    fact = client._makeGetterFactory(
        url,
        HTTPClientFactory,
        contextFactory=contextFactory,
        *args, **kwargs)
    return fact.deferred.addCallback(lambda data: (data, fact.response_headers))
于 2009-09-09T13:18:38.827 回答
1
from twisted.internet import reactor
from twisted.web import client

def getPage(url, contextFactory=None, *args, **kwargs):
    return client._makeGetterFactory(
        url,
        CustomHTTPClientFactory,
        contextFactory=contextFactory,
        *args, **kwargs).deferred

class CustomHTTPClientFactory(client.HTTPClientFactory):

    def __init__(self,url, method='GET', postdata=None, headers=None,
                 agent="Twisted PageGetter", timeout=0, cookies=None,
                 followRedirect=1, redirectLimit=20):
        client.HTTPClientFactory.__init__(self, url, method, postdata,
                                          headers, agent, timeout, cookies,
                                          followRedirect, redirectLimit)

    def page(self, page):
        if self.waiting:
            self.waiting = 0
            res = {}
            res['page'] = page
            res['headers'] = self.response_headers
            res['cookies'] = self.cookies
            self.deferred.callback(res)

if __name__ == '__main__':
    def cback(result):
        for k in result:
            print k, '==>', result[k]
        reactor.stop()

    def eback(error):
        print error.getTraceback()
        reactor.stop()

    d = getPage('http://example.com', agent='example web client', 
                 cookies={ 'some' : 'cookie' } )
    d.addCallback(cback)
    d.addErrback(eback)

    reactor.run()
于 2011-05-28T17:39:33.207 回答