Python3 实现图片 URL 批量爬取与本地保存完整示例

Theo
Theo
发布时间:2026-10-13| 6人浏览过
原创

本文介绍如何使用 Python3 的 urllib 模块批量爬取图片 URL 并保存至本地。内容涵盖从文件读取 URL 列表、构造 HTTP 请求、处理 HTTPError 和 URLError 等常见异常,以及通过递归参数实现断点重连机制。此外,还展示了如何使用修饰器对抓取函数进行计时监控,提供完整的 Python3 代码示例供参考。

Python3 图片爬虫概述与地址获取

在实际开发中,我们常需要从互联网上抓取图片,以应对各种业务场景甚至特殊需求。

一个基础的网络爬虫项目通常包含两个核心步骤:首先获取目标网页地址,其次提取并保存所需数据。

以下示例演示了如何从图片 URL 集合中批量获取图片,这可以作为学习网络爬虫的一个良好起点。

获取地址

如果图片 URL 呈现规律性变化(例如从 001 递增到 099),程序可以通过截取公共前缀,并在末尾进行字符串递增循环来生成地址。

另一种常见情况是 URL 已预先保存在某个文件中,此时程序只需读取该文件并将 URL 加载到列表中即可。


def getUrls(path):
  urls = []
  with open(path,'r') as f:
    for line in f:
      urls.append(line.strip('\n'))
  return(urls)

图片保存与 urllib 模块应用

保存图片

在 Python3 中,urllib 模块提供了丰富的 URL 操作功能,其中 request 子模块能方便地抓取网页内容。它通过发送 GET 请求到指定页面并返回 HTTP 响应来实现数据获取。具体实现细节请参考代码注释。


def requestImg(url, name, num_retries=3):
  img_src = url
  # print(img_src)
  header = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) \
    AppleWebKit/537.36 (KHTML, like Gecko) \
      Chrome/35.0.1916.114 Safari/537.36',
    'Cookie': 'AspxAutoDetectCookieSupport=1'
  }
  # Request类可以使用给定的header访问URL
  req = urllib.request.Request(url=img_src, headers=header) 
  try:
    response = urllib.request.urlopen(req) # 得到访问的网址
    filename = name + '.jpg'
    with open(filename, "wb") as f:
      content = response.read() # 获得图片
      f.write(content) # 保存图片
      response.close()
  except HTTPError as e: # HTTP响应异常处理
    print(e.reason)
  except URLError as e: # 一定要放到HTTPError之后,因为它包含了前者
    print(e.reason)
  except IncompleteRead or RemoteDisconnected as e: 
    if num_retries == 0: # 重连机制
      return
    else:
      requestImg(url, name, num_retries-1)

异常处理、重连机制与修饰器

其他

捕获异常

在批量爬取网页时,可能会遇到多种异常。需要注意的是,Python2 中的 urllib2 库对应 Python3 中的 urllib.error,而 httplib 库对应 http.client。具体的异常类映射关系可参考下表。

Python2 Pyhton3
urllib2.HTTPError urllib.error.HTTPError
urllib2.URLError urllib.error.URLError (HTTPError被包含其中)
httplib.IncompleteRead http.client.IncompleteRead
httplib.RemoteDisconnected http.client.RemoteDisconnected

重连机制

可以在函数参数中定义一个默认参数 num_retries 用于初始化重试次数。当发生特定异常时,将该参数值递减,并递归调用自身,从而实现基本的断线重连机制。

修饰器

修饰器模式是一种设计模式,允许在不修改目标函数源代码的前提下,在函数执行前后添加额外功能。


def clock(func): # 修饰器函数,对函数计时
  def clocked(*args):
    t0 = timeit.default_timer()
    result = func(*args)
    elapsed = timeit.default_timer() - t0
    name = func.__name__
    arg_str = ', '.join(repr(arg) for arg in args)
    print('[%0.8fs] %s(%s)' % (elapsed, name, arg_str))
    # print('%s(%s) -> %r [%0.8fs]' % (name, arg_str, result, elapsed))
    return result
  return clocked

上述代码展示了如何使用修饰器对函数运行时间进行计时。只需在需要计时的函数定义前添加相应的修饰器代码即可实现。


@clock

完整代码实现

完整代码


from urllib.error import HTTPError, URLError
from http.client import IncompleteRead, RemoteDisconnected
import timeit, time
import urllib.request
import socket
 
 
# timeout = 20
# socket.setdefaulttimeout(timeout) # 等待,防止被简单地反爬
 
 
def getUrls(path):
  urls = []
  with open(path,'r') as f:
    for line in f:
      urls.append(line.strip('\n'))
  return(urls)
 
 
def clock(func): # 修饰器函数,对函数计时
  def clocked(*args):
    t0 = timeit.default_timer()
    result = func(*args)
    elapsed = timeit.default_timer() - t0
    name = func.__name__
    arg_str = ', '.join(repr(arg) for arg in args)
    print('[%0.8fs] %s(%s)' % (elapsed, name, arg_str))
    # print('%s(%s) -> %r [%0.8fs]' % (name, arg_str, result, elapsed))
    return result
  return clocked
 
 
@clock
def requestImg(url, name, num_retries=3):
  img_src = url
  # print(img_src)
  header = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) \
    AppleWebKit/537.36 (KHTML, like Gecko) \
      Chrome/35.0.1916.114 Safari/537.36',
    'Cookie': 'AspxAutoDetectCookieSupport=1'
  }
  req = urllib.request.Request(url=img_src, headers=header)
  try:
    response = urllib.request.urlopen(req)
    filename = name + '.jpg'
    with open(filename, "wb") as f:
      content = response.read()
      f.write(content)
      response.close()
  except HTTPError as e:
    print(e.reason)
  except URLError as e:
    print(e.reason)
  except IncompleteRead or RemoteDisconnected as e:
    if num_retries == 0:
      return
    else:
      requestImg(url, name, num_retries-1)
 
 
 
if __name__ =='__main__':
  urls = getUrls('./'URLS.txt') # 换成你的URL文件路径
  nLines = len(urls)
  print(nLines)
  for index, value in enumerate(urls):
      requestImg(value, './'+str(index).zfill(6)) # zfill用来格式化数字:000001

以上关于 Python3 直接爬取图片 URL 并保存的示例即为全部内容,希望能为读者提供有价值的参考,并欢迎大家支持相关技术社区。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。