首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从IPFS下载图片

从IPFS下载图片
EN

Stack Overflow用户
提问于 2021-08-26 14:42:01
回答 1查看 3.5K关注 0票数 2

我有一组很好的以这种格式保存的URL。

代码语言:javascript
复制
Number  Link
0   https://ipfs.io/ipfs/QmRRPWG96cmgTn2qSzjwr2qvfNEuhunv6FNeMFGa9bx6mQ
1   https://ipfs.io/ipfs/QmPbxeGcXhYQQNgsC6a36dDyYUcHgMLnGKnF8pVFmGsvqi
2   https://ipfs.io/ipfs/QmcJYkCKK7QPmYWjp4FD2e3Lv5WCGFuHNUByvGKBaytif4
3   https://ipfs.io/ipfs/QmYxT4LnK8sqLupjbS6eRvu1si7Ly2wFQAqFebxhWntcf6
4   https://ipfs.io/ipfs/QmSg9bPzW9anFYc3wWU5KnvymwkxQTpmqcRSfYj7UmiBa7
5   https://ipfs.io/ipfs/QmNwbd7ctEhGpVkP8nZvBBQfiNeFKRdxftJAxxEdkUKLcQ
6   https://ipfs.io/ipfs/QmWBgfBhyVmHNhBfEQ7p1P4Mpn7pm5b8KgSab2caELnTuV
7   https://ipfs.io/ipfs/QmRsJLrg27GQ1ZWyrXZFuJFdU5bapfzsyBfm3CAX1V1bw6

我试图使用一个循环循环遍历所有的链接并保存文件。

代码语言:javascript
复制
import urllib.request

for x,y in zip(link, num):
    url = str(x)
    name = str(y)
    filename = "%s.png" % name   
    urllib.request.urlretrieve(url, filename)

每次运行这段代码时,我都会得到这个错误。

代码语言:javascript
复制
URLError: <urlopen error [WinError 10054] An existing connection was forcibly closed by the remote host>

奇怪的是,如果我只在一个URL上运行代码,那么它就能正常工作。

代码语言:javascript
复制
import urllib.request

name = 1
filename = "%s.png" % name   
urllib.request.urlretrieve("https://ipfs.io/ipfs/QmcJYkCKK7QPmYWjp4FD2e3Lv5WCGFuHNUByvGKBaytif4", filename)

如何解决这个问题,使代码在没有错误的循环中运行?

谢谢

编辑

下面是一些适用于1张图像的代码

代码语言:javascript
复制
import pandas as pd 
import urllib.request

links = [['number', 'link'], ['1', 'https://ipfs.io/ipfs/QmPbxeGcXhYQQNgsC6a36dDyYUcHgMLnGKnF8pVFmGsvqi'], ['2', 'https://ipfs.io/ipfs/QmcJYkCKK7QPmYWjp4FD2e3Lv5WCGFuHNUByvGKBaytif4'], ['3', 'https://ipfs.io/ipfs/QmYxT4LnK8sqLupjbS6eRvu1si7Ly2wFQAqFebxhWntcf6']]
data = pd.DataFrame(links)

link = data.get('Link', None) 
num = data.get('Number', None)


name = 1
filename = "%s.png" % name   
urllib.request.urlretrieve("https://ipfs.io/ipfs/QmYxT4LnK8sqLupjbS6eRvu1si7Ly2wFQAqFebxhWntcf6", filename)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-26 15:20:39

你被IPFS服务勒死了。您需要实现API速率限制(或者查看服务是否有一个额外的选项,允许您支付更高的API请求费率)。

这里有一种实现客户端速率限制的方法,使用指数退避/重试:

  1. 此重试代码保存为retry.py
  2. 修正了v2在retry.py中的几个问题(except ExceptionToCheck as e:在第32行,print(msg)在第37行)
  3. 按以下方式修改客户端代码
代码语言:javascript
复制
import urllib.request
from retry import retry

LINKS = [
    "https://ipfs.io/ipfs/QmRRPWG96cmgTn2qSzjwr2qvfNEuhunv6FNeMFGa9bx6mQ",
    "https://ipfs.io/ipfs/QmPbxeGcXhYQQNgsC6a36dDyYUcHgMLnGKnF8pVFmGsvqi",
    "https://ipfs.io/ipfs/QmcJYkCKK7QPmYWjp4FD2e3Lv5WCGFuHNUByvGKBaytif4",
    "https://ipfs.io/ipfs/QmYxT4LnK8sqLupjbS6eRvu1si7Ly2wFQAqFebxhWntcf6",
    "https://ipfs.io/ipfs/QmSg9bPzW9anFYc3wWU5KnvymwkxQTpmqcRSfYj7UmiBa7",
    "https://ipfs.io/ipfs/QmNwbd7ctEhGpVkP8nZvBBQfiNeFKRdxftJAxxEdkUKLcQ",
    "https://ipfs.io/ipfs/QmWBgfBhyVmHNhBfEQ7p1P4Mpn7pm5b8KgSab2caELnTuV",
    "https://ipfs.io/ipfs/QmRsJLrg27GQ1ZWyrXZFuJFdU5bapfzsyBfm3CAX1V1bw6",
]

@retry(urllib.error.URLError, tries=4)
def download(index, url):
    filename = "%s.png" % index
    urllib.request.urlretrieve(url, filename)

def main():
    for index, link in enumerate(LINKS):
        print(index, link)
        download(index, link)

if __name__ == '__main__':
    main()

我不需要重试就测试了这段代码,它被节流了(正如预期的那样)。然后我添加了重试装饰器,它成功地完成了(包括一些预期的重试)。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68940662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档