使用requests和BeautifulSoup应对页面更新后的URL变化问题
解决URL更新导致的旧数据解析问题
嘿,这个问题我之前帮朋友处理过!像亚马逊这类平台,商品链接经常会因为商品迭代、合并或者系统规范化更新URL,导致旧链接要么跳转到新页面,要么返回滞后的数据。针对你的场景,这里有几个实用的解决方案:
方案1:让Requests自动跟随重定向,提取最终有效URL
Requests库默认是允许自动跟随重定向的(allow_redirects=True),所以你请求旧URL后,只需要读取response.url就能拿到跳转后的最新URL,还能顺便把这个新URL更新回你的Excel表格,避免下次再踩坑。
示例代码:
import requests # 模拟Excel里的旧URL old_url = "https://www.amazon.com/dp/B07BHF8PPB" # 记得加请求头,避免被亚马逊反爬拦截 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' } response = requests.get(old_url, headers=headers) # 检查是否发生了重定向 if response.history: print(f"旧URL已自动跳转到: {response.url}") # 这里写代码把response.url更新回你的Excel表格里对应的行 final_url = response.url # 接下来用final_url去解析页面就可以拿到最新数据了 # soup = BeautifulSoup(response.text, 'html.parser')
这个方法的好处是简单直接,完全利用Requests的原生能力,还能同步更新你的URL数据源,一劳永逸。
方案2:提取商品唯一标识符(ASIN),构造标准链接
亚马逊商品的核心标识是ASIN(就是/dp/后面的那段字符串),这个标识符几乎不会变动,比URL可靠得多。你可以从旧URL或重定向后的最终URL里提取ASIN,然后用它构造标准的商品链接,不管URL怎么更新,这个链接都能指向正确的页面。
示例代码:
import requests from urllib.parse import urlparse def extract_asin(url): parsed_url = urlparse(url) path_segments = parsed_url.path.split('/') # 从路径里找/dp/后面的ASIN if 'dp' in path_segments: dp_index = path_segments.index('dp') if dp_index + 1 < len(path_segments): return path_segments[dp_index + 1] return None # 从旧URL提取ASIN old_url = "https://www.amazon.com/dp/B07BHF8PPB" old_asin = extract_asin(old_url) # 请求旧URL拿到最终页面,再提取最新的ASIN(如果有的话) headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' } response = requests.get(old_url, headers=headers) final_asin = extract_asin(response.url) # 用最终ASIN构造标准链接 standard_url = f"https://www.amazon.com/dp/{final_asin}"
建议你以后把ASIN存在Excel里,而不是完整URL——毕竟ASIN是商品的唯一身份标识,比随时可能变动的URL稳定太多。
额外提醒:反爬注意事项
亚马逊对爬虫限制很严,直接用Requests请求很容易被拦截(返回验证码页面或503错误)。除了加User-Agent,还可以考虑:
- 加入随机请求间隔
- 代理IP轮换(如果请求量很大)
- 使用
requests.Session()维持会话
内容的提问来源于stack exchange,提问作者doobiedoo
相关产品推荐
相关产品推荐

