我想要"ping“一个服务器,检查标题响应,看看链接是否坏了,如果它没有损坏,实际上下载响应正文。
传统上,使用requests模块的同步方法,您可以发送带有stream = True参数的get请求,并在响应体下载之前捕获标头,如果出现错误(例如,找不到),则决定中止连接。
我的问题是,用异步库grequests或requests-futures来实现这一点对于我减少的知识基础来说已经变得不可能了。
我尝试过在request-futures中将流参数设置为true,但是没有用,它仍然下载响应体,而不让我一得到响应头就介入。即使是这样,我也不知道该怎么做。
这就是我尝试过的:
test.py
from requests_futures.sessions import FuturesSession
session = FuturesSession()
session.stream = True
future = session.get('http://www.google.com')
response = future.result()
print(response.status_code) # Here I would assume the response body hasn't been loaded调试后,我发现它以任何方式下载响应体。
我希望有任何办法解决最初的问题,无论它是否符合我的逻辑。
发布于 2017-03-29 05:01:17
我相信您想要的是HTTP头请求:
session.head('http://www.google.com')根据w3.org,“HEAD方法与GET相同,只是服务器不能在响应中返回消息体。”如果您喜欢状态代码和标头,您可以使用普通的GET请求进行跟踪。
对于注释,您可能也对在单个请求中执行此操作感兴趣。可以通过套接字直接这样做。发送普通的GET请求,对第一个块执行recv,如果您不喜欢结果,关闭连接,否则在剩余的块上循环。
以下是关于如何使用单个请求有条件地下载的概念的证明:
import socket
def fetch_on_header_condition(host, resource, condition, port=80):
request = 'GET %s HTTP/1.1\r\n' % resource
request += 'Host: %s\r\n' % host
request += 'Connection: close\r\n'
request += '\r\n'
s = socket.socket()
try:
s.connect((host, port))
s.send(request)
first_block = s.recv(4096)
if not condition(first_block):
return False, ''
blocks = [first_block]
while True:
block = s.recv(4096)
if not block:
break
blocks.append(block)
return True, ''.join(blocks)
finally:
s.close()
if __name__ == '__main__':
print fetch_on_header_condition(
host = 'www.jython.org',
port = 80,
resource = '/',
condition = lambda s: 'Content-Type: text/xml' in s,
)发布于 2017-03-29 04:57:00
只需检查head请求中的状态,并相应地进行:
header = session.head('https://google.com')
if header.ok is True:
session.get('https://google.com')https://stackoverflow.com/questions/42966224
复制相似问题