CoderCastrov logo
CoderCastrov
Парсер

Парсинг информации о продуктах на страницах Decathlon с использованием Scrapy-Splash

Парсинг информации о продуктах на страницах Decathlon с использованием Scrapy-Splash
просмотров
5 мин чтение
#Парсер
Table Of Content

В этом руководстве мы будем собирать информацию о продуктах, следуя ссылкам с использованием плагина Scrapy-Splash.

Первые шаги

Создайте виртуальное окружение, чтобы избежать конфликтов пакетов. Установите необходимые пакеты и создайте проект Scrapy.

Создание проекта Scrapy

Установите Scrapy:

pip install Scrapy

Если у вас возникли проблемы с установкой Scrapy через pip, вы можете использовать conda. См. документацию здесь.

conda install -c conda-forge scrapy

Запустите проект с помощью команды:

scrapy startproject productscraper
cd productscraper

Также установите scrapy-splash, так как мы будем использовать его дальше в этом руководстве. Я предполагаю, что у вас уже установлен Docker на вашем устройстве. В противном случае, установите его сначала. Вам понадобится Docker для запуска плагина scrapy-splash, однако вам не нужно знать, как работают контейнеры для этого проекта.

Установка Docker

Docker - это открытая платформа для разработки, доставки и запуска приложений. Docker позволяет разделить ваш...

Документация Docker

# **установите его внутри вашей виртуальной среды**pip install scrapy-splash# **эта команда загрузит образ splash и запустит контейнер для вас**docker run -p 8050:8050 scrapinghub/splash

Теперь вы готовы парсить данные из веба. Давайте попробуем получить некоторые данные, прежде чем использовать Scrapy-Splash. В этом учебнике я собираюсь парсить ссылку на женскую обувь в магазине Decathlon. Вы также можете попробовать другие ссылки и веб-сайты. Посмотрите исходный код страницы и проинспектируйте элементы, которые вы хотите извлечь.

Для изучения селекторов Scrapy ознакомьтесь здесь.

Селекторы - документация Scrapy 2.5.0

Обычно нет необходимости вручную создавать селекторы Scrapy: объект доступен в обратных вызовах паука, поэтому в большинстве случаев...

docs.scrapy.org

Открыть Shell

Используйте shell для извлечения элементов, которые вы хотите спарсить, перед тем как запускать паука на скрипте. Таким образом, вы сэкономите время, не будете делать множество запросов и избежите блокировки со стороны веб-сайта.

Откройте свой scrapy shell с помощью команды:

scrapy shell

Теперь вы можете попробовать извлечь элементы здесь и посмотреть, работает ли это. Сначала получите ссылку и проверьте ответ. Если он не возвращает 200, проверьте ссылку в браузере, возможно, ссылка сломана или это может быть опечатка.

>>> **fetch(‘**[**https://www.decathlon.com/collections/womens-shoes'**](https://www.decathlon.com/collections/womens-shoes')**)**
2021–05–15 12:14:52 [scrapy.core.engine] INFO: Spider opened
2021–05–15 12:14:53 [scrapy.core.engine] DEBUG: Crawled (200) <GET [https://www.decathlon.com/collections/womens-shoes](https://www.decathlon.com/collections/womens-shoes)> (referer: None)
>>> **response**
<200 [https://www.decathlon.com/collections/womens-shoes](https://www.decathlon.com/collections/womens-shoes)>

План состоит в том, чтобы получить URL-адреса продуктов на этой странице, перейти в них по одному и спарсить детали продуктов.

Попробуйте получить одну из ссылок на продукт, выбрав элемент ссылки:

>>> **response.css(‘a.js-de-ProductTile-link::attr(href)’).get()**
‘/collections/womens-shoes/products/womens-nature-hiking-mid-boots-nh100’

Чтобы получить все элементы, используйте getall().

Поскольку мы правильно получаем URL-адреса, мы теперь можем получить одну из страниц продуктов и посмотреть, получаем ли мы также правильные детали продукта.

>>> **fetch(‘**[**https://www.decathlon.com/collections/womens-shoes/products/womens-nature-hiking-mid-boots-nh100'**](https://www.decathlon.com/collections/womens-shoes/products/womens-nature-hiking-mid-boots-nh100')**)**
2021–05–15 12:32:38 [scrapy.core.engine] DEBUG: Crawled (200) <GET [https://www.decathlon.com/collections/womens-shoes/products/womens-nature-hiking-mid-boots-nh100](https://www.decathlon.com/collections/womens-shoes/products/womens-nature-hiking-mid-boots-nh100)> (referer: None)

Попробуйте получить название продукта:

>>> **response.css(‘h1.de-u-textGrow1::text’).get()**
“\n Quechua NH100 Mid-Height Hiking Shoes, Women’s\n "

Попробуйте получить описание, цену, URL изображения:

>>> **response.css(‘h3.de-u-textGrow3::text’).get()**
“\n Quechua NH100 Mid-Height Hiking Shoes, Women’s is designed for Half-day hiking in dry weather conditions and on easy paths.\n “
>>> **response.css('span.js-de-PriceAmount::text').get()**
'\n    $24.99\n  '
>>>** response.css('img.de-CarouselFeature-image::attr(src)').get()**'//cdn.shopify.com/s/files/1/1330/6287/products/2dbcb677-82a9-48af-92fd-e803f2edfd69_675x.progressive.jpg?v=1608271582'

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

>>> **response.css(‘response.css(img.de-CarouselThumbnil-image::attr(srcset)').getall()**
[]

Наш паук Scrapy не может правильно выбрать другие изображения, потому что они отрисовываются с помощью JavaScript. Вот где приходит на помощь плагин Scrapy-Splash.

Я предполагаю, что ваш контейнер все еще работает после команды docker выше. Проверьте его по адресу http://localhost:8050/. Вы должны увидеть страницу Splash, что означает, что ваш Splash готов принимать запросы от вас.

Попробуйте отрисовать ту же страницу продукта через контейнер Splash:

[http://localhost:8050/render.html?url=https%3A%2F%2Fwww.decathlon.com%2Fcollections%2Fwomens-shoes%2Fproducts%2Fwomens-nature-hiking-mid-boots-nh100](http://localhost:8050/render.html?url=https%3A%2F%2Fwww.decathlon.com%2Fcollections%2Fwomens-shoes%2Fproducts%2Fwomens-nature-hiking-mid-boots-nh100)

Вы должны увидеть страницу продукта на вашем localhost. Вернитесь в свой shell и получите ссылку на Splash на этот раз.

>>> **fetch(‘**[**http://localhost:8050/render.html?url=https%3A%2F%2Fwww.decathlon.com%2Fcollections%2Fwomens-shoes%2Fproducts%2Fwomens-nature-hiking-mid-boots-nh100'**](http://localhost:8050/render.html?url=https%3A%2F%2Fwww.decathlon.com%2Fcollections%2Fwomens-shoes%2Fproducts%2Fwomens-nature-hiking-mid-boots-nh100%27)**)**
2021–05–15 13:55:52 [scrapy.core.engine] DEBUG: Crawled (200) <GET [http://localhost:8050/render.html?url=https%3A%2F%2Fwww.decathlon.com%2Fcollections%2Fwomens-shoes%2Fproducts%2Fwomens-nature-hiking-mid-boots-nh100](http://localhost:8050/render.html?url=https%3A%2F%2Fwww.decathlon.com%2Fcollections%2Fwomens-shoes%2Fproducts%2Fwomens-nature-hiking-mid-boots-nh100)> (referer: None)

Теперь попробуйте снова получить изображения:

>>> **response.css(‘img.de-CarouselThumbnail-image::attr(src)’).getall()**
[‘//cdn.shopify.com/s/files/1/1330/6287/products/2dbcb677–82a9–48af-92fd-e803f2edfd69_150x.progressive.jpg?v=1608271582’, ‘//cdn.shopify.com/s/files/1/1330/6287/products/934cf5a0–71ae-4d21–9912–722210d4fd4b_150x.progressive.jpg?v=1608271582’, ‘//cdn.shopify.com/s/files/1/1330/6287/products/7147eb56–43af-4496-b72c-7806755441aa_150x.progressive.jpg?v=1608271583’, ‘//cdn.shopify.com/s/files/1/1330/6287/products/85c3af12-f85e-4ab7-b9e9-f7de16aed656_150x.progressive.jpg?v=1608271583’, ‘//cdn.shopify.com/s/files/1/1330/6287/products/a17dcbc1-f497–49e0–88db-50d8e7b51d39_150x.progressive.jpg?v=1608271583’, ‘//cdn.shopify.com/s/files/1/1330/6287/products/6071bd3a-dcf8–4455–9dcc-f7d5395774d2_150x.progressive.jpg?v=1608271583’, ‘//cdn.shopify.com/s/files/1/1330/6287/products/27c8e41b-9e44–43f1-a779–6890ea84693f_150x.progressive.jpg?v=1608271583’, ‘//cdn.shopify.com/s/files/1/1330/6287/products/6c0665f4–279e-4954–9ccd-50587e3d51dd_150x.progressive.jpg?v=1608271583’, ‘//cdn.shopify.com/s/files/1/1330/6287/products/ca38ef42–07ec-448e-beb0–7e33a81da085_150x.progressive.jpg?v=1608271583’, ‘//cdn.shopify.com/s/files/1/1330/6287/products/3ee8337e-bd74–4a2e-a4ff-a2b889dd79e8_150x.progressive.jpg?v=1608271583’]

Бом! Все это есть. Мы смогли получить все данные, которые мы хотим, благодаря Splash.

Чтобы интегрировать Splash в свой собственный проект Scrapy, перейдите в settings.py и добавьте эти строки:

# Настройка SplashSPLASH_URL = 'http://<ВАШ-IP-АДРЕС>:8050'DOWNLOADER_MIDDLEWARES = {'random_useragent.RandomUserAgentMiddleware': 400,'scrapy_splash.SplashCookiesMiddleware': 723,'scrapy_splash.SplashMiddleware': 725,'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,}SPIDER_MIDDLEWARES = {'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,}DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'

Осталось только подготовить нашего паука для извлечения данных из страницы.

import scrapy
from scrapy_splash import SplashRequest

class DecathlonSpider(scrapy.Spider):
    name = 'Decathlonspider' # Вы будете запускать паука с этим именем
    start_urls = ['https://www.decathlon.com/collections/womens-shoes',] # Когда пишете с помощью Splash, вам нужно переопределить метод start_requests для начала отправки запросов через Splash.

    def start_requests(self):
        for url in self.start_urls:
            yield SplashRequest(url=url, callback=self.parse, args={'wait':1})

    def parse(self, response):
        links = response.css('a.js-de-ProductTile-link::attr(href)').getall()
        for link in links:
            splashLink = 'https://www.decathlon.com' + link
            yield SplashRequest(splashLink, callback=self.parse_product)

    def parse_product(self, response):
        datasets = response.css('img.de-CarouselThumbnail-image::attr(srcset)').getall()
        images = []
        for data in datasets:
            dataArr = data.split(',')
            images.append(dataArr[len(dataArr) - 1].strip())
        yield {
            'response': response,
            'brand': response.css('h1.de-u-textGrow1::text').get().split(' ')[1],
            'name': response.css('h1.de-u-textGrow1::text').get(),
            'price' : response.css('span.js-de-PriceAmount::text').get(),
            'mainImage':response.css('img.de-CarouselFeatureimage::attr(src)').get(),
            'images': images
        }

Создание надежного веб-скрейпера с использованием Scrapy и Django

Как разработчик, вам может понадобиться собирать, организовывать и очищать данные. Вам нужен скрейпер, чтобы извлекать данные...

codeburst.io

Для запуска паука и получения извлеченных данных в файле json выполните следующую команду:

scrapy crawl Decathlonspider -o decathlon.json

Она должна создать файл с данными, в противном случае проверьте командную строку для устранения ошибок.

Заключение

Здесь мы обработали содержимое, отображаемое с помощью JavaScript, в проекте Scrapy, используя проект Scrapy-Splash. Splash - это легкий веб-браузер, способный обрабатывать несколько страниц и выполнять пользовательский JavaScript в контексте страницы. Более подробную информацию о самом Splash вы можете найти в документации.

Если у вас возникнут вопросы по этому поводу, не стесняйтесь задавать их в комментариях!