Python中如何爬取产品图片?

如: https://mall.icbc.com.cn/products/pd_0001381554.jhtml 这个产品左边的 5 个大图。得到图片的链接用浏览器试总会跳转到主页去了。不知道怎么处理?希望能指点一下。
Python中如何爬取产品图片?

26 回复

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)

核心要点:

  1. 请求头设置:必须添加User-Agent模拟浏览器,否则可能被拒绝访问
  2. 图片URL处理:注意处理相对路径(以//或/开头的URL)
  3. 选择器调整:根据目标网站的HTML结构修改soup.find_all()的选择条件
  4. 异常处理:网络请求和文件操作都要做好异常捕获
  5. 延迟设置time.sleep()避免请求过快被封IP

实际使用时需要调整的地方:

  • 第30行:根据网站实际结构调整图片选择器
  • 第48行:可能需要添加图片格式过滤(如只下载.jpg/.png)
  • 可添加代理支持、并发下载等高级功能

一句话建议: 先检查网站robots.txt并尊重版权,合理控制爬取频率。

如得到
这个你在网页源代码那里点击可以打开。但是你得到单独的图片地址就不行了。会发生跳转。

加 referer

额。。好像真的会跳转

把你发出来的这个链接当作 Referer 请求就可以了

没看明白这句话,图片的链接不是.jpg 的吗

看请求头

没发出链接。只发了主地址。。好了,我被 360 浏览器坑了。。用 google 测试下能打开了。。

多谢老兄。我知道了。非常感谢

别用 360 浏览器测试,我被坑了

我怀疑你在发广告 手动滑稽

真没有。现在是年底,忙着搞数据呢?卖的多也是累死我们这些汇总产品的吧。

chrome 没跳转

我的 Chrome 跳转了

我的 chrome 也跳转了



图片链接跳转,感觉是后台做了权限控制吧,不跳转的我猜登陆了?

可能你版本比较老。360 用 63 的内核是跳转的。。

#3 楼那位就给你们正确答案了 不知道你们还在瞎猜啥

https://image5.mall.icbc.com.cn/image/10023640/4/1524359627669_3.jpg

直接 F12,禁用缓存,抓取网络请求。重新刷新页面就能得到地址。

正解。这个是对的。感谢大佬

加 referer 就可以了

想知道为什么会跳转。。。

应该是加了防盗链限制,只允许来源 mall.icbc.com.cn 域名的地址访问,你把在 header 中添加一个 referer 属性,标识来源的是该域名就可以了

回到顶部