通过 urllib 和 python 下载图片
- 2024-12-31 08:38:00
- admin 原创
- 42
问题描述:
因此,我尝试编写一个 Python 脚本,用于下载网络漫画并将其放在桌面上的文件夹中。我在这里找到了一些类似的程序,它们可以执行类似的操作,但都不是我需要的。我发现最相似的程序就在这里(http://bytes.com/topic/python/answers/850927-problem-using-urllib-download-images)。我尝试使用此代码:
>>> import urllib
>>> image = urllib.URLopener()
>>> image.retrieve("http://www.gunnerkrigg.com//comics/00000001.jpg","00000001.jpg")
('00000001.jpg', <httplib.HTTPMessage instance at 0x1457a80>)
然后我在电脑上搜索文件“00000001.jpg”,但我找到的只是它的缓存图片。我甚至不确定它是否将文件保存到了我的电脑中。一旦我理解了如何下载文件,我想我就知道如何处理剩下的事情了。基本上只需使用 for 循环并在“00000000”.“jpg”处拆分字符串,然后将“00000000”递增到最大数字,我必须以某种方式确定这个数字。有没有关于如何正确下载文件的最佳方法的建议?
谢谢!
编辑 6/15/10
这是完成的脚本,它将文件保存到您选择的任何目录中。出于某种奇怪的原因,文件没有下载,但还是下载了。任何关于如何清理的建议都将不胜感激。我目前正在研究如何找出网站上存在的许多漫画,这样我就可以只获取最新的漫画,而不是在出现一定数量的异常后让程序退出。
import urllib
import os
comicCounter=len(os.listdir('/file'))+1 # reads the number of files in the folder to start downloading at the next comic
errorCount=0
def download_comic(url,comicName):
"""
download a comic in the form of
url = http://www.example.com
comicName = '00000000.jpg'
"""
image=urllib.URLopener()
image.retrieve(url,comicName) # download comicName at URL
while comicCounter <= 1000: # not the most elegant solution
os.chdir('/file') # set where files download to
try:
if comicCounter < 10: # needed to break into 10^n segments because comic names are a set of zeros followed by a number
comicNumber=str('0000000'+str(comicCounter)) # string containing the eight digit comic number
comicName=str(comicNumber+".jpg") # string containing the file name
url=str("http://www.gunnerkrigg.com//comics/"+comicName) # creates the URL for the comic
comicCounter+=1 # increments the comic counter to go to the next comic, must be before the download in case the download raises an exception
download_comic(url,comicName) # uses the function defined above to download the comic
print url
if 10 <= comicCounter < 100:
comicNumber=str('000000'+str(comicCounter))
comicName=str(comicNumber+".jpg")
url=str("http://www.gunnerkrigg.com//comics/"+comicName)
comicCounter+=1
download_comic(url,comicName)
print url
if 100 <= comicCounter < 1000:
comicNumber=str('00000'+str(comicCounter))
comicName=str(comicNumber+".jpg")
url=str("http://www.gunnerkrigg.com//comics/"+comicName)
comicCounter+=1
download_comic(url,comicName)
print url
else: # quit the program if any number outside this range shows up
quit
except IOError: # urllib raises an IOError for a 404 error, when the comic doesn't exist
errorCount+=1 # add one to the error count
if errorCount>3: # if more than three errors occur during downloading, quit the program
break
else:
print str("comic"+ ' ' + str(comicCounter) + ' ' + "does not exist") # otherwise say that the certain comic number doesn't exist
print "all comics are up to date" # prints if all comics are downloaded
解决方案 1:
Python 2
使用urllib.urlretrieve
import urllib
urllib.urlretrieve("http://www.gunnerkrigg.com//comics/00000001.jpg", "00000001.jpg")
Python 3
使用urllib.request.urlretrieve(Python 3 旧接口的一部分,工作原理完全相同)
import urllib.request
urllib.request.urlretrieve("http://www.gunnerkrigg.com//comics/00000001.jpg", "00000001.jpg")
解决方案 2:
Python 2:
import urllib
f = open('00000001.jpg','wb')
f.write(urllib.urlopen('http://www.gunnerkrigg.com//comics/00000001.jpg').read())
f.close()
Python 3:
import urllib.request
f = open('00000001.jpg','wb')
f.write(urllib.request.urlopen('http://www.gunnerkrigg.com//comics/00000001.jpg').read())
f.close()
解决方案 3:
仅供记录,使用请求库。
import requests
f = open('00000001.jpg','wb')
f.write(requests.get('http://www.gunnerkrigg.com//comics/00000001.jpg').content)
f.close()
虽然它应该检查 request.get() 错误。
解决方案 4:
对于 Python 3,你需要导入import urllib.request
:
import urllib.request
urllib.request.urlretrieve(url, filename)
欲了解更多信息,请查看链接
解决方案 5:
Python 3 版本的@DiGMi 的答案:
from urllib import request
f = open('00000001.jpg', 'wb')
f.write(request.urlopen("http://www.gunnerkrigg.com/comics/00000001.jpg").read())
f.close()
解决方案 6:
我找到了这个答案,并以更可靠的方式对其进行了编辑
def download_photo(self, img_url, filename):
try:
image_on_web = urllib.urlopen(img_url)
if image_on_web.headers.maintype == 'image':
buf = image_on_web.read()
path = os.getcwd() + DOWNLOADED_IMAGE_PATH
file_path = "%s%s" % (path, filename)
downloaded_image = file(file_path, "wb")
downloaded_image.write(buf)
downloaded_image.close()
image_on_web.close()
else:
return False
except:
return False
return True
由此,您在下载时永远不会获得任何其他资源或异常。
解决方案 7:
最简单的方法是.read()
读取部分或全部响应,然后将其写入在已知良好位置打开的文件中。
解决方案 8:
如果您知道这些文件位于dir
网站的同一目录中site
,并且具有以下格式:filename_01.jpg,...,filename_10.jpg,则下载所有文件:
import requests
for x in range(1, 10):
str1 = 'filename_%2.2d.jpg' % (x)
str2 = 'http://site/dir/filename_%2.2d.jpg' % (x)
f = open(str1, 'wb')
f.write(requests.get(str2).content)
f.close()
解决方案 9:
也许您需要“用户代理”:
import urllib2
opener = urllib2.build_opener()
opener.addheaders = [('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36')]
response = opener.open('http://google.com')
htmlData = response.read()
f = open('file.txt','w')
f.write(htmlData )
f.close()
解决方案 10:
使用 urllib,您可以立即完成此操作。
import urllib.request
opener=urllib.request.build_opener()
opener.addheaders=[('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1941.0 Safari/537.36')]
urllib.request.install_opener(opener)
urllib.request.urlretrieve(URL, "images/0.jpg")
解决方案 11:
除了建议您仔细阅读文档retrieve()
(http://docs.python.org/library/urllib.html#urllib.URLopener.retrieve)之外,我建议您实际调用read()
响应的内容,然后将其保存到您选择的文件中,而不是将其留在检索创建的临时文件中。
解决方案 12:
所有上述代码都不允许保留原始图像名称,但有时这是必需的。这将有助于将图像保存到本地驱动器,并保留原始图像名称
IMAGE = URL.rsplit('/',1)[1]
urllib.urlretrieve(URL, IMAGE)
尝试一下这个来了解更多细节。
解决方案 13:
这对我使用 python 3 有用。
它从 csv 文件中获取 URL 列表并开始将其下载到文件夹中。如果内容或图像不存在,它会接受该异常并继续发挥其魔力。
import urllib.request
import csv
import os
errorCount=0
file_list = "/Users/$USER/Desktop/YOUR-FILE-TO-DOWNLOAD-IMAGES/image_{0}.jpg"
# CSV file must separate by commas
# urls.csv is set to your current working directory make sure your cd into or add the corresponding path
with open ('urls.csv') as images:
images = csv.reader(images)
img_count = 1
print("Please Wait.. it will take some time")
for image in images:
try:
urllib.request.urlretrieve(image[0],
file_list.format(img_count))
img_count += 1
except IOError:
errorCount+=1
# Stop in case you reach 100 errors downloading images
if errorCount>100:
break
else:
print ("File does not exist")
print ("Done!")
解决方案 14:
根据urllib.request.urlretrieve — Python 3.9.2 文档,该函数是从 Python 2 模块移植而来的 urllib
(而不是 urllib2
)。它可能会在将来的某个时候被弃用。
因此,最好使用requests.get(url, params=None, **kwargs)。这是一个MWE。
import requests
url = 'http://example.com/example.jpg'
response = requests.get(url)
with open(filename, "wb") as f:
f.write(response.content)
请参阅通过使用 Selenium WebDriver 截屏下载 Google 的 WebP 图像。
解决方案 15:
一个更简单的解决方案可能是(python 3):
import urllib.request
import os
os.chdir("D:\\comic") #your path
i=1;
s="00000000"
while i<1000:
try:
urllib.request.urlretrieve("http://www.gunnerkrigg.com//comics/"+ s[:8-len(str(i))]+ str(i)+".jpg",str(i)+".jpg")
except:
print("not possible" + str(i))
i+=1;
解决方案 16:
那这个呢:
import urllib, os
def from_url( url, filename = None ):
'''Store the url content to filename'''
if not filename:
filename = os.path.basename( os.path.realpath(url) )
req = urllib.request.Request( url )
try:
response = urllib.request.urlopen( req )
except urllib.error.URLError as e:
if hasattr( e, 'reason' ):
print( 'Fail in reaching the server -> ', e.reason )
return False
elif hasattr( e, 'code' ):
print( 'The server couldn\'t fulfill the request -> ', e.code )
return False
else:
with open( filename, 'wb' ) as fo:
fo.write( response.read() )
print( 'Url saved as %s' % filename )
return True
##
def main():
test_url = 'http://cdn.sstatic.net/stackoverflow/img/favicon.ico'
from_url( test_url )
if __name__ == '__main__':
main()
解决方案 17:
如果您需要代理支持,您可以这样做:
if needProxy == False:
returnCode, urlReturnResponse = urllib.urlretrieve( myUrl, fullJpegPathAndName )
else:
proxy_support = urllib2.ProxyHandler({"https":myHttpProxyAddress})
opener = urllib2.build_opener(proxy_support)
urllib2.install_opener(opener)
urlReader = urllib2.urlopen( myUrl ).read()
with open( fullJpegPathAndName, "w" ) as f:
f.write( urlReader )
解决方案 18:
另一种方法是通过 fastai 库。这对我来说非常有效。我正面临SSL: CERTIFICATE_VERIFY_FAILED Error
使用问题urlretrieve
,所以我尝试了这种方法。
url = 'https://www.linkdoesntexist.com/lennon.jpg'
fastai.core.download_url(url,'image1.jpg', show_progress=False)
解决方案 19:
使用请求
import requests
import shutil,os
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}
currentDir = os.getcwd()
path = os.path.join(currentDir,'Images')#saving images to Images folder
def ImageDl(url):
attempts = 0
while attempts < 5:#retry 5 times
try:
filename = url.split('/')[-1]
r = requests.get(url,headers=headers,stream=True,timeout=5)
if r.status_code == 200:
with open(os.path.join(path,filename),'wb') as f:
r.raw.decode_content = True
shutil.copyfileobj(r.raw,f)
print(filename)
break
except Exception as e:
attempts+=1
print(e)
if __name__ == '__main__':
ImageDl(url)
解决方案 20:
而如果你想下载类似网站目录结构的图片,可以这样做:
result_path = './result/'
soup = BeautifulSoup(self.file, 'css.parser')
for image in soup.findAll("img"):
image["name"] = image["src"].split("/")[-1]
image['path'] = image["src"].replace(image["name"], '')
os.makedirs(result_path + image['path'], exist_ok=True)
if image["src"].lower().startswith("http"):
urlretrieve(image["src"], result_path + image["src"][1:])
else:
urlretrieve(url + image["src"], result_path + image["src"][1:])
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理必备:盘点2024年13款好用的项目管理软件