问题: urllib.urlretrieve(url, file_path)图片保存中文文件名乱码并抛错导致部分图片无法保存下来
(0) 前言:版本信息
Scrapy 1.5.0, lxml 4.1.1.0, libxml2 2.9.5, cssselect 1.0.3, parsel 1.3.1, w3lib 1.19.0, Twisted 17.9.0, Python 2.7.14 (v2.7.14:84471935ed, Sep 16 2017, 20:25:58) [MSC v.1500 64 bit (AMD64)], pyOpenSSL 17.5.0 (OpenSSL 1.1.0g 2 Nov 2017), cryptography 2.1.4, Platform Windows-10-10.0.16299
(1) 使用traceback.print_exc()追踪详细抛错信息
try:
urllib.urlretrieve(ab_src, file_path)
except:
traceback.print_exc()
注:traceback模块使用参考 https://www.cnblogs.com/shengulong/p/6653103.html
部分图片无法下载打印出错误信息如下:IOError: [Errno 22] invalid mode ('wb') or filename...
(2) 分析错误信息:IOError: [Errno 22] invalid mode ('wb') or filename...
参考:https://stackoverflow.com/questions/32273464/scrapy-ioerror-errno-22-invalid-mode-wb-or-filename
经分析是由于保存的文件名为乱码包含了保留字符,导致无法正常存储图片文件,那么要先解决乱码问题
(3) 分析造成抛出就是urlretrieve方法在打开文件时导致的,那么查看源码发现使用的open方法打开文件
百度:“python open 中文乱码”
参考:https://www.cnblogs.com/dragonisnotghost/p/4515581.html
经测试:urllib.urlretrieve(ab_src, file_path) 中file_path需要是<type 'unicode'>,如果采用如下utf-8编码,
会导致类型变为<type 'str'>,这样就导致报错IOError: [Errno 22] invalid mode ('wb') or filename...
项目代码:https://www.cnblogs.com/kongqi816-boke/p/5827243.html
ab_src = "http://www.xiaohuar.com" + srcs[0] # 拼接绝对路径;就是要爬的url的地址
# 文件名,以自己的名字命名;因为python27默认编码格式是unicode编码,因此我们需要编码成utf-8
file_name = "%s_%s.jpg" % (schools[0].encode('utf-8'), names[0].encode('utf-8'))
file_path = os.path.join("E:\\picture", file_name) # 存放下载图片的路径
urllib.urlretrieve(ab_src, file_path)
注:使用"python_判断字符串编码的方法":https://www.cnblogs.com/zhuhaiying/p/6282780.html
最终代码:
file_name = "%s_%s.jpg" % (schools[0], names[0]) file_path = os.path.join("E:\\picture", file_name) # 存放下载图片的路径;E:\\picture是我本地存放路径 print(type(file_path)) try: urllib.urlretrieve(ab_src, file_path) #open(file_path, 'wb') #另一种下载方法:http://blog.csdn.net/songyu0120/article/details/45287441 except: print(file_path) traceback.print_exc()