Python + Scrapy переименовывает загруженные изображения

ВАЖНОЕ ПРИМЕЧАНИЕ: все ответы, доступные на данный момент в stackoverflow, относятся к предыдущим версиям Scrapy и не работают с последней версией scrapy 1.4

Совершенно новый для scrapy и python, я пытаюсь очистить некоторые страницы и загрузить изображения. Изображения загружаются, но они по-прежнему имеют исходное имя SHA-1 в качестве имен файлов. Я не могу понять, как переименовать файлы, на самом деле все они имеют имена файлов SHA-1.

Пытался переименовать их как «тест», и у меня есть «тест», появляющийся в выходных данных, когда я запускаю scrapy crawl rambopics вместе с данными URL-адреса. Но файлы не переименовываются в папке назначения. Вот пример вывода:

> 2017-06-11 00:27:06 [scrapy.core.scraper] DEBUG: Scraped from <200
> http://www.theurl.com/> {'image_urls':
> ['https://www.theurl.com/-a4Bj-ENjHOY/VyE1mGuJyUI/EAAAAAAAHMk/mw1_H-mEAc0QQEwp9UkTipxNCVR-xdbcgCLcB/s1600/Image%2B%25286%2525.jpg'],
> 'image_name': ['test'], 'title': ['test'], 'filename': ['test'],
> 'images': [{'url':
> 'https://www.theurl.com/-a4Bj-ENjHOY/VyE1mGuJyUI/EAAAAAAAHMk/mw1_H-mEAc0QQEwp9UkTipxNCVR-xdbcgCLcB/s1600/Image%2B%25286%2525.jpg',
> 'path': 'full/fcbec9bf940b48c248213abe5cd2fa1c690cb879.jpg',
> 'checksum': '7be30d939a7250cc318e6ef18a6b0981'}]}

До сих пор я пробовал много разных решений, все из которых были опубликованы в stackoverflow, просто нет четкого ответа на этот вопрос для последней версии scrapy в 2017 году, похоже, что предложения, вероятно, почти все устарели. Я использую Scrapy 1.4 с Python 3.6.

scrapy.cfg

# Automatically created by: scrapy startproject
#
# For more information about the [deploy] section see:
# https://scrapyd.readthedocs.org/en/latest/deploy.html

[settings]
default = rambopics.settings

[deploy]
#url = http://localhost:6800/
project = rambopics

items.py импортировать скрап

class RambopicsItem(scrapy.Item):
    # defining items:
     image_urls = scrapy.Field()
     images = scrapy.Field()
     image_name = scrapy.Field()
     title = scrapy.Field()
    #pass -- dont realy understand what pass is for

settings.py

BOT_NAME = 'rambopics'

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


ROBOTSTXT_OBEY = True


ITEM_PIPELINES = {
   'scrapy.pipelines.images.ImagesPipeline': 1,
}

IMAGES_STORE = "W:/scraped/"

pipelines.py

import scrapy
from scrapy.pipelines.images import ImagesPipeline

class RambopicsPipeline(ImagesPipeline):


    def get_media_requests(self, item, info):

        img_url = item['img_url']
        meta = {
                  'filename': item['title'],
                   'title': item['image_name']
                }

        yield Request(url=img_url, meta=meta)

(паук) rambopics.py

from rambopics.items import RambopicsItem
from scrapy.selector import Selector
import scrapy


class RambopicsSpider(scrapy.Spider):
    name = 'rambopics'
    allowed_domains = ['theurl.com']
    start_urls = ['http://www.theurl.com/']

    def parse(self, response):

        for sel in response.xpath('/html'):
            #img_name = sel.xpath("//h3[contains(@class, 'entry-title')]/a/text()").extract()
            img_name = 'test'
            #img_title = sel.xpath("//h3[contains(@class, 'entry-title')]/a/text()").extract()
            img_title = 'test' 

        for elem in response.xpath("//div[contains(@class, 'entry-content')]"):
            img_url = elem.xpath("a/@href").extract_first()


            yield {
                   'image_urls': [img_url],
                   'image_name': [img_name],
                   'title': [img_title],
                   'filename': [img_name]
               }

Обратите внимание: я не знаю, какое правильное метаимя использовать для окончательного загруженного имени файла (я не уверен, что это имя файла, имя_изображения или заголовок).


person mlclm    schedule 11.06.2017    source источник
comment
на этот вопрос уже дан ответ на сайте здесь: stackoverflow.com/a/30002870/1675954 и здесь: stackoverflow.com/a/6196180/1675954 Это довольно исчерпывающие ответы. Убедитесь, что ваши базовые настройки настроены правильно. Их необходимо установить перед сканированием. См. doc.scrapy.org/en/latest /темы/   -  person Rachel Gallen    schedule 11.06.2017
comment
Пожалуйста, объясните подробнее, что не работает с другими решениями. Есть ли конкретные ошибки, которые вы получаете?   -  person OneCricketeer    schedule 11.06.2017


Ответы (1)


Используйте метод file_path для изменения имен изображений следующим образом:

class SaveImagesPipeline(FilesPipeline):
    def get_media_requests(self, item, info):
        i = 1
        for image_url in item['image_urls']:
            filename = '{}_{}.jpg'.format(item['name_image'], i)
            yield scrapy.Request(image_url, meta={'filename': filename})
            i += 1
    return

    def file_path(self, request, response=None, info=None):
        return request.meta['filename']
person Verz1Lka    schedule 11.06.2017
comment
file_path — это метод из конвейера изображений, который мы можем переопределить? Я не вижу этого в официальных документах. - person notGeek; 04.11.2018