【问题标题】:Trouble downloading images using scrapy使用scrapy下载图像时遇到问题
【发布时间】:2018-12-10 20:36:15
【问题描述】:

我用 python scrapy 编写了一个脚本来从网站下载一些图像。当我运行我的脚本时,我可以在控制台中看到图像的链接(它们都是.jpg 格式)。但是,当我打开下载完成后应该保存图像的文件夹时,我什么也没有。我哪里出错了?

这是我的蜘蛛(我从 sublime 文本编辑器运行):

import scrapy
from scrapy.crawler import CrawlerProcess

class YifyTorrentSpider(scrapy.Spider):
    name = "yifytorrent"

    start_urls= ['https://www.yify-torrent.org/search/1080p/']

    def parse(self, response):
        for q in response.css("article.img-item .poster-thumb"):
            image = response.urljoin(q.css("::attr(src)").extract_first())
            yield {'':image}

c = CrawlerProcess({
    'USER_AGENT': 'Mozilla/5.0',   
})
c.crawl(YifyTorrentSpider)
c.start()

这是我在settings.py 中为要保存的图像定义的:

ITEM_PIPELINES = {
    'scrapy.pipelines.images.ImagesPipeline': 1,
}
IMAGES_STORE = "/Desktop/torrentspider/torrentspider/spiders/Images"

为了让事情更清楚:

  1. 我希望保存图像的文件夹名为Images,我已将其放置在项目torrentspider 下的spider 文件夹中。
  2. Images 文件夹的实际地址是C:\Users\WCS\Desktop\torrentspider\torrentspider\spiders

这不是在items.py 文件的帮助下成功运行脚本。因此,任何使用items.py 文件进行下载的解决方案都不是我想要的。

【问题讨论】:

    标签: python python-3.x web-scraping scrapy scrapy-spider


    【解决方案1】:

    您生成的项目不遵循 Scrapy 的文档。正如他们的media pipeline documentation 中所详述的那样,该项目应该有一个名为image_urls 的字段。您应该将 parse 方法更改为与此类似的方法。

    def parse(self, response):
        images = []
        for q in response.css("article.img-item .poster-thumb"):
            image = response.urljoin(q.css("::attr(src)").extract_first())
            images.append(image)
        yield {'image_urls': images} 
    

    我刚刚对此进行了测试,它可以工作。此外,正如 Pruthvi Kumar 评论的那样,IMAGES_STORE 应该就像

    IMAGES_STORE = 'Images'
    

    【讨论】:

    • 你说的很对。有用。我无法让它工作这么久,因为我试图使用来自 sublime 文本编辑器的.CrawlerProcess() 来执行它。你能建议我如何使用.CrawlerProcess() 执行 oyur 脚本。
    【解决方案2】:

    扫描上面的代码让我印象深刻的是IMAGES_STORE 的路径。 / 表示您将转到机器的绝对根路径,因此您可以将绝对路径放在要保存的位置,或者只是从运行爬虫的位置执行相对路径

    我在一台 linux 机器上,所以我的绝对路径类似于 IMAGES_STORE = /home/pk/myProjects/scraper/images

    IMAGES_STORE = 'images'

    另外,最重要的是,如果您使用默认管道,则保存提取图像的变量(您在其中执行extract_first())必须是image_urls

    您还缺少几个步骤。在你的蜘蛛中,添加这个:

    class ImgData(Item):
        image_urls=scrapy.Field()
        images=scrapy.Field()
    

    yield这一步,修改为:

    yield ImgData(image_urls=response.urljoin(q.css("::attr(src)").extract_first()))

    【讨论】:

    • 你可能没有注意到我没有使用任何items.py 文件。事实上,如果我从我的项目中删除items.py,上述脚本将完美运行。我在这里没有使用那种传统的方法。我想知道如何使用我上面尝试的方法来达到同样的效果。
    • 我已经回答了如何在没有 items.py 文件的情况下完成此操作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多