Конвейер обрезанных изображений не загружает изображения

#python #scrapy

Вопрос:

Я пытаюсь очистить веб — сайт, используя scrapy для загрузки изображений. Когда я запускаю код, он работает очень хорошо, но он не загружает изображения даже после того, как я указал каталог nad конвейера изображений в своем settings.py

spider.py

 import re import scrapy import os from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule from ..items import ImagesItem   class ImageSpiderSpider(CrawlSpider):  name = 'image_spider'  allowed_domains = ['books.toscrape.com']  # start_urls = ['http://books.toscrape.com/']   def start_requests(self):  url = 'http://books.toscrape.com/'  yield scrapy.Request(url=url)   rules = (  Rule(LinkExtractor(allow=r'catalogue/'), callback='parse_image', follow=True),  )   # save_location = os.getcwd()   custom_settings = {  "ITEM_PIPELINES": {'scrapy.pipelines.images.ImagesPipeline': 1},  "IMAGES_STORE": '.images_download/full'  }   def parse_image(self, response):  if response.xpath('//div[@class="item active"]/img').get() is not None:  img = response.xpath('//div[@class="item active"]/img/@src').get()  """  Computing the Absolute path of the image file.  "image_urls" require absolute path, not relative path  """  m = re.match(r"^(?:../../)(.*)$", img).group(1)  url = "http://books.toscrape.com/"  img_url = "".join([url, m])  image = ImagesItem()  image["image_urls"] = [img_url] # "image_urls" must be a list  yield image  

items.py

 import scrapy   class ImagesItem(scrapy.Item):  image_urls = scrapy.Field()  images = scrapy.Field()  

settings.py

 BOT_NAME = 'images'  SPIDER_MODULES = ['images.spiders'] NEWSPIDER_MODULE = 'images.spiders'  ROBOTSTXT_OBEY = True  ITEM_PIPELINES = {"scrapy.pipelines.images.ImagesPipeline": 1} IMAGES_STORE = "/Home/PycharmProjects/scrappy/images/images_downloader"  

Комментарии:

1. Я запустил ваш код, и он работал абсолютно нормально, и он загрузил изображения. Я попробовал и то, и другое с settings.py и custom_settings, и это сработало в обоих из них. (Я использовал PyCharm и scrapy 2.5.0).

2. Я не запускал его, но сначала вы должны проверить, существует ли папка, потому что она не создает ее автоматически, а если папка не существует, то она не загружается. Во — вторых: вы могли бы использовать print() , чтобы увидеть, какая часть кода выполняется и что у вас есть в переменных-это называется "print debuging"

3. Я не понимаю, почему вы используете re.match . И если вы хотите создать абсолютный URL-адрес, то у него есть absolute_url = response.urljoin(relative_url)

4. вместо os.getcwd() этого вы можете использовать "." "IMAGES_STORE": "."

5. стандартная загрузка конвейера в подпапку full IMAGES_STORE/full — поэтому вам следует проверить, есть ли у вас подпапка full

Ответ №1:

Я не могу протестировать его как project , но я протестировал ваш код как standalone сценарий — и он работает для меня.

Я поместил весь этот код в один файл script.py и запустил его как python script.py

 import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule  class ImagesItem(scrapy.Item):  image_urls = scrapy.Field()  images = scrapy.Field()  class ImageSpiderSpider(CrawlSpider):  name = 'image_spider'   allowed_domains = ['books.toscrape.com']  start_urls = ['http://books.toscrape.com/']   rules = (  Rule(LinkExtractor(allow=r'catalogue/'), callback='parse_image', follow=True),  )   custom_settings = {  "ITEM_PIPELINES": {'scrapy.pipelines.images.ImagesPipeline': 1},  "IMAGES_STORE": '.',   }    def parse_image(self, response):  img = response.xpath('//div[@class="item active"]/img/@src').get()  if img:  img_url = response.urljoin(img)  #image = dict()  image = ImagesItem()  image["image_urls"] = [img_url] # "image_urls" must be a list  yield image   # --- run without project and save in `output.csv` ---  from scrapy.crawler import CrawlerProcess  c = CrawlerProcess({  #'USER_AGENT': 'Mozilla/5.0',   # save in file CSV, JSON or XML  'FEEDS': {'output.csv': {'format': 'csv'}}, # new in 2.1   #'ITEM_PIPELINES': {'scrapy.pipelines.images.ImagesPipeline': 1}, # used standard ImagePipeline (download to IMAGES_STORE/full)  #'IMAGES_STORE': '.', # this folder has to exist before downloading }) c.crawl(ImageSpiderSpider) c.start()  

Он создает подпапку full с изображениями, которые имеют имена, например 0a007ac89083ad8b68c56ec0f8df5a811e76607c.jpg , потому что стандартный конвейер использует хэш-код в качестве имени.

Он также создает файл output.csv со строками, такими как

 image_urls,images http://books.toscrape.com/media/cache/b1/0e/b10eabab1e1c811a6d47969904fd5755.jpg,"[{'url': 'http://books.toscrape.com/media/cache/b1/0e/b10eabab1e1c811a6d47969904fd5755.jpg', 'path': 'full/d78460eb2aa4417e52a8d9850934e35ef6b6117f.jpg', 'checksum': 'e7f8ece4eab2ff898a20ce53b4b50dcb', 'status': 'downloaded'}]"  

Ту же информацию я вижу также непосредственно в консоли

 {'image_urls': ['http://books.toscrape.com/media/cache/ee/cf/eecfe998905e455df12064dba399c075.jpg'],  'images': [{'checksum': '693caff3d97645e73bd28da8e5974946',  'path': 'full/59d0249d6ae2eeb367e72b04740583bc70f81558.jpg',  'status': 'downloaded',  'url': 'http://books.toscrape.com/media/cache/ee/cf/eecfe998905e455df12064dba399c075.jpg'}]}