Невозможно переименовать загруженные изображения через конвейеры без использования item.py - PullRequest
0 голосов
/ 17 февраля 2019

Я создал скрипт с использованием модуля python scrapy для загрузки и переименования изображений фильмов с нескольких страниц с торрент-сайта и сохранения их в папке на рабочем столе.Когда речь идет о загрузке и хранении этих изображений в папке на рабочем столе, мой сценарий остается без ошибок.Однако сейчас я пытаюсь переименовать эти файлы на лету.Поскольку я не использовал файл item.py и не хочу этого, я с трудом понимаю, как логика файла pipelines.py могла бы обрабатывать процесс переименования.

Мой паук (It downloads the images flawlessly):

from scrapy.crawler import CrawlerProcess
import scrapy, os

class YifySpider(scrapy.Spider):
    name = "yify"

    allowed_domains = ["www.yify-torrent.org"]
    start_urls = ["https://www.yify-torrent.org/search/1080p/p-{}/".format(page) for page in range(1,5)]

    custom_settings = {
        'ITEM_PIPELINES': {'scrapy.pipelines.images.ImagesPipeline': 1},
        'IMAGES_STORE': r"C:\Users\WCS\Desktop\Images",
    }

    def parse(self, response):
        for link in response.css("article.img-item .poster-thumb::attr(src)").extract():
            img_link = response.urljoin(link)
            yield scrapy.Request(img_link, callback=self.get_images)

    def get_images(self, response):
        yield {
            'image_urls': [response.url],
        }

if __name__ == "__main__":
    c = CrawlerProcess({
        'USER_AGENT': 'Mozilla/5.0',   
    })
    c.crawl(YifySpider)
    c.start()

pipelines.py содержит: (the following lines are the placeholders to let you know I at least tried):

from scrapy.http import Request

class YifyPipeline(object):

    def file_path(self, request, response=None, info=None):
        image_name = request.url.split('/')[-1]
        return image_name

    def get_media_requests(self, item, info):
        yield Request(item['image_urls'][0], meta=item)

Как я могу переименовать изображения через pipelines.py без использования item.py?

1 Ответ

0 голосов
/ 18 февраля 2019

Вам нужно создать подкласс оригинала ImagesPipeline:

from scrapy.pipelines.images import ImagesPipeline

class YifyPipeline(ImagesPipeline):

    def file_path(self, request, response=None, info=None):
        image_name = request.url.split('/')[-1]
        return image_name

, а затем обратиться к нему в ваших настройках:

custom_settings = {
    'ITEM_PIPELINES': {'my_project.pipelines.YifyPipeline': 1},
}

Но помните, что при простом «использовании точно«filename» будет вызывать проблемы, когда разные файлы имеют одинаковые имена, если только вы не добавите уникальную структуру папок или дополнительный компонент к имени файла.Это одна из причин, по которой имена файлов на основе контрольных сумм используются по умолчанию.Обратитесь к исходному file_path, если вы хотите включить некоторую оригинальную логику, чтобы предотвратить это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...