Jan*_*tke 2 python https image download
我试图在Python中制作一个简短的大规模下载程序脚本,以便在本地存储图像列表.
它对于http图像网址非常适用,但无法使用https网址下载任何图像.有问题的代码行是:
import urllib.request
urllib.request.urlretrieve(url, filename)
Run Code Online (Sandbox Code Playgroud)
例如,
https://cdn.discordapp.com/attachments/299398003486097412/303580387786096641/FB_IMG_1490534565948.jpg结果HTTP Error 403: Forbidden,以及任何其他https图像.
这让我有两个问题:
https基本上只是文件,为什么图像甚至都有网址?这是堆栈跟踪:
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:\Users\Jan\AppData\Local\Programs\Python\Python36-32\lib\urllib\request.py", line 223, in urlopen
return opener.open(url, data, timeout)
File "D:\Users\Jan\AppData\Local\Programs\Python\Python36-32\lib\urllib\request.py", line 532, in open
response = meth(req, response)
File "D:\Users\Jan\AppData\Local\Programs\Python\Python36-32\lib\urllib\request.py", line 642, in http_response
'http', request, response, code, msg, hdrs)
File "D:\Users\Jan\AppData\Local\Programs\Python\Python36-32\lib\urllib\request.py", line 570, in error
return self._call_chain(*args)
File "D:\Users\Jan\AppData\Local\Programs\Python\Python36-32\lib\urllib\request.py", line 504, in _call_chain
result = func(*args)
File "D:\Users\Jan\AppData\Local\Programs\Python\Python36-32\lib\urllib\request.py", line 650, in http_error_default
raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 403: Forbidden
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助.
import requests
with open('FB_IMG_1490534565948.jpg', 'wb') as f:
f.write(requests.get('https://url/to/image.jpg').content)
Run Code Online (Sandbox Code Playgroud)
可以帮助你...
我制作了这个脚本,但从未完成(最终目的是让它每天自动运行)
但为了避免成为那种推迟答案的人,以下是您感兴趣的代码:
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))
Run Code Online (Sandbox Code Playgroud)
希望它能帮助你!
已编辑
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')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12071 次 |
| 最近记录: |