python爬虫通过图片原始url请求图片然后上传到oss中并返回图片新的url

简单上传提供上传字符串、上传Bytes、上传Unicode、上传网络流以及上传本地文件五种形式。

通过bucket.put_object方法上传文件。上传方法支持多种类型的输入源,输入源有如下几种类型:

类型 上传方式
字符串 直接上传
Bytes 直接上传
Unicode 自动转换为UTF-8编码的Bytes进行上传
本地文件 文件对象(File Object),必须以二进制方式打开(如“rb”模式)
网络流 可迭代对象(Iterable),以Chunked Encoding的方式上传

说明 试图添加文件(Object)时,如果存储空间(Bucket)中已经存在同名文件且对该文件有访问权限,则新添加的文件将覆盖原来的文件,文件添加成功后返回200 OK。

PutObject的更多详情,请参见细节分析

上传字符串

以下代码用于上传字符串:

# -*- coding: utf-8 -*-
import oss2

# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
# Endpoint以杭州为例,其它Region请按实际情况填写。
bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')

# 上传文件
# 如果需要上传文件时设置文件存储类型与访问权限,请在put_object中设置相关headers, 参考如下。
# headers = dict()
# headers["x-oss-storage-class"] = "Standard"
# headers["x-oss-object-acl"] = oss2.OBJECT_ACL_PRIVATE
# result = bucket.put_object('<yourObjectName>', 'content of object', headers=headers)
result = bucket.put_object('<yourObjectName>', 'content of object')

# HTTP返回码。
print('http status: {0}'.format(result.status))
# 请求ID。请求ID是请求的唯一标识,强烈建议在程序日志中添加此参数。
print('request_id: {0}'.format(result.request_id))
# ETag是put_object方法返回值特有的属性。
print('ETag: {0}'.format(result.etag))
# HTTP响应头部。
print('date: {0}'.format(result.headers['date']))

上传Bytes

以下代码用于上传Bytes:

# -*- coding: utf-8 -*-

import oss2

# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
# Endpoint以杭州为例,其它Region请按实际情况填写。
bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')

bucket.put_object('<yourObjectName>', b'content of object')

上传Unicode

以下代码用于上传Unicode:

# -*- coding: utf-8 -*-
import oss2

# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
# Endpoint以杭州为例,其它Region请按实际情况填写。
bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')

bucket.put_object('<yourObjectName>', u'content of object')

上传网络流

以下代码用于上传网络流:

# -*- coding: utf-8 -*-
import oss2
import requests

# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
# Endpoint以杭州为例,其它Region请按实际情况填写。
bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')

# requests.get返回的是一个可迭代对象(Iterable),此时Python SDK会通过Chunked Encoding方式上传。
input = requests.get('http://www.aliyun.com')
bucket.put_object('<yourObjectName>', input)

上传本地文件

以下代码用于上传本地文件:

# -*- coding: utf-8 -*-
import oss2

# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
# Endpoint以杭州为例,其它Region请按实际情况填写。
bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')

# 必须以二进制的方式打开文件,因为需要知道文件包含的字节数。
with open('<yourLocalFile>', 'rb') as fileobj:
    # Seek方法用于指定从第1000个字节位置开始读写。上传时会从您指定的第1000个字节位置开始上传,直到文件结束。
    fileobj.seek(1000, os.SEEK_SET)
    # Tell方法用于返回当前位置。
    current = fileobj.tell()
    bucket.put_object('<yourObjectName>', fileobj)

Python SDK还提供了一个更加便捷的方法用于上传本地文件:

bucket.put_object_from_file('<yourObjectName>', '<yourLocalFile>')

爬虫时处理图片url:
上传到阿里oss,然后生成返回新的oss的图片的链接

aliyun:
oss:
endpoint: oss-cn-hangzhou.aliyuncs.com
accessKeyId: 改成自己的id
accessKeySecret: 改成自己的秘钥
bucketName: mall-qsd

