如何从商品详情页爬取所有相关商品图片?代码求校验
问题解决:爬取商品详情页所有相关图片
针对你的需求,先修正代码里的核心问题,再补充提取图片链接的关键逻辑:
修正后的完整代码
import requests import json from bs4 import BeautifulSoup as bs # 商品详情页URL url = "https://www.boulanger.com/ref/1176193" page = requests.get(url) if page.status_code == 200: parsedPage = bs(page.content, 'lxml') div_product = parsedPage.find('article', {'class': 'container-xl'}) # 提取商品标题和参考号(保留你原有的逻辑) title = div_product.find('h1', {'class': 'product-title__main'}).get_text() title = ' '.join([ligne.strip() for ligne in title.split('\n') if ligne.strip()]) ref = div_product.find('div', {'class': 'product-title__ref'}).get_text().strip() # 解析页面脚本获取gtin13(修正重复请求页面的错误) script_tag = parsedPage.select_one('script:has(+header)') if not script_tag: print("未找到包含商品标识的脚本标签") exit() data = json.loads(script_tag.text) gtin13 = data.get("gtin13") if not gtin13: print("未获取到商品唯一标识gtin13") exit() # 请求图片数据接口并解析JSONP格式返回值 media_url = f'https://boulanger.scene7.com/is/image/Boulanger/{gtin13}_mixed?req=set,json,UTF-8' media_response = requests.get(media_url) media_data = json.loads(media_response.text.split('(')[1][:-5]) # 提取所有商品图片的完整链接 image_links = [] for item in media_data.get('set', {}).get('items', []): img_name = item.get('name') if img_name: # 拼接Scene7图片服务的完整URL,可按需添加尺寸参数(比如?wid=800) full_img_url = f"https://boulanger.scene7.com/is/image/Boulanger/{img_name}" image_links.append(full_img_url) # 输出结果 print(f"商品标题: {title}") print(f"商品参考号: {ref}") print("\n所有商品图片链接:") for idx, link in enumerate(image_links, 1): print(f"{idx}. {link}") # 可选:取消注释可将图片保存到本地 # for idx, link in enumerate(image_links, 1): # img_content = requests.get(link).content # with open(f"商品图片_{idx}.jpg", 'wb') as f: # f.write(img_content) # print(f"已保存图片: 商品图片_{idx}.jpg")
核心修正点
- 去掉重复请求页面的错误:原代码中
requests.get(page)是错误用法,直接复用第一次请求的page.content解析脚本标签 - 增加异常判断:处理找不到脚本标签、获取不到gtin13的情况,避免代码崩溃
- 补充图片提取逻辑:从接口返回的
media_data中提取图片名称,拼接成可直接访问的完整图片URL
内容的提问来源于stack exchange,提问作者Hervé Guevara
相关产品推荐
相关产品推荐

