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)