# -*- coding: utf-8 -*-
"""
 @Time   : 2020/10/29 9:54 
 @Athor   : LinXiao
 @功能   :
"""
# ------------------------------
import datetime
import io
import random
import string
import uuid

import requests
import oss2

# 储存的路径
# filePath="/house/2020-10-29/xxxx.jpg"  # xxxxx  wei
# # 指定Bucket实例,所有文件相关的方法都需要通过Bucket实例来调用。
# bucket=oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), endpoint, bucket_name)

def parser(img, imageName, dirpath):
    endpoint='http://oss-cn-chengdu.aliyuncs.com'
    access_key_id='LTAI4FzinZX9M4**************'
    access_key_secret='x97sjRShD***************'
    bucket_name='fzp-*****************'
    # 指定Bucket实例,所有文件相关的方法都需要通过Bucket实例来调用。
    bucket=oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), endpoint, bucket_name)
    result=bucket.put_object(f'{dirpath}/{imageName}', img.getvalue())
    print('图片上传oss success!')
    return result.status



def main(url):
    # 测试的阿里云oss储存路径,正式的为house
    dirpath='house-test'
    domain='http://oss.fapai******fang.top/'

    now=datetime.datetime.now()
    nonce=str(uuid.uuid4())

    random_name=now.strftime("%Y-%m-%d") + "/" + nonce

    imageName='{}.jpg'.format(random_name)

    img=io.BytesIO(requests.get(url, timeout=300).content)

    statusCode=parser(img, imageName, dirpath)

    if statusCode == 200:
        new_oss_url=domain + dirpath + '/' + imageName
        print(new_oss_url)
        # print(type(new_oss_url))   # <class 'str'>
        return new_oss_url


if __name__ == '__main__':
    # url='https://img.alicdn.com/bao/uploaded/i3/TB1LMGLiP39YK4jSZPctrBrUFXa_460x460.jpg'
    url='https://img.alicdn.com/bao/uploaded/i4/O1CN01CW2jEc1pOLaFef85M_!!0-paimai.jpg_460x460.jpg'

    main(url)

图片的其他处理方式示例:

<main style="box-sizing: border-box; display: block;">

| # -*- coding: utf-8 -*- |
|  |  |
|  | import json |
|  | import os |
|  |  |
|  | from PIL import Image |
|  |  |
|  | import oss2 |
|  |  |
|  |  |
|  | # 以下代码展示了图片服务的基本用法。更详细应用请参看官网文档 https://help.aliyun.com/document_detail/32206.html |
|  |  |
|  | # 首先初始化AccessKeyId、AccessKeySecret、Endpoint等信息。 |
|  | # 通过环境变量获取,或者把诸如“<你的AccessKeyId>”替换成真实的AccessKeyId等。 |
|  | # |
|  | # 以杭州区域为例,Endpoint可以是: |
|  | # http://oss-cn-hangzhou.aliyuncs.com |
|  | # https://oss-cn-hangzhou.aliyuncs.com |
|  | # 分别以HTTP、HTTPS协议访问。 |
|  | access_key_id = os.getenv('OSS_TEST_ACCESS_KEY_ID', '<你的AccessKeyId>') |
|  | access_key_secret = os.getenv('OSS_TEST_ACCESS_KEY_SECRET', '<你的AccessKeySecret>') |
|  | bucket_name = os.getenv('OSS_TEST_BUCKET', '<你的Bucket>') |
|  | endpoint = os.getenv('OSS_TEST_ENDPOINT', '<你的访问域名>') |
|  |  |
|  |  |
|  | # 确认上面的参数都填写正确了 |
|  | for param in (access_key_id, access_key_secret, bucket_name, endpoint): |
|  | assert '<' not in param, '请设置参数:' + param |
|  |  |
|  | def get_image_info(image_file): |
|  | """获取本地图片信息 |
|  | :param str image_file: 本地图片 |
|  | :return tuple: a 3-tuple(height, width, format). |
|  | """ |
|  | im = Image.open(image_file) |
|  | return im.height, im.width, im.format |
|  |  |
|  | # 创建Bucket对象,所有Object相关的接口都可以通过Bucket对象来进行 |
|  | bucket = oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), endpoint, bucket_name) |
|  |  |
|  | key = 'example.jpg' |
|  | new_pic = 'new-example.jpg' |
|  |  |
|  | # 上传示例图片 |
|  | bucket.put_object_from_file(key, 'example.jpg') |
|  |  |
|  | # 获取图片信息 |
|  | result = bucket.get_object(key, process='image/info') |
|  |  |
|  | json_content = result.read() |
|  | decoded_json = json.loads(oss2.to_unicode(json_content)) |
|  | assert int(decoded_json['ImageHeight']['value']) == 267 |
|  | assert int(decoded_json['ImageWidth']['value']) == 400 |
|  | assert int(decoded_json['FileSize']['value']) == 21839 |
|  | assert decoded_json['Format']['value'] == 'jpg' |
|  |  |
|  | # 图片缩放 |
|  | process = "image/resize,m_fixed,w_100,h_100" |
|  | bucket.get_object_to_file(key, new_pic, process=process) |
|  | info = get_image_info(new_pic) |
|  | assert info[0] == 100 |
|  | assert info[1] == 100 |
|  | assert info[2] == 'JPEG' |
|  |  |
|  | # 图片裁剪 |
|  | process = "image/crop,w_100,h_100,x_100,y_100,r_1" |
|  | bucket.get_object_to_file(key, new_pic, process=process) |
|  | info = get_image_info(new_pic) |
|  | assert info[0] == 100 |
|  | assert info[1] == 100 |
|  | assert info[2] == 'JPEG' |
|  |  |
|  | # 图片旋转 |
|  | process = "image/rotate,90" |
|  | bucket.get_object_to_file(key, new_pic, process=process) |
|  | info = get_image_info(new_pic) |
|  | assert info[0] == 400 |
|  | assert info[1] == 267 |
|  | assert info[2] == 'JPEG' |
|  |  |
|  | # 图片锐化 |
|  | process = "image/sharpen,100" |
|  | bucket.get_object_to_file(key, new_pic, process=process) |
|  | info = get_image_info(new_pic) |
|  | assert info[0] == 267 |
|  | assert info[1] == 400 |
|  | assert info[2] == 'JPEG' |
|  |  |
|  | # 图片加文字水印 |
|  | process = "image/watermark,text_SGVsbG8g5Zu-54mH5pyN5YqhIQ" |
|  | bucket.get_object_to_file(key, new_pic, process=process) |
|  | info = get_image_info(new_pic) |
|  | assert info[0] == 267 |
|  | assert info[1] == 400 |
|  | assert info[2] == 'JPEG' |
|  |  |
|  | # 图片格式转换 |
|  | process = "image/format,png" |
|  | bucket.get_object_to_file(key, new_pic, process=process) |
|  | info = get_image_info(new_pic) |
|  | assert info[0] == 267 |
|  | assert info[1] == 400 |
|  | assert info[2] == 'PNG' |
|  |  |
|  | # 删除示例图片 |
|  | bucket.delete_object(key) |
|  | # 清除本地文件 |
|  | os.remove(new_pic) |

<details class="details-reset details-overlay details-overlay-dark" id="jumpto-line-details-dialog" style="box-sizing: border-box; display: block;"><summary data-hotkey="l" aria-label="Jump to line" role="button" style="box-sizing: border-box; display: list-item; cursor: pointer; list-style: none;"></summary></details>

</main>

[](https://github.com/ "GitHub")

python_oss 的githup 地址:
https://github.com/aliyun/aliyun-oss-python-sdk

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,277评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,689评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,624评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,356评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,402评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,292评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,135评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,992评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,429评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,636评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,785评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,492评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,092评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,723评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,858评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,891评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,713评论 2 354