CoderCastrov logo
CoderCastrov
Парсер

Загрузка изображений с помощью Scrapy

Загрузка изображений с помощью Scrapy
просмотров
3 мин чтение
#Парсер

Привет, я работаю над сетью GAN, которая генерирует изображения в стиле NES. Но сначала мне нужно подготовить набор данных. Я нашел веб-сайт http://www.vgmuseum.com/, который содержит много изображений для NES (~10000). Поэтому я создал скрипт для парсинга этих изображений. Для начала мне нужно установить scrapy и pillow.

pip install scrapy
pip install pillow

После установки scrapy создайте проект.

scrapy.exe startproject vgmuseum
cd vgmuseum
scrapy genspider nes [www.vgmuseum.com](http://www.vgmuseum.com)

После выполнения команды будет создана структура каталогов.

Прежде чем писать код, нужно настроить scrapy для загрузки изображений. Откройте файл settings.py и добавьте переменную IMAGES_STORE с путем к папке, в которой вы хотите хранить изображения, и включите ImagesPipeline, добавив или изменив ITEM_PIPELINES.

ITEM_PIPELINES = {"scrapy.pipelines.images.ImagesPipeline": 1}
IMAGES_STORE = "images"

Затем откройте items.py. Здесь я создам два поля: images и image_url, в которых буду хранить информацию об изображениях. Поля должны называться images и image_urls. Это требуется для ImagesPipeline, но может быть изменено в settings.py.

# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# [https://doc.scrapy.org/en/latest/topics/items.html](https://doc.scrapy.org/en/latest/topics/items.html)
import scrapy

class VgmuseumItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    images = scrapy.Field()
    image_urls = scrapy.Field()

Наконец, я готов создать паука. Откройте папку spider, а затем nes.py. Начните с импорта. Импортируйте scrapy, scrapy request и класс VgmuseumItem из файла items.

import scrapy
from scrapy.http import Request
from vgmuseum.items import VgmuseumItem

В классе NesSpider в начале нужно указать имя, разрешенные домены и начальные URL.

class NesSpider(scrapy.Spider):
    name = "nes"
    allowed_domains = ["www.vgmuseum.com"]
    start_urls = ["http://www.vgmuseum.com/nes_b.html"]

Затем нужно создать метод parse. Когда я запущу паука в следующий раз, он начнет с метода parse. Метод parse имеет два аргумента: self и response.

Вот как выглядит веб-сайт. С помощью синтаксиса XPath мне нужно получить все URL с этой страницы, а затем загрузить все изображения с конкретного URL. Также есть ссылка "Back to the top", которую нужно игнорировать.

def parse(self, response):
    game_urls = response.xpath("//ol/li/a/@href").extract()
    for url in game_urls:
        if url != "#top":
            yield Request(
                response.urljoin(url), callback=self.parse_images
            )

game_urls содержит список всех URL с страницы. Затем я прохожу по всем URL, фильтрую все URL с #top и вызываю метод parse_images. Вот пример страницы для игры:

Здесь мне нужно получить имя изображения и сформировать URL к изображению. Затем добавить URL в список и присвоить этот список полю image_urls из класса VgmuseumItem.

def parse_images(self, response):
    item = VgmuseumItem()
    image_urls = []
    image_name = response.xpath("//center/img/@src").extract()
    for name in image_name:
        image_urls.append(f"{response.url.rsplit('/', 1)[0]}/{name}")
    item["image_urls"] = image_urls
    yield item

Создайте экземпляр класса VgmuseumItem, получите все имена изображений с страницы, сформируйте URL и добавьте в список image_urls. Присвойте image_urls полю из класса VgmuseumItem и верните его. Вот и все. Теперь я готов запустить паука. Убедитесь, что вы находитесь в папке vgmuseum и выполните команду:

scrapy crawl nes

Папка images будет автоматически создана, и изображения начнут появляться там. Также хорошей идеей будет добавить переменную DOWNLOAD_DELAY в settings.py. Это может помешать получить бан на веб-сайте.


Опубликовано на https://makspostument.com 2 июля 2019 года.