Python中如何爬取产品图片?
如: https://mall.icbc.com.cn/products/pd_0001381554.jhtml 这个产品左边的 5 个大图。得到图片的链接用浏览器试总会跳转到主页去了。不知道怎么处理?希望能指点一下。
Python中如何爬取产品图片?
https://image5.mall.icbc.com.cn/oaasImage/10023640/3/1542861223648_3.jpg 测试这个链接是可以直接用浏览器访问的,没有发生跳转的情况
import requests
from bs4 import BeautifulSoup
import os
import time
def download_product_images(url, save_folder='product_images'):
"""
爬取指定网页中的产品图片
参数:
url: 目标产品页面的URL
save_folder: 图片保存的文件夹名称
"""
# 创建保存图片的文件夹
if not os.path.exists(save_folder):
os.makedirs(save_folder)
# 设置请求头,模拟浏览器访问
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
try:
# 发送HTTP请求
response = requests.get(url, headers=headers, timeout=10)
response.raise_for_status() # 检查请求是否成功
# 使用BeautifulSoup解析HTML
soup = BeautifulSoup(response.content, 'html.parser')
# 查找所有图片标签 - 这里可能需要根据实际网站结构调整选择器
# 常见的选择器示例:
# 1. 所有img标签: soup.find_all('img')
# 2. 特定class的图片: soup.find_all('img', class_='product-image')
# 3. 特定属性的图片: soup.find_all('img', {'data-src': True})
img_tags = soup.find_all('img')
downloaded_count = 0
for i, img in enumerate(img_tags):
# 获取图片URL
img_url = img.get('src') or img.get('data-src')
if not img_url:
continue
# 处理相对URL
if img_url.startswith('//'):
img_url = 'https:' + img_url
elif img_url.startswith('/'):
img_url = url.split('/')[0] + '//' + url.split('/')[2] + img_url
try:
# 下载图片
img_data = requests.get(img_url, headers=headers, timeout=5).content
# 生成文件名
file_name = f"product_{i+1}_{int(time.time())}.jpg"
file_path = os.path.join(save_folder, file_name)
# 保存图片
with open(file_path, 'wb') as f:
f.write(img_data)
downloaded_count += 1
print(f"已下载: {file_name}")
# 避免请求过快
time.sleep(0.5)
except Exception as e:
print(f"下载失败 {img_url}: {e}")
continue
print(f"\n完成!共下载 {downloaded_count} 张图片到 '{save_folder}' 文件夹")
except requests.RequestException as e:
print(f"请求失败: {e}")
except Exception as e:
print(f"发生错误: {e}")
# 使用示例
if __name__ == "__main__":
# 替换为你要爬取的产品页面URL
target_url = "https://example.com/products"
download_product_images(target_url)
核心要点:
- 请求头设置:必须添加User-Agent模拟浏览器,否则可能被拒绝访问
- 图片URL处理:注意处理相对路径(以//或/开头的URL)
- 选择器调整:根据目标网站的HTML结构修改
soup.find_all()的选择条件 - 异常处理:网络请求和文件操作都要做好异常捕获
- 延迟设置:
time.sleep()避免请求过快被封IP
实际使用时需要调整的地方:
- 第30行:根据网站实际结构调整图片选择器
- 第48行:可能需要添加图片格式过滤(如只下载.jpg/.png)
- 可添加代理支持、并发下载等高级功能
一句话建议: 先检查网站robots.txt并尊重版权,合理控制爬取频率。
如得到
这个你在网页源代码那里点击可以打开。但是你得到单独的图片地址就不行了。会发生跳转。
加 referer
F12→network→doc 里有个 pd_0001381554.jhtml 的文件,里面有你要的大图
https://image5.mall.icbc.com.cn/oaasImage/10023640/3/1542861223648_4.jpg
https://image5.mall.icbc.com.cn/image/10023640/6/1524359020841_4.jpg
https://image5.mall.icbc.com.cn/image/10023640/0/1524359021010_4.jpg
https://image5.mall.icbc.com.cn/image/10023640/4/1524359021168_4.jpg
https://image5.mall.icbc.com.cn/image/10023640/4/1524359627669_4.jpg
额。。好像真的会跳转
.zoomPup 是你鼠标能点住的那个图片,
它下边有外兄弟.zoomWindow 往下依次找:.zoomWrapper>.zoomWrapperImage>.img
https://image5.mall.icbc.com.cn/oaasImage/10023640/3/1542861223648_4.jpg
https://image5.mall.icbc.com.cn/image/10023640/6/1524359020841_4.jpg
https://image5.mall.icbc.com.cn/image/10023640/0/1524359021010_4.jpg
https://image5.mall.icbc.com.cn/image/10023640/4/1524359021168_4.jpg
https://image5.mall.icbc.com.cn/image/10023640/4/1524359627669_4.jpg
把你发出来的这个链接当作 Referer 请求就可以了
没看明白这句话,图片的链接不是.jpg 的吗
看请求头
没发出链接。只发了主地址。。好了,我被 360 浏览器坑了。。用 google 测试下能打开了。。
多谢老兄。我知道了。非常感谢
别用 360 浏览器测试,我被坑了
我怀疑你在发广告 手动滑稽
真没有。现在是年底,忙着搞数据呢?卖的多也是累死我们这些汇总产品的吧。
chrome 没跳转
我的 Chrome 跳转了
我的 chrome 也跳转了
图片链接跳转,感觉是后台做了权限控制吧,不跳转的我猜登陆了?
可能你版本比较老。360 用 63 的内核是跳转的。。
https://image5.mall.icbc.com.cn/image/10023640/4/1524359627669_3.jpg
直接 F12,禁用缓存,抓取网络请求。重新刷新页面就能得到地址。
正解。这个是对的。感谢大佬
加 referer 就可以了
想知道为什么会跳转。。。
应该是加了防盗链限制,只允许来源 mall.icbc.com.cn 域名的地址访问,你把在 header 中添加一个 referer 属性,标识来源的是该域名就可以了


