请求产品URL返回414错误,split函数处理未达预期求助
问题:请求产品URL返回414状态码,拆分变量无效
发送请求获取产品数据时返回状态码414,原以为是请求次数过多,但尝试拆分product_info变量后并未解决问题。相关代码如下:
import requests as r from bs4 import BeautifulSoup def get_ProductData(): url = 'https://shopnicekicks.com/sitemap_products_1.xml?from=1169123841&to=7106802188493' data = r.get(url) soup = BeautifulSoup(data.text,'xml') title = soup.findAll('title') for titles in title: titles.decompose() info = ''.join(soup.stripped_strings) product_info = info + '/products.json' response = r.get(product_info,params=product_info) print(response.status_code) # Run the function get_ProductData()
问题分析与解决
- 414状态码的真实原因:414表示请求URI过长,并非请求次数过多(请求频率超限通常返回429状态码)。
- 代码核心问题:
- 删除
<title>标签后,用''.join(soup.stripped_strings)把整个站点地图里的所有URL拼接成了一个超长字符串,导致product_info是一堆无效地址的拼接体,请求时自然触发414错误。 r.get(product_info, params=product_info)用法错误,params参数需为字典格式的请求参数,不应直接传入URL。
- 删除
- 修正后的代码:
站点地图里的产品URL都存放在<loc>标签中,直接提取每个标签内容即可:
import requests as r from bs4 import BeautifulSoup def get_ProductData(): url = 'https://shopnicekicks.com/sitemap_products_1.xml?from=1169123841&to=7106802188493' data = r.get(url) soup = BeautifulSoup(data.text, 'xml') # 提取所有存放产品URL的<loc>标签 product_locs = soup.findAll('loc') for loc in product_locs: product_url = loc.get_text(strip=True) product_info = product_url + '/products.json' try: response = r.get(product_info) print(f"地址: {product_info}, 状态码: {response.status_code}") except Exception as e: print(f"请求失败: {e}") # 执行函数 get_ProductData()
- 额外建议:
- 频繁请求易触发反爬机制,建议添加请求间隔(如
time.sleep(1))。 - 可设置请求头(如添加
User-Agent字段)模拟浏览器请求,提升成功率。
- 频繁请求易触发反爬机制,建议添加请求间隔(如
内容的提问来源于stack exchange,提问作者Yarik
相关产品推荐
相关产品推荐

