代码之家  ›  专栏  ›  技术社区  ›  Jordan Guillonneau

我的Scrapy项['img\u URL']未下载该文件

  •  0
  • Jordan Guillonneau  · 技术社区  · 7 年前

    我目前正在从事一个学生的数据科学家项目,该项目包括通过图片构建鱼类识别系统。我们将使用tensorflow从数据和;scrapy找到了大量的数据(fish图片和他的学名)。

    我是scrapy的新手,但从3天以来我一直在工作,我已经编写了一个基本的fishbase spider(你可以在spider的代码中找到url):

    import scrapy
    from ..items import FishbaseItem
    
    class FishbaseSpider(scrapy.Spider):
        name = 'fishbase'
        allowed_domains = ['fishbase.org']
        start_urls = [
            'http://fishbase.org/ListByLetter/ScientificNamesQ.htm',
        ]
    
        def parse(self, response):
            all_fish = response.xpath('//tbody/tr')
            for fish in all_fish:
                taxo = fish.xpath('td/a/i/text()').extract()
                fish_url = fish.xpath('td/a/@href').extract_first()
    
                item = FishbaseItem()
                item['taxonomy'] = taxo
    
                r=scrapy.Request(url=response.urljoin(fish_url),callback=self.parseFish)
                r.meta['item'] = item
                yield r
    
        def parseFish(self, response):
            item = response.meta['item']
            imgUrl = response.xpath('//div/span/div/a/img/@src').extract_first()
            item['img_urls'] = response.urljoin(imgUrl)
            yield item
    

    以下是项目文件:

    import scrapy
    class FishbaseItem(scrapy.Item):
        taxonomy = scrapy.Field()
        fish_url = scrapy.Field()
        img_urls = scrapy.Field()
    

    和设置文件:

    BOT_NAME = 'fishbase'
    
    SPIDER_MODULES = ['fishbase.spiders']
    
    NEWSPIDER_MODULE = 'fishbase.spiders'
    
    ITEM_PIPELINES = {
        'scrapy.pipelines.images.ImagesPipeline': 1,
    }
    IMAGES_STORE = 'tmp/images/'
    
    ROBOTSTXT_OBEY = True
    

    我正在得到我想要的结果,但图像不会下载。我不明白为什么。。。此外,我还从其他网站下载了大量图片。

    1 回复  |  直到 7 年前
        1
  •  3
  •   TomáÅ¡ Linhart    7 年前

    有两个问题:

    • 根据 documentation ,项目字段应为 image_urls img_urls (除非您覆盖 IMAGES_URLS_FIELD 设置)。
    • 该值应该是URL列表,而不是字符串(单个URL)。当前,您只存储一个带有行的URL item['img_urls'] = response.urljoin(imgUrl) .