python - 在 python 3中,如何下载带有 https URL的图像?

  显示原文与译文双语对照的内容
113 0

我试图在 python 中创建一个简短的海量下载脚本,以在本地存储图像列表。

对于 http 图像 url,它工作得非常好,但是无法下载任何具有 https url的图像。有问题的代码行是:

import urllib.request
urllib.request.urlretrieve(url, filename)

例如,https://cdn.discordapp.com/attachments/299398003486097412/303580387786096641/FB_IMG_1490534565948.jpg结果HTTP Error 403: Forbidden,以及任何其他 https 映像。

这让我有两个问题:

  • 我如何使用 python 下载这样的图像?
  • 为什么图片甚至有 https的url,如果它们基本上只是文件?

编辑:

下面是堆栈跟踪:

Traceback (most recent call last):
 File"img_down.py", line 52, in <module>
 main()
 File"img_down.py", line 38, in main
 save_img(d, l)
 File"img_down.py", line 49, in save_img
 stream = read_img(url)
 File"img_down.py", line 42, in read_img
 with urllib.request.urlopen(url) as response:
 File"D:UsersJanAppDataLocalProgramsPythonPython36-32liburllibrequest.py", line 223, in urlopen
 return opener.open(url, data, timeout)
 File"D:UsersJanAppDataLocalProgramsPythonPython36-32liburllibrequest.py", line 532, in open
 response = meth(req, response)
 File"D:UsersJanAppDataLocalProgramsPythonPython36-32liburllibrequest.py", line 642, in http_response
 'http', request, response, code, msg, hdrs)
 File"D:UsersJanAppDataLocalProgramsPythonPython36-32liburllibrequest.py", line 570, in error
 return self._call_chain(*args)
 File"D:UsersJanAppDataLocalProgramsPythonPython36-32liburllibrequest.py", line 504, in _call_chain
 result = func(*args)
 File"D:UsersJanAppDataLocalProgramsPythonPython36-32liburllibrequest.py", line 650, in http_error_default
 raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 403: Forbidden
时间:原作者:0个回答

105 2

可能会帮助你。

我把这个脚本,但从未完成( 最终意图是让它每天自动运行)

但是,为了不是推迟答案的人,下面是你感兴趣的代码:

 def downloadimg(self):
 import datetime
 imgurl = self.getdailyimg();
 imgfilename = datetime.datetime.today().strftime('%Y%m%d') + '_' + imgurl.split('/')[-1]
 with open(IMGFOLDER + imgfilename, 'wb') as f:
 f.write(self.readimg(imgurl))

希望能帮助你 !

编辑

PS: 使用 python3

完整脚本

#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
IMGFOLDER = os.getcwd() + '/images/'
class BingImage(object):
"""docstring for BingImage"""
 BINGURL = 'http://www.bing.com/'
 JSONURL = 'HPImageArchive.aspx?format=js&idx=0&n=1&mkt=pt-BR'
 LASTIMG = None
 def __init__(self):
 super(BingImage, self).__init__()
 try:
 self.downloadimg()
 except:
 pass
 def getdailyimg(self):
 import json
 import urllib.request
 with urllib.request.urlopen(self.BINGURL + self.JSONURL) as response:
 rawjson = response.read().decode('utf-8')
 parsedjson = json.loads(rawjson)
 return self.BINGURL + parsedjson['images'][0]['url'][1:]
 def downloadimg(self):
 import datetime
 imgurl = self.getdailyimg();
 imgfilename = datetime.datetime.today().strftime('%Y%m%d') + '_' + imgurl.split('/')[-1]
 with open(IMGFOLDER + imgfilename, 'wb') as f:
 f.write(self.readimg(imgurl))
 self.LASTIMG = IMGFOLDER + imgfilename
 def checkfolder(self):
 d = os.path.dirname(IMGFOLDER)
 if not os.path.exists(d):
 os.makedirs(d)
 def readimg(self, url):
 import urllib.request
 with urllib.request.urlopen(url) as response:
 return response.read()
def DefineBackground(src):
 import platform
 if platform.system() == 'Linux':
 MAINCMD ="gsettings set org.gnome.desktop.background picture-uri"
 os.system(MAINCMD + ' file://' + src)
def GetRandomImg():
"""Return a random image already downloaded from the images folder"""
 import random
 f = []
 for (dirpath, dirnames, filenames) in os.walk(IMGFOLDER):
 f.extend(filenames)
 break
 return IMGFOLDER + random.choice(f)
if __name__ == '__main__':
 # get a new today's image from Bing
 img = BingImage()
 # check whether a new image was get or not
 if(img.LASTIMG):
 DefineBackground(img.LASTIMG)
 else:
 DefineBackground(GetRandomImg())
 print('Background defined')
原作者:
145 4

希望这有帮助

import requests
f = open('FB_IMG_1490534565948.jpg','wb') #create file locally
f.write(requests.get('https://cdn.discordapp.com/attachments/299398003486097412/303580387786096641/FB_IMG_1490534565948.jpg').content) #write image content to this file 
f.close()
原作者:
...