【问题标题】:How do I make a GET request and then print out the response body with Python (Twisted)如何发出 GET 请求,然后使用 Python (Twisted) 打印出响应正文
【发布时间】:2015-10-05 20:41:55
【问题描述】:

在 Twisted 的网站上,他们有一个名为“接收响应”的示例,该示例向您展示了如何获取响应标头和响应代码等,但不包括响应正文(向网站的请求返回的实际 HTML 正文) .

在 def cbrequest(response) 中,我如何打印出 GET 请求返回给 example.com 的 HTML 文本?他们展示了诸如 response.headers 之类的方法来获取标题,但我还没有看到返回前端正文的方法。

我尝试打印 response.deliverBody(BeginningPrinter(finished)) 以获取响应文本,但无济于事

http://twistedmatrix.com/documents/12.1.0/web/howto/client.html#auto9

from pprint import pformat

from twisted.internet import reactor
from twisted.internet.defer import Deferred
from twisted.internet.protocol import Protocol
from twisted.web.client import Agent
from twisted.web.http_headers import Headers

class BeginningPrinter(Protocol):
    def __init__(self, finished):
        self.finished = finished
        self.remaining = 1024 * 10

    def dataReceived(self, bytes):
        if self.remaining:
            display = bytes[:self.remaining]
            print 'Some data received:'
        print display
        self.remaining -= len(display)

 def connectionLost(self, reason):
    print 'Finished receiving body:', reason.getErrorMessage()
    self.finished.callback(None)

agent = Agent(reactor)
d = agent.request(
    'GET',
    'http://example.com/',
    Headers({'User-Agent': ['Twisted Web Client Example']}),
    None)

def cbRequest(response):
    print 'Response version:', response.version
    print 'Response code:', response.code
    print 'Response phrase:', response.phrase
    print 'Response headers:'
    print pformat(list(response.headers.getAllRawHeaders()))
    finished = Deferred()
    response.deliverBody(BeginningPrinter(finished))
    return finished
d.addCallback(cbRequest)

def cbShutdown(ignored):
   reactor.stop()
d.addBoth(cbShutdown)

reactor.run()

【问题讨论】:

    标签: python http twisted twisted.client


    【解决方案1】:

    您必须保留数据并在之后返回

    class BeginningPrinter(Protocol):
        def __init__(self, finished):
            self.finished = finished
            self.remaining = 1024 * 10
            self.buff = None
    
        def dataReceived(self, bytes):
            if self.buff is None:
                self.buff = bytes
            else:
                self.buff += bytes
            if self.remaining:
                display = bytes[:self.remaining]
                print 'Some data received:'
            print display
            self.remaining -= len(display)
    
        def connectionLost(self, reason):
            print 'Finished receiving body:', reason.getErrorMessage()
            self.finished.callback(self.buff)
    

    请注意,您可能应该删除变量 remaining,因为此代码示例期望服务器以 1024 * 10 字节响应。

    class BeginningPrinter(Protocol):
        def __init__(self, finished):
            self.finished = finished
            self.buff = None
    
        def dataReceived(self, bytes):
            if self.buff is None:
                self.buff = bytes
            else:
                self.buff += bytes
    
        def connectionLost(self, reason):
            print 'Finished receiving body:', reason.getErrorMessage()
            self.finished.callback(self.buff)
    

    【讨论】:

    • "请注意,您可能应该删除剩余的变量,因为此代码示例期望服务器以 1024 * 10 字节响应。"。此问题和答案所依据的"Inspect the response 代码似乎不同意该声明。我读错了吗?
    • 我又读了一遍代码。只打印1024 * 10 的第一个字节是理想的。这就是为什么这个类被命名为“开始打印机”我想你只需要所有的响应。您可能想使用我给出的最后一个 sn-p,但将类重命名为 ResponseReceiver
    猜你喜欢
    • 1970-01-01
    • 2020-10-10
    • 2015-10-28
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    相关资源
    最近更新 更多