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)