最近搞爬虫的时候对于下载图片的时候如何命名碰到的问题。对于一般地址规则的图片,
例如:
https://pic2.zhimg.com/80/v2-2e4868da9f91f3320f3fdad248c28ff8_720w.jpg?source=1940ef5c,
https://wx3.sinaimg.cn/mw690/005uuxWfly1gn6r1cxl15j30xc0ipjz0.jpg
之前都是这么:
filename = url.split('/')[-1].split('?')[0]
或者这么搞的。
from urllib.parse import urlparse
file_name = os.path.basename(urlparse(url).path)
不过最近碰到好多不地址规则的图片,就处理不了。如下:
https://y3p.org/download/file.php?id=235
https://www.sammyboy.com/attachments/1589520290213-png.78635/
但是浏览器保存的时候名字却正常,因为response headers 里面都带了content-disposition字段,包含了文件名信息
https://y3p.org/download/file.php?id=235 字段
content-disposition:inline; filename*=UTF-8''79C2EAD8-AE48-4E39-A65A-5820697B189A.jpeg
https://www.sammyboy.com/attachments/1589520290213-png.78635/ 字段
content-disposition: inline; filename="1589520290213.png"
所以浏览器保存的时候文件名就是79C2EAD8-AE48-4E39-A65A-5820697B189A.jpeg和1589520290213.png
至于不带content-disposition字段url,例如:https://bkimg.cdn.bcebos.com/pic/0eb30f2442a7d933c8956906b500c61373f08202ab39
浏览器应该根据content-type字段和url路径的最后部分组成名字的。
通过fiddler抓包修改response headers,
https://y3p.org/download/file.php?id=235 去掉content-disposition字段,文件名为:file.jpg
https://www.sammyboy.com/attachments/1589520290213-png.78635/ 去掉content-disposition字段,文件名为:下载.png,看样浏览器蒙了。。。
还有浏览器无法正确保存文件名的例子:
https://www.91porn.com/captcha.php
至于浏览器到底怎么命名下载文件的,搜了一下也没找到太多有用的资料。
实测来看应该是:
1、看content-disposition字段,ps:content-disposition字段值得格式也不一样,上面我我举的例子就是不同的。
2、没有content-disposition字段的话在根据url和Content-Type拼接文件名,
3、最后实在无法处理的默认文件名为:下载,在由Content-Type决定后缀