如何用Django和requests读取网页Header?代码报错求助
问题分析与解决方案
错误原因
- 索引越界:
final_result[1]试图访问列表的第二个元素,但第一次向final_result添加元素后,列表仅包含1个元素(索引为0),此时访问索引1必然触发IndexError。 - 逻辑错误:代码意图获取每个搜索结果页面的
X-Frame-Options头,但循环位置和遍历对象完全错误——你错误地遍历了final_result[1](第二个搜索结果的元组内容),而非针对每个搜索结果的URL单独发起请求。
修正后的代码
def search(request): # ... 其他原有代码 final_result = [] for page_num in range(1, max_pages_to_scrap+1): url = f"https://www.ask.com/web?q={search}&qo=pagination&page={page_num}" res = requests.get(url) soup = bs(res.text, 'lxml') result_listings = soup.find_all('div', {'class': 'PartialSearchResults-item'}) for result in result_listings: result_title = result.find(class_='PartialSearchResults-item-title').text result_url = result.find('a').get('href') result_desc = result.find(class_='PartialSearchResults-item-abstract').text # 单独请求当前结果URL的响应头,判断X-Frame-Options notAccept = False try: # 允许重定向,确保获取最终跳转后的页面头 response = requests.get(result_url, allow_redirects=True, timeout=10) x_frame_option = response.headers.get('X-Frame-Options', '') notAccept = x_frame_option in ["DENY", "SAMEORIGIN"] except Exception as e: # 处理请求异常(如超时、无效URL、网络错误等) pass # 将判断结果加入最终结果列表 final_result.append((result_title, result_url, result_desc, notAccept)) # ... 后续返回结果的代码
关键改进点
- 移除了错误的
for header in final_result[1]:循环,改为针对每个搜索结果的result_url单独发起请求 - 添加了异常处理,避免单个URL请求失败导致整个搜索流程崩溃
- 使用
headers.get()安全获取头信息,避免头不存在时触发KeyError - 加入超时设置,防止请求长时间阻塞
内容的提问来源于stack exchange,提问作者Goune Kenfack
相关产品推荐
相关产品推荐

