urllib.urlretrieve(url, file_path) 保存中文名乱码

问题:     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()



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值