我有一个简单的网站爬虫,它工作正常,但有时因为大量的内容,如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
答案 0 :(得分:8)
是强>
您可以使用Session.head
方法创建HEAD
次请求:
response = session.head(url, timeout=self.pageOpenTimeout, headers=customHeaders)
contentType = response.headers['content-type']
HEAD
请求类似于GET
请求,但不会发送邮件正文。
以下是Wikipedia的引用:
HEAD 要求响应与对应于GET请求的响应相同,但没有响应主体。这对于检索在响应头中编写的元信息非常有用,而无需传输整个内容。
答案 1 :(得分:2)
抱歉,我的错误,我应该更好地阅读文档。这是答案: 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
答案 2 :(得分:2)
使用requests.head()
。它不会返回消息体。如果您只对head
感兴趣,则应使用headers
方法。查看this link了解详细信息。
h = requests.head(some_link)
header = h.headers
content_type = header.get('content-type')
答案 3 :(得分:0)
由于requests.head()
执行 NOT 自动重定向,因此重定向网址,<{>>内容长度会使requests.head()
获得0。因此,请确保添加allow_redirects=True
。
r = requests.head(url, allow_redirects=True)
length = r.headers['Content-Length']