如何在scrapy

时间:2019-02-13 17:49:16

标签: python-3.x scrapy

我想将爬网的所有下载图像保存在一个特定的文件夹中,这样我就可以同时在同一项目中运行多个蜘蛛,而无需将多个爬网的所有图像都放在一个文件夹中。

img文件夹目标在设置中定义:

project_dir = os.path.dirname(__file__)+'/../' #<-- absolute dir the script is in
IMAGES_STORE = project_dir+"images"

我的蜘蛛在spidername.py中有一个这样的类:

class GetbidSpider(CrawlSpider):
    name = 'test_spider'

我的图像管道如下所示:

class MyImagesPipeline(ImagesPipeline):

    def get_media_requests(self, item, info):
        for image_url in item['image_urls']:
            yield scrapy.Request(image_url)

    def item_completed(self, results, item, info):
        image_paths = [x['path'] for ok, x in results if ok]
        if not image_paths:
            raise DropItem("Item contains no images")
        item['image_paths'] = image_paths
        return item

如何在设置中访问当前蜘蛛的名称以创建动态图像下载文件夹?

1 个答案:

答案 0 :(得分:2)

一种方法是覆盖ImagesPipeline,更具体的是image_downloaded方法,这样您就可以利用从搜寻器获得的内容来做任何您想做的事情。

现在,我假设您想在每次运行Spider时都更改该设置变量,因此您不必每次都在运行它之前就四处寻找并更改设置。

每次运行时更改设置的一种替代方法是将其作为爬网参数传递:

scrapy crawl test_spider -s IMAGES_STORE=test_spider

另一种方法是在代码中为每个蜘蛛设置custom_settings上:

class GetbidSpider(CrawlSpider):
    name = 'test_spider'

    custom_settings = {
        'IMAGES_STORE': 'test_spider',
    }

然后正常运行蜘蛛:

scrapy crawl test_spider