Проблемы с загрузкой изображений с помощью scrapy - PullRequest
0 голосов
/ 02 июля 2018

Я написал скрипт в 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 голосов
/ 05 июля 2018

Предмет, который вы получаете, не соответствует документации Scrapy. Как подробно описано в их документации конвейера мультимедиа , элемент должен иметь поле с именем 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'
0 голосов
/ 05 июля 2018

Первое, что бросается в глаза при сканировании приведенного выше кода, это PATH для IMAGES_STORE. / означает, что вы идете по абсолютному корневому пути вашей машины, поэтому вы либо указываете абсолютный путь к тому месту, куда хотите сохранить, либо просто делаете относительный путь от того места, где вы запускаете свой сканер

Я на машине с Linux, поэтому мой абсолютный путь будет примерно таким: IMAGES_STORE = /home/pk/myProjects/scraper/images

ИЛИ

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

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