Scrapy学习: 下载与上传 aliyun oss

利用scrapy完成文件下载与上传
更新于: 2023-01-30 15:37:59

sdk oss2

使用 OSS Python SDK 完成常见操作,如创建存储空间(Bucket)、上传文件(Object)、下载文件等。

pip install oss2

常用操作

  • 登录
  • 上传
  • 下载
  • 删除

登录

import oss2

# 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
# Endpoint以杭州为例,其它Region请按实际情况填写。
bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')
# 实际场景(本机/environment)
auth = oss2.Auth(os.environ['ALIBABACLOUD_ACCESS_KEY_ID'],
                 os.environ['ALIBABACLOUD_ACCESS_KEY_SECRET'])
# 登录这个桶: oss://biotech-info-beta-hangzhou/
bucket = oss2.Bucket(auth, "biotech-info-beta-hangzhou")

上传文件

  • 上传文件
  • 上传字符串
  • 上传Bytes
  • 上传 Unicode
  • 上传 scream 流
# -*- coding: utf-8 -*-
import oss2

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

# 上传文件到OSS。
# <yourObjectName>由包含文件后缀,不包含Bucket名称组成的Object完整路径,例如abc/efg/123.jpg。
# <yourLocalFile>由本地文件路径加文件名包括后缀组成,例如/users/local/myfile.txt。
bucket.put_object_from_file('<yourObjectName>', '<yourLocalFile>')

# 上传字符串
bucket.put_object('exampleobject.txt', 'Hello OSS')
# 上传Bytes: 填写Object完整路径和Bytes内容。Object完整路径中不能包含Bucket名称。
bucket.put_object('exampleobject.txt', b'Hello OSS')
# 填写Object完整路径和Unicode字符。Object完整路径中不能包含Bucket名称。
bucket.put_object('exampleobject.txt', u'Hello OSS')

#填写网络流地址。
input = requests.get('http://www.aliyun.com')
# 填写Object完整路径。Object完整路径中不能包含Bucket名称。
bucket.put_object('exampleobject.txt', input)

下载文件

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

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

#下载OSS文件到本地文件。
# <yourObjectName>由包含文件后缀,不包含Bucket名称组成的Object完整路径,例如abc/efg/123.jpg。
# <yourLocalFile>由本地文件路径加文件名包括后缀组成,例如/users/local/myfile.txt。
bucket.get_object_to_file('<yourObjectName>', '<yourLocalFile>')

列举文件

# -*- coding: utf-8 -*-
import oss2
from itertools import islice

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

# oss2.ObjectIterator用于遍历文件。
for b in islice(oss2.ObjectIterator(bucket), 10):
    print(b.key)

删除文件

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

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

# <yourObjectName>表示删除OSS文件时需要指定包含文件后缀,不包含Bucket名称在内的完整路径,例如abc/efg/123.jpg。
bucket.delete_object('<yourObjectName>')

Scrapy 设置如下

  • settings.py 中添加 FILES_STORE = './downloads'
    • 加入 piplinesITEM_PIPELINES 中去
ITEM_PIPELINES = {
    # 'spider_ebi.pipelines.SpiderEbiPipeline': 300,
    'spider_ebi.pipelines.DownloadPipeline': 200
}

FILES_STORE = './downloads'
class DownloadPipeline(FilesPipeline):
    def file_path(self, request, response=None, info=None, item=None):
        url = request.url
        uri = urlparse(url)
        filename = uri.path.split('/')[-1]
        return f'assets/data/rbds/pdbs/{filename}'

    def _get_store(self, uri):
        # get the ali oss store object
        return AliOssStore(
            "oss-cn-hangzhou.aliyuncs.com",
            'ali.access_key_id',
            'ali.access_key_secret',
            'osspath',
        )

参考