【问题标题】:python asyncio connection gets incomplete http responsepython asyncio连接得到不完整的http响应
【发布时间】:2017-02-25 11:55:10
【问题描述】:

我正在尝试使用 python asyncio 获取网站的内容。

import asyncio
import urllib.parse

@asyncio.coroutine
def get(url):
    url = urllib.parse.urlsplit(url)
    connect = asyncio.open_connection(url.hostname, 80)
    reader, writer = yield from connect
    request = ('HEAD {path} HTTP/1.1\r\n'
             'Host: {hostname}\r\n'
             'Accept:*/*\r\n'
             '\r\n').format(path=url.path or '/', hostname=url.hostname)
    writer.write(request.encode('latin-1'))
    response = yield from reader.read()
    print(response)
    writer.close()

url = 'http://www.example.com'
loop = asyncio.get_event_loop()
tasks = asyncio.ensure_future(get(url))
loop.run_until_complete(tasks)
loop.close()

它只获取标题,但没有内容!

b'HTTP/1.1 200 OK\r\nAccept-Ranges: bytes\r\nCache-Control: max-age=604800\r\nContent-Type: text/html\r\nDate: Sat, 25 Feb 2017 11:44:26 GMT\r\nEtag: "359670651+ident"\r\nExpires: Sat, 04 Mar 2017 11:44:26 GMT\r\nLast-Modified: Fri, 09 Aug 2013 23:54:35 GMT\r\nServer: ECS (rhv/818F)\r\nX-Cache: HIT\r\nContent-Length: 1270\r\n\r\n'

【问题讨论】:

  • 您正在发出 HEAD 请求,您期待什么?
  • @jonrsharpe 很好的答案,伙计。他很可能是做错了,你也否决了这个问题?如果你向他解释 HEAD 请求只是从网站收集头部,而他会寻找 GET 请求,那会更有帮助。

标签: python sockets http python-asyncio


【解决方案1】:

正如其中一位 cmets 所述,您执行的是 HEAD 请求而不是 GET 请求:HEAD 请求只会检索标头,这就是您只接收这些标头的原因。

我已经使用 GET 而不是 HEAD 测试了您的代码,它可以按您的预期工作;但作为一个建议,我将转向 aiohttp,您的整个代码将包含在下面的代码中,不仅更好看,而且速度更快:

import asyncio
import aiohttp


async def get(loop, url):
    async with aiohttp.request('GET', url, encoding='latin-1') as response:
        html = await response.text()
        print(html)

url = 'http://www.example.com'
loop = asyncio.get_event_loop()
loop.run_until_complete(get(loop, url))
loop.close()

注意:这是 Python 3.5+ async/await 风格,但可以使用 @asyncio.coroutine 和 yield from 轻松转换为 3.4。如果您有任何问题,请告诉我。

【讨论】:

  • 有效!谢谢你。我的脚本是从 python 文档中的示例修改的。看来我忘了把 HEAD 改成 GET。
  • 很高兴为您提供帮助。
猜你喜欢
  • 2012-04-23
  • 2020-05-15
  • 1970-01-01
  • 1970-01-01
  • 2018-10-16
  • 1970-01-01
  • 2015-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多