编辑:
这不是旧版本 scrapy 的重复。 Scrapy 最近几年发生了变化,当前版本是 0.24
Scrapy 在过去几年的发展中取得了巨大的发展。大多数关于 scrapy 的 stackoverflow 答案都已经过时了。
我正在使用 scrapy 0.24.4 并希望以单独的方式为每个链接下载图像。现在,使用 scrapy 文档,我可以下载图像,但它们仅驻留在一个文件夹中。
我正在使用下面的代码,因此它会根据每个网址保存在单独的文件夹中,但无法实现。该代码甚至不运行,它驻留在 pipelines.py 中。仅执行图像管道的默认行为,即下载 item['image_urls'] 中的每个 url。
管道.py
import scrapy
from scrapy.contrib.pipeline.images import ImagesPipeline
from scrapy.exceptions import DropItem
import urlparse
import urllib
class RecursiveScrapPipeline(object):
"""Custom Image to save in Structured folder """
def process_item(self, item, spider):
#item currently is image name
image_guid = item
return "%s/full/%s.jpg"% (id,image_guid)
#this should work , exactly as per documentation
def get_media_requests(self, item, info):
for image_url in item['image_urls']:
yield scrapy.Request(image_url,meta={'id':item['Property_name']})
我走的路正确吗?可能的解决方案是什么?
最佳答案
我实际上不确定你想在这个管道中做什么,但有些事情似乎非常错误。我可能完全误解了您想要做什么,因此在这种情况下,请详细说明您的实现细节。
与此同时,以下是一些可能存在问题的事情:
如果您的目标是更改此管道的默认行为,您应该从 ImagesPipeline 继承。您还应该确保在
settings.py
中启用您的管道。方法
process_item()
应该返回 Item() 对象或引发DropItem()
异常,但您返回的是字符串?更糟糕的是,它是通过将项目对象隐式转换为字符串而创建的字符串?在这种情况下,这是没有意义的。如果您认为不应该重写 ImagesPipeline 中的该方法,则更少。您没有实现 if
item_completed()
,这是当单个项目的所有图像请求完成(完成下载或由于某种原因失败)时调用的方法。从那里,您也可以看到图像下载的路径,并在必要时移动它。
请阅读Downloading Item images的官方文档有关进一步说明的官方文档。
关于python - scrapy管道中的结构化图像下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26478958/