Windows下Scrapy下载图片,指定图片名报错[WinError32]的解决办法
2017-08-23 20:38
309 查看
问题描述
在学习使用scrapy爬虫框架的时候,我根据一个网上的demo,编写了一个爬取某网站主播头像的spider,并希望爬取的图片以主播的名字来命名。存储图片的思路是使用scrapy自带的
ImagesPipeline类下载图片,通过重写
get_media_request()方法和
item_completed()方法,来实现下载、保存图片后再重命名的流程。
代码如下:
class ImagePipeline(ImagesPipeline): # 自定义一个图片下载类 IMAGES_STORE = get_project_settings().get('IMAGES_STORE') # 将要下载的图片url创建请求提交给引擎 def get_media_requests(self, item, info): # 一个item只下载一张图片 yield scrapy.Request(item['image_link']) def item_completed(self, results, item, info): """ 当一个单独项目中的所有图片请求完成时(要么完成下载,要么因为某种原因下载失败),该方法将被调用。 """ # 获取图片的下载路径,使用了列表生成式 image = [data['path'] for ok, data in results if ok] # 一个元组就没有括号了 # ↑ 这个path指的是result中的key # 拼接原始图片的路径 old_name = self.IMAGES_STORE + os.sep + image[0] # 拼接新的路径 new_name = self.IMAGES_STORE + os.sep + image[0].split(os.sep)[0] + os.sep + item['nick_name'] + '.jpg' os.rename(old_name, new_name) item['image_path'] = new_name return item
整段代码在Linux中运行无问题,然而在Windows环境下出现了错误:
Traceback (most recent call last): File "f:\python\python36\lib\site-packages\twisted\internet\defer.py", line 653, in _runCallbacks current.result = callback(current.result, *args, **kw) File "D:\MyProjects\pipelines.py", line 53, in item_completed os.rename(old_name, new_name) PermissionError: [WinError 32] 另一个程序正在使用此文件,进程无法访问。: 'D:\\MyProjects\\img_cach\\full/d8c779ea0c9a7a03a09ab05151796977ac5fc738.jpg' -> 'D:\\MyProjects\\img_cach\\full/d8c779ea0c9a7a03a09ab05151796977ac5fc738.jpg\\熙珍爱吃肉.jpg'
bug原因推测是
os.rename时图片仍未
close(),Windows不允许两个进程去操作同一个文件。
解决办法
因系统和框架的限制,“先下载好图片在重命名”的思路走不通(或者说屏我的半瓶水走不通了【囧】),那么在保存图片时就设定好图片名即可。即重写
file_path()方法。代码如下
class ImagePipeline(ImagesPipeline): IMAGES_STORE = get_project_settings().get('IMAGES_STORE') # 将要下载的图片url创建请求提交给引擎 def get_media_requests(self, item, info): yield scrapy.Request(item['image_link'], meta={"item": item, 'pic_name': item['nick_name']}) def file_path(self, request, response=None, info=None): """ 重写图片的存储路径。 :param request: :param response: :param info: :return: 字符串形式的文件存储路径,相对于 IMAGES_STORE 的相对路径 """ pic_name = request.meta['pic_name'] pic_path = pic_name + '.jpg' return pic_path
这次涉及的三个方法,其调用顺序应为:
get_media_request()
↓
file_path()
↓
item_completed()
相关文章推荐
- Highcharts:小案例,自定义图片下载路径,中文乱码的解决办法(不足之处,求指点)。
- Windows中"打开方式..."无法指定程序的解决办法
- uploadify上传文件时,如果没有指定按钮图片,出现空请求解决办法
- Windows IIS服务器.7z文件不能下载解决办法
- 关于百度云盘大于2G的文件在windows下必须安装百度自己的下载软件来下载的解决办法
- 关于打开MSDN提示“”无法下载msdnstart.htm(来自MS.MSDNQTR.v90.chs) 未指定的错误“”解决办法
- 解决Windows 7下Firefox下载入Localhost网站超慢办法
- 更改windows系统鼠标图片的解决办法
- scrapy下载图片到指定路径
- Windows 2003(iis 6.0)不能直接下载某些格式的文件解决办法
- 解决Windows 7下Firefox下载入Localhost网站超慢办法
- HttpClient下载图片不完整的解决办法
- taomcat的下载和配置以及指定服务未安装的解决办法
- [爬虫项目]scrapy使用ImagePipeline下载图片And图片分类存储(解决路径问题)
- 服务命令Windows_批处理命令之启动\停止\重启指定服务(花生壳6.5端口映射不正常解决办法)
- Windows 64位 连接Access数据库"未发现数据源名称并且未指定默认驱动程序"的解决办法
- Windows 下 web.py上传图片乱码的解决办法
- 图片下载时遇到Can't create handler inside thread that has not called Looper.prepare()解决办法
- 三星手机拍照,上传照片或者下载导致图片旋转90°的解决办法。
- windows系统下英雄联盟不能启动 指定路径不存在的解决办法