请求 - 在不获取整个页面/内容的情况下获取内容类型/大小
我有一个简单的网站爬虫,它运行得很好,但有时候会因为一些大文件,比如ISO镜像、.exe文件和其他大东西而卡住。通过文件扩展名来猜测内容类型可能不是个好主意。
有没有办法在不下载整个内容或页面的情况下获取内容类型和内容长度/大小?
这是我的代码:
requests.adapters.DEFAULT_RETRIES = 2
url = url.decode('utf8', 'ignore')
urlData = urlparse.urlparse(url)
urlDomain = urlData.netloc
session = requests.Session()
customHeaders = {}
if maxRedirects == None:
session.max_redirects = self.maxRedirects
else:
session.max_redirects = maxRedirects
self.currentUserAgent = self.userAgents[random.randrange(len(self.userAgents))]
customHeaders['User-agent'] = self.currentUserAgent
try:
response = session.get(url, timeout=self.pageOpenTimeout, headers=customHeaders)
currentUrl = response.url
currentUrlData = urlparse.urlparse(currentUrl)
currentUrlDomain = currentUrlData.netloc
domainWWW = 'www.' + str(urlDomain)
headers = response.headers
contentType = str(headers['content-type'])
except:
logging.basicConfig(level=logging.DEBUG, filename=self.exceptionsFile)
logging.exception("Get page exception:")
response = None
4 个回答
4
因为 requests.head()
不会自动重定向,所以如果一个网址被重定向了,requests.head()
就会得到 0 作为 内容长度。所以一定要确保加上 allow_redirects=True
。
r = requests.head(url, allow_redirects=True)
length = r.headers['Content-Length']
可以参考 请求的重定向和历史
6
抱歉,我犯了个错误,我应该更仔细地阅读文档。这里是答案:http://docs.python-requests.org/en/latest/user/advanced/#advanced(正文内容工作流程)
tarball_url = 'https://github.com/kennethreitz/requests/tarball/master'
r = requests.get(tarball_url, stream=True)
if int(r.headers['content-length']) > TOO_LONG:
r.connection.close()
# log request too long
10
可以使用 requests.head()
这个方法来实现。它不会返回消息的主体内容。如果你只对 headers
(头信息)感兴趣,就应该使用 head
方法。想了解更多细节,可以查看 这个链接。
h = requests.head(some_link)
header = h.headers
content_type = header.get('content-type')
35
是的。
你可以使用 Session.head
方法来创建 HEAD
请求:
response = session.head(url, timeout=self.pageOpenTimeout, headers=customHeaders)
contentType = response.headers['content-type']
HEAD
请求和 GET
请求很像,唯一的不同是它不会发送消息的主体内容。
这里有一段来自 维基百科 的引用:
HEAD 请求的响应和
GET
请求的响应是一样的,但没有响应的主体内容。这对于获取写在响应头里的元信息很有用,而不需要传输整个内容。