在报废项目中捕获重定向响应状态/历史记录



我确信这个问题已经被问过了,但我找不到我一生的答案。我想要的是requests包中的response.history。我有一个带有ID和url的数据帧。对于每个url,我希望返回最终响应final_url和响应历史记录。使用requests,代码如下所示:

import requests
import pandas as pd
import numpy as np
def get_responses(url):
try:
r = requests.head(url, allow_redirects = True)
r.raise_for_status()
return [r.status_code, r.url, '; '.join([str(resp.status_code) for resp in r.history])]
except requests.exceptions.HTTPError as errh:
return [errh, None, None]
except requests.exceptions.ConnectionError as errc:
return ['error connecting', None, None]
except requests.exceptions.Timeout as errt:
return ['timeout error', None, None]
except requests.exceptions.RequestException as err:
return ['oops: something else', None, None]
df[['response', 'response_url', 'response_history']] = [get_responses(x) for x in df['formatted_url'].values]

输出看起来像这样,这就是我想要的:

响应
id格式化的_url响应_历史
1http://WWW.BARHARBORINFO.COM200https://www.visitbarharbor.com/301;301

您肯定可以做到这一点,而且看起来它甚至已经得到了Scrapy的重定向中间件的支持,因为如果没有,那么覆盖重定向中间件以启用此功能应该不会太难。

正如您在中间件代码上看到的:

redirected.meta['redirect_times'] = redirects
redirected.meta['redirect_ttl'] = ttl - 1
redirected.meta['redirect_urls'] = request.meta.get('redirect_urls', []) + [request.url]
redirected.meta['redirect_reasons'] = request.meta.get('redirect_reasons', []) + [reason]

redirected是中间件正在创建的响应,它最终将传递给您应该控制的请求回调。

根据我所看到的,response.status被传递为redirect_reason,所以基本上从您的回调方法可以得到:

response.meta['redirect_reasons']

并且您将能够获得";重定向历史";针对该特定请求。

最新更新