Python 使用requests下载图片的方法及示例代码

Python中可以使用requests模块执行GET和POST请求,requests 继承了urllib2的所有特性。requests支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动确定响应内容的编码,支持国际化的 URL 和 POST 数据自动编码。本文主要介绍Python 中使用requests下载图片的方法及示例代码。

1、使用shutil.copyfileobj()实现

shutil.copyfileobj()可以从请求中获取类文件对象并将其复制到文件中。避免一次将整个内容读入内存。代码如下,

import shutil

import requests

url = 'http://example.com/img.png'
response = requests.get(url, stream=True)
with open('img.png', 'wb') as out_file:
    shutil.copyfileobj(response.raw, out_file)
del response

2、一次性保存图片

可以将response.content内容一次性直接保存到文件,适合不是很大的文件,代码如下,

import requests

url = 'http://example.com/img.png'
response = requests.get(url)
if response.status_code == 200:
    with open("img.png", 'wb') as f:
        f.write(response.content)

3、使用chunk方式读取保存

使用iter_content()循环多次写入文件,避免一次性写入占用大量内存,适合大文件使用。代码如下,

import requests
import profile

image_name = 'test1.jpg'
url = 'http://example.com/image.jpg'

r = requests.get(url, stream=True)
with open(image_name, 'wb') as f:
    for chunk in r.iter_content(chunk_size=1000000):#指定chunk_size,第次循环读取的大小
        f.write(chunk)

4、使用PIL的Image实现

可以使用PIL的Image和StringIO来保存图片,代码如下,

import requests
from StringIO import StringIO
from PIL import Image


image_name = 'cjavapy.jpg'
url = 'http://example.com/image.jpg'

r = requests.get(url)
 
i = Image.open(StringIO(r.content))
i.save(image_name)

5、使用requests批量下载网页中的图片

使用requests获取html内容,通正则表达式获取图片url地址,然后在使用requests来下载图片,代码如下,

# coding:utf-8
# 引入requests包和正则表达式包re
import requests
import re
 
# 自定义下载页面函数
def load_page(url):
    response=requests.get(url)
    data=response.content
    return data
 
# 自定义保存页面图片函数
def get_image(html):
    regx=r'http://[\S]*jpg'  # 定义图片正则表达式
    pattern=re.compile(regx) # 编译表达式构造匹配模式
    get_images=re.findall(pattern,repr(html)) # 在页面中匹配图片链接
 
    num=1
    # 遍历匹配成功的链接
    for img in  get_images:
        image=load_page(img) #根据图片链接,下载图片链接
        # 将下载的图片保存到对应的文件夹中
        with open('./spider_picture/%s.jpg' % num,'wb') as fb:
            fb.write(image)
            print("正在下载第%s张图片" %num)
            num=num+1
    print("下载完成!")
 
# 定义爬取页面的链接
url ='http://example.com/cjavapy.html'
# 调用load_page函数,下载页面内容
html = load_page(url)
# 在页面中,匹配图片链接,并将图片下载下来,保存到对应文件夹
get_image(html)

推荐阅读
cjavapy编程之路首页