如何使用Scrapy下载图像?

时间:2016-09-28 11:05:34

标签: scrapy scrapy-spider scrapy-pipeline

我是scrapy的新手。我正在尝试从here下载图片。我关注Official-Docthis article

我的settings.py看起来像:

BOT_NAME = 'shopclues'

SPIDER_MODULES = ['shopclues.spiders']
NEWSPIDER_MODULE = 'shopclues.spiders'

ROBOTSTXT_OBEY = True

ITEM_PIPELINES = {
    'scrapy.contrib.pipeline.images.ImagesPipeline':1
}

IMAGES_STORE="home/pr.singh/Projects"


items.py看起来像:

import scrapy
from scrapy.item import Item

class ShopcluesItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    pass

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

我认为这两个文件都很好。但我无法为获取图像编写正确的蜘蛛。我可以抓取图片网址但不知道如何使用imagePipeline存储图片 我的蜘蛛看起来像:

from shopclues.items import ImgData
import scrapy
import datetime


class DownloadFirstImg(scrapy.Spider):
    name="DownloadfirstImg"
    start_urls=[
    'http://www.shopclues.com/canon-powershot-sx410-is-2.html',
    ]

    def parse (self, response):
        url= response.css("body div.site-container div#container div.ml_containermain div.content-helper div.aside-site-content div.product form#product_form_83013851 div.product-gallery div#product_images_83013851_update div.slide a#det_img_link_83013851_25781870")

        yield scrapy.Request(url.xpath('@href').extract(),self.parse_page)

        def parse_page(self,response):
            imgURl=response.css("body div.site-container div#container div.ml_containermain div.content-helper div.aside-site-content div.product form#product_form_83013851 div.product-gallery div#product_images_83013851_update div.slide a#det_img_link_83013851_25781870::attr(href)").extract()

            yield {
            ImgData(image_urls=[imgURl])
            }

我在this-article之后编写了蜘蛛。但我没有得到任何东西。我将我的蜘蛛作为scrapy crawl DownloadfirstImg -o img5.json 运行,但我没有得到任何json或任何图像?左任何帮助如何获取图像如果它的网址是已知的。我也从未使用过python,所以对我来说似乎很复杂。任何好教程的链接可能会有所帮助。 TIA

1 个答案:

答案 0 :(得分:3)

我不明白你为什么要提出一个图像请求,你需要将它保存在项目上,图像管道将完成其余的工作,这就是你所需要的。

def parse (self, response):
    url= response.css("body div.site-container div#container div.ml_containermain div.content-helper div.aside-site-content div.product form#product_form_83013851 div.product-gallery div#product_images_83013851_update div.slide a#det_img_link_83013851_25781870")
    yield ImgData(image_urls=[url.xpath('@href').extract_first()])