2

编辑:
这不是旧版本的 scrapy 的副本。Scrapy 最近几年发生了变化,当前版本是 0.24

Scrapy 在这几年的发展中发生了巨大的变化。大多数关于scrapy的stackoverflow答案都已经过时了。

我正在使用scrapy 0.24.4,并希望以单独的方式为每个链接下载图像。现在,使用scrapy文档,我可以下载图像,但它们只位于一个文件夹中。

我正在使用下面的代码,因此它会根据每个 url 保存在单独的文件夹中,但无法实现。此代码甚至不运行,它驻留在 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']})

我在正确的轨道上吗?什么可能是解决方案?

4

1 回答 1

2

我实际上不确定您要在此管道中做什么,但似乎有些错误。有可能我完全误解了你想要做的事情,所以在这种情况下,请详细说明你的实现细节。

与此同时,这里有一些可能有问题的事情:

  1. 如果您的目标是更改此管道的默认行为,您应该从 ImagesPipeline 继承。您还应该确保在settings.py.

  2. 该方法process_item()应该返回一个 Item() 对象或引发DropItem()异常,但您返回的是一个字符串?更糟糕的是,它是通过将项目对象隐式转换为字符串而创建的字符串?在这种情况下,这没有任何意义。如果您认为不应在 ImagesPipeline 中覆盖该方法,则更少。

  3. 您没有实现 if item_completed(),这是当对单个项目的所有图像请求都完成时调用的方法(完成下载或由于某种原因失败)。从那里,您也可以看到图像已下载的路径,并在必要时移动它。

请阅读官方文档中有关下载项目图像的官方文档以进行进一步说明。

于 2014-12-09T11:28:40.787 回答