首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用python (urllib/urllib 2)下载图像非常慢

使用python (urllib/urllib 2)下载图像非常慢
EN

Stack Overflow用户
提问于 2019-07-05 02:40:00
回答 2查看 1.9K关注 0票数 1

我正在尝试从scryfall.com下载收集卡的图片。他们提供这个json文件中关于每一张卡的所有信息(包括它的图像的url )。因此,我编写了一个代码,读取json文件中的每个url,并调度保存它。问题是,代码的请求部分需要5分钟以上的时间才能运行,我不知道为什么。(我正在获取的每幅图像的大小小于100 on,并在浏览器上瞬间打开)

我已经尝试过urllib.urlretrieve,urllib2.urlopen,而且都是一样的。尝试在python2和python3上运行它。

没有错误信息,代码实际上是有效的,只是花费了很长时间才能继续下去。

编辑:

代码语言:javascript
复制
a=open("cards.json")
b=a.read()

data=[]
data.append(b)

count=0
for elem in data:
    try:
        content=json.loads(elem)
    except:
        print content
        exit()
    for j in content:
        count=count+1
        if j['layout']=='normal' and j['digital']==False:
            url=str(j['image_uris']['normal'])
            final=url[url.find('normal')+6:]
            print (url)
            print("a")
            i1=urllib.urlretrieve(url)
            print("b")
            i2=i1.read()
            file=open(str(count),'wb')
            file.write(i2)
            file.close()


        if count>5:
            exit()

edit2:指向我使用的json的链接:https://archive.scryfall.com/json/scryfall-default-cards.json

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-05 03:45:36

此代码在不到1秒内获得图像。

代码语言:javascript
复制
import requests

url = 'https://img.scryfall.com/cards/normal/front/2/c/2c23b39b-a4d6-4f10-8ced-fa4b1ed2cf74.jpg?1561567651'
r = requests.get(url)

with open('image.jpg', 'wb') as f:
    f.write(r.content)

与此代码相同

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

url = 'https://img.scryfall.com/cards/normal/front/2/c/2c23b39b-a4d6-4f10-8ced-fa4b1ed2cf74.jpg?1561567651'
urllib.request.urlretrieve(url, 'image.jpg')

我没有检查更多的图片。也许问题是当服务器在短时间内看到来自一个IP的太多请求时,它会阻止它们。

编辑:我用这段代码下载了10张图片并显示时间

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

print('load json')

start = time.time()
content = json.loads(open("scryfall-default-cards.json").read())
end = time.time()
print('time:', end-start)

# ---

start = time.time()

all_urls = len(content)

urls_to_download = 0
for item in content:
    if item['layout'] == 'normal' and item['digital'] is False:
        urls_to_download += 1

print('urls:', 

all_urls, urls_to_download)

end = time.time()
print('time:', end-start)

# ----

start = time.time()
count = 0
for item in content:
    if item['layout'] == 'normal' and item['digital'] is False:
        count += 1
        url = item['image_uris']['normal']
        name = url.split('?')[0].split('/')[-1]
        print(name)
        urllib.request.urlretrieve(url, 'imgs/' + name)
    if count >= 10:
        break
end = time.time()
print('time:', end-start)

结果

代码语言:javascript
复制
load json
time: 3.9926743507385254
urls: 47237 41805
time: 0.054879188537597656
2c23b39b-a4d6-4f10-8ced-fa4b1ed2cf74.jpg
37bc0128-a8d0-477c-abcf-2bdc9e38b872.jpg
2ae1bb79-a931-4d2e-9cc9-a06862dc5cde.jpg
4889a668-0f01-4447-ad2e-91b329258f22.jpg
5b13ba5a-f4b0-420a-9e4f-a65e57721fa4.jpg
893b309d-5e8f-47fa-9f54-eaf16a5f96e3.jpg
27d30285-7729-4130-a768-71867aefe9b3.jpg
783616d6-e3ea-43fd-97eb-6e4c5a2c711f.jpg
cc101b90-3e17-4beb-a606-3e76088e362c.jpg
36da00e3-3ef6-4ad5-a53d-e71cfdafc1e6.jpg
42e1033b-383e-49b4-875f-ccdc94e08c9d.jpg
time: 2.656561851501465
票数 5
EN

Stack Overflow用户

发布于 2019-07-05 03:48:45

这是一种非常简单有效的方法,可以非常快速地获取这些图像。我没有计时,但也不到一秒钟。

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

url = 'https://img.scryfall.com/cards/normal/front/2/c/2c23b39b-a4d6-4f10-8ced-fa4b1ed2cf74.jpg?1561567651'

f = open('00000001.jpg', 'wb')
f.write(request.urlopen(url).read())
f.close()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56895913

复制
相关文章

相似问题

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