基于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®ion=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))
关键修改说明
- 修复主入口判断:将
if '__name__' == '__main__':改为if __name__ == '__main__':,确保主逻辑代码能被执行 - 重构响应处理:
- 使用
response.readBody()异步读取响应体,这是Twisted获取HTTP响应内容的标准方式 - 新增
assemble_response回调函数,在响应体读取完成后组装结构化的响应数据,并将二进制body解码为字符串
- 使用
- 添加控制台输出:在
main函数中直接打印响应结果,确保能看到返回内容 - 规范请求方法:将请求方法统一转为大写,避免大小写不一致可能引发的问题
- 简化响应头格式:将Twisted的Headers对象转换为普通字典,提升可读性
内容的提问来源于stack exchange,提问作者Emil11
相关产品推荐
相关产品推荐

