使用scrapy无法下载图像

时间:2018-07-02 15:10:34

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

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

这是我的蜘蛛(我正在通过崇高的文本编辑器运行):

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,我将其放置在项目spider下的torrentspider文件夹中。
  2. Images文件夹的实际地址为C:\Users\WCS\Desktop\torrentspider\torrentspider\spiders

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

2 个答案:

答案 0 :(得分:3)

您产生的项目不遵循Scrapy的文档。如其media pipeline documentation中的详细说明,该项目应有一个名为image_urls的字段。您应该将解析方法更改为与此类似的内容。

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'

答案 1 :(得分:0)

扫描上面的代码给我的第一件事是IMAGES_STORE的PATH。 /意味着您将转到计算机的绝对根路径,因此您可以将绝对路径放入要保存的位置,或者只是从运行搜寻器的位置开始相对路径

我在Linux计算机上,因此我的绝对路径将类似于IMAGES_STORE = /home/pk/myProjects/scraper/images

OR

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()))