程序员文章、书籍推荐和程序员创业信息与资源分享平台

网站首页 > 技术文章 正文

还在手动保存图片?Python 爬虫 3 步搞定整站图片,附避坑指南

hfteth 2025-08-01 16:58:21 技术文章 5 ℃

你是不是也遇到过这种情况?看到某个设计素材站的图片特别适合项目原型,想批量保存却只能一张张右键另存为?或者发现竞品官网的产品图拍得很有质感,想收集参考却被限制右键保存?作为开发人员,咱们总该用更高效的方式解决这类问题吧?

为什么需要用 Python 爬虫获取图片?

在互联网开发的日常工作中,获取图片资源是很常见的需求。就拿我们团队来说,上个月做一个电商 APP 的原型设计,需要收集大量同类型产品的图片做参考,设计师手动保存了 3 个小时才弄了 200 多张,效率极低。而用 Python 爬虫,不到 10 分钟就搞定了上千张图片,这就是技术带来的效率提升。

但很多开发同学对爬虫望而却步,主要是存在两个误区:一是觉得反爬机制太复杂,自己搞不定;二是认为写爬虫需要高深的技术,入门门槛高。其实不然,只要掌握了正确的方法,即使是爬虫新手也能快速上手。

Python 爬虫获取图片的 3 个关键步骤

(一)网页请求与解析

这一步的核心是模拟浏览器向目标网站发送请求,然后解析返回的网页内容,提取出图片的 URL。

发送请求:这里推荐使用 requests 库,它简洁易用,能轻松实现 HTTP 请求。但一定要记得设置 headers,里面的 User - Agent 字段要模拟成真实的浏览器信息,否则很容易被网站的反爬机制识别并拦截。比如我们设置的 User - Agent 为 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36',这是一个常见的 Chrome 浏览器的标识。

解析内容:拿到网页源码后,用 BeautifulSoup 库进行解析。它能快速定位到我们需要的标签,对于图片来说,就是 img 标签。我们可以通过 find_all ('img') 方法获取所有的 img 标签,然后提取出 src 属性的值,这就是图片的 URL。

不过有个细节要注意,有些网站的图片 src 是相对路径,比如 '/images/pic1.jpg',这时候就需要把它和网站的域名拼接起来,形成完整的 URL,否则无法正常访问图片。就像这样,如果网站域名为'https://example.com',那么完整的 URL 就是'
https://example.com/images/pic1.jpg'。

代码示例:

import requests
from bs4 import BeautifulSoup

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36'
}

url = '目标网站的URL'
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'lxml')
img_tags = soup.find_all('img')

# 处理相对路径
base_url = 'https://目标网站域名'
img_urls = []
for img in img_tags:
    img_url = img.get('src')
    if img_url and not img_url.startswith('http'):
        img_url = base_url + img_url
    img_urls.append(img_url)

(二)图片下载与存储

获取到图片的 URL 后,就可以进行下载和存储了。这一步要考虑到各种可能出现的问题,确保下载过程稳定,存储规范。

下载图片:循环遍历图片 URL 列表,用 requests.get () 方法发送请求获取图片内容。为了避免因单个图片下载超时导致程序卡住,要设置 timeout 参数,这里我们设置为 10 秒。同时,加入异常捕获机制,当下载某个图片出现错误时,能捕获到错误信息并继续下载其他图片,而不是让整个程序崩溃。

存储图片:首先要创建一个专门的文件夹来存放图片,比如我们创建一个名为 'images' 的文件夹。在命名图片时,为了避免文件名重复,我们可以使用 uuid 库生成唯一的标识符作为文件名。另外,如果图片有不同的类别,还可以创建子文件夹进行分类存储,方便后续查找和使用。

代码示例:

import os
import uuid
import requests

# 创建存储文件夹
if not os.path.exists('images'):
    os.makedirs('images')

for img_url in img_urls:
    if not img_url:
        continue
    try:
        img_response = requests.get(img_url, timeout=10)
        # 生成唯一文件名
        file_name = str(uuid.uuid4()) + '.jpg'
        file_path = os.path.join('images', file_name)
        with open(file_path, 'wb') as f:
            f.write(img_response.content)
        print(f'下载成功:{img_url}')
    except Exception as e:
        print(f'下载失败:{img_url},错误:{e}')

(三)应对反爬策略

现在很多网站都有反爬机制,这是我们爬取图片过程中最大的障碍。常见的反爬策略有检测请求频率、验证 Cookie、设置 JavaScript 渲染等,我们要针对性地采取应对措施。

控制请求频率:网站会通过检测单位时间内来自同一 IP 的请求次数来判断是否为爬虫。我们可以在每次请求之间加入随机的时间间隔,模拟人类浏览网页的节奏。比如使用 time.sleep (random.uniform (1, 3)),这样每次请求的间隔在 1 到 3 秒之间随机变化。

处理 Cookie 验证:有些网站需要用户登录后才能访问图片资源,这时候就需要使用 Session 保持登录状态。我们可以先手动登录网站,获取到 Cookie 信息,然后将 Cookie 传入 Session 中,这样发送的请求就会带有登录状态的 Cookie,从而绕过登录验证。

应对 JavaScript 渲染:部分网站的图片 URL 是通过 JavaScript 动态生成的,用常规的方法无法直接获取。这时候可以使用 selenium 库,它能模拟浏览器的行为,执行 JavaScript 代码,从而获取到动态生成的图片 URL。

代码示例(控制请求频率和处理 Cookie):

import time
import random
import requests

session = requests.Session()
# 设置Cookie
cookies = {
    'cookie_name1': 'cookie_value1',
    'cookie_name2': 'cookie_value2'
}
session.cookies.update(cookies)

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36'
}

for img_url in img_urls:
    if not img_url:
        continue
    try:
        # 随机请求间隔
        time.sleep(random.uniform(1, 3))
        img_response = session.get(img_url, headers=headers, timeout=10)
        # 存储图片的代码,同上
    except Exception as e:
        print(f'下载失败:{img_url},错误:{e}')

总结

通过以上 3 个步骤,我们就能用 Python 爬虫批量获取网站的图片资源了。从网页请求与解析,到图片下载与存储,再到应对反爬策略,每个环节都有其关键要点和技巧。掌握了这些,不仅能提高工作效率,还能为我们的项目带来更多的可能性。

但再次强调,爬取图片时一定要遵守网站的 robots 协议,尊重网站的版权和规定。不要过度发送请求给服务器造成不必要的压力,更不能将爬取的图片用于商业用途侵犯他人权益。

你在使用 Python 爬虫获取图片的过程中,还遇到过哪些棘手的问题?有什么好的解决方法吗?欢迎在评论区留言分享,我们一起交流学习。如果觉得这篇文章对你有帮助,别忘了点赞收藏,也可以分享给身边有需要的同事。让我们用技术提升效率,用规范约束行为,共同在互联网开发的道路上不断进步!

最近发表
标签列表