So I first use requests.head() to download the header. I do some validation(check the status code, check content-type) if that is good I download the body. However I use requests.get() to that, but using .get() not only downloads the body but also the header which I just downloaded. So I don't need to download the header twice, anyway I can download the body of a get response if the header looks good?
No, there's no way. HTTP has the HEAD request, which only gets the header, but there's no request to get only the body.
Don't worry too much about efficiency until you need to; the header usually isn't too big anyway. Either use requests.get() in the first place if the body is small, or else do requests.head() followed by requests.get() if you need to.
Python requests: Anyway to download just the body of a get response?