You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Twisted的Yahoo Finance GET请求脚本无返回结果,如何获取有效响应?

基于Twisted的Yahoo Finance请求脚本无输出问题修复

问题根源分析

你的代码存在几个关键问题导致无输出:

  • 主入口判断错误:if '__name__' == '__main__': 中错误地将__name__作为字符串比较,导致主逻辑完全不执行
  • 响应处理逻辑混乱:R方法的Deferred用法完全错误,没有正确读取响应体,且namedtuple的使用不符合Twisted回调要求
  • 未读取响应内容:Twisted Agent返回的IResponse对象不会自动加载响应体,必须主动调用读取方法

修正后的完整代码

import asyncio
from collections import namedtuple
from twisted.internet import asyncioreactor
asyncioreactor.install()
from twisted.internet import reactor, defer
from twisted.web.http_headers import Headers
from twisted.web.client import Agent

headers = {
    'Origin': 'https://uk.finance.yahoo.com',
    'Referer': 'https://uk.finance.yahoo.com/quote/%5EFTMC?p=%5EFTMC',
    'Accept': '*/*',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Safari/605.1.15',
}

url = 'https://query1.finance.yahoo.com/v7/finance/quote?symbols=^FTMC&fields=exchangeTimezoneName,exchangeTimezoneShortName,regularMarketTime,gmtOffSetMilliseconds&region=GB&lang=en-GB'

class asyncHTTP:
    def __init__(self, method, url, headers):
        self._method = method
        self._url = url
        self._headers = headers
        self._agent = Agent(reactor)

    @staticmethod
    def _handle_response(response):
        # 异步读取响应体
        d = response.readBody()
        # 读取完成后组装响应信息
        def assemble_response(body):
            Response = namedtuple('Response', ['code', 'headers', 'body'])
            return Response(
                code=response.code,
                headers=dict(response.headers.getAllRawHeaders()),
                body=body.decode('utf-8')
            )
        return d.addCallback(assemble_response)

    async def cbRequest(self):
        response = await self._agent.request(
            self._method.upper().encode('utf-8'),
            self._url.encode('utf-8'),
            Headers(self._headers),
            None
        )
        # 处理响应并获取最终结果
        result = await self._handle_response(response)
        return result

async def main(twist):
    result = await twist.cbRequest()
    # 输出响应内容到控制台
    print("状态码:", result.code)
    print("响应头:", result.headers)
    print("响应体:", result.body)
    return result

if __name__ == '__main__':
    tw = asyncHTTP('GET', url, headers)
    asyncio.run(main(tw))

关键修改说明

  1. 修复主入口判断:将if '__name__' == '__main__':改为if __name__ == '__main__':,确保主逻辑代码能被执行
  2. 重构响应处理:
    • 使用response.readBody()异步读取响应体,这是Twisted获取HTTP响应内容的标准方式
    • 新增assemble_response回调函数,在响应体读取完成后组装结构化的响应数据,并将二进制body解码为字符串
  3. 添加控制台输出:在main函数中直接打印响应结果,确保能看到返回内容
  4. 规范请求方法:将请求方法统一转为大写,避免大小写不一致可能引发的问题
  5. 简化响应头格式:将Twisted的Headers对象转换为普通字典,提升可读性

内容的提问来源于stack exchange,提问作者Emil11

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 06:30:44