Рубрики
Без рубрики

7 советов по строительству скребка Amazon

В этом посте я хочу поделиться некоторыми извлеченными уроками во время соскабливания страниц продукта Amazon. Для этого… Теги с Python, Scrapy.

В этом посте я хочу поделиться некоторыми извлеченными уроками во время соскабливания страниц продукта Amazon. Для этого проекта я использовал Scraphy Framework, чтобы получить огромную стартую голову, но все еще было много подводных камней для преодоления.

Если вы хотите пойти прямо в код, Вы можете найти его на Github вместе с инструкциями для настройки его.

Моя цель состояла в том, чтобы соскрести тысячи страниц деталей продукта на несколько категорий. Скребок хранит информацию о продукте в базе данных PostgreSQL. Эти данные включают имя и цену продукта, но также охватывает неструктурированные метаданные, которые варьируются по категориям, такие как спецификации CPU/RAM в категории компьютера.

Итак, что я хотел бы знать в начале?

Построить паук, чтобы обработать каждую категорию продукта

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

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

Лучше подумать о Amazon столько отдельных, если подобных, веб-сайты. Это может привести к некоторому дублированию кода между пауками, но это делает каждый класс паука намного чище и более ориентированным. Каждая категория продукта является start_url В Scrapy Texts облегчает расщепление ползания между различными классами паука.

    start_urls = {
        "https://www.amazon.com/Exercise-Equipment-Gym-Equipment/b?ie=UTF8&node=3407731": ExerciseEquipmentSpider,
        "https://www.amazon.com/computer-pc-hardware-accessories-add-ons/b?ie=UTF8&node=541966": ComputerPCHardwareSpider,
    }

    for start_url, spider_class in start_urls.items():
        crawler.crawl(
            spider_class, start_urls=[start_url], allowed_domains=["amazon.com"],
        )
        crawler.start()

Используйте жилой прокси-сеть

Как и многие большие сайты, у Amazon есть контрмеры, чтобы предотвратить соскабливание.

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

К счастью, устанавливая это с помощью Scrapy легко. Регистрация класса промежуточного программного обеспечения, который добавляет ценность прокси к метаданным запроса, – это все, что нужно для маршрута каждого запроса через прокси.

class CustomProxyMiddleware:
    def process_request(self, request, spider):
        request.meta["proxy"] = os.environ["PROXY_URL"]

Прокси-сети в основном происходят в двух ароматах: Центр данных и жилых. Грубо говоря, прокси-центр Center Data быстро и дешевы, а жилые сети медленнее и дороже. Хотя прокси-сервер-центр данных был моим первым выбором, я вскоре обнаружил, что многие IP-адреса уже заблокированы.

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

Полагаться на промежуточное программное обеспечение для фильтрации запросов

Предотвращение соскредости от рельсов и ползание ненужных страниц была большей частью вызова, чем я ожидал. На большом сайте, как Amazon, Scraphy очень легко следовать по одной неправильной линии связи в забвение.

Страницы категории имеют очень сложную разметку, что затрудняет придумывать селектор, который нацелит только правильные ссылки. XPath достаточно гибко, чтобы сделать работу, но, как и регулярные выражения, быстро становятся нечитаемыми. Вместо того, чтобы вынудить селекторов сделать всю работу, я использовал класс промежуточного программного обеспечения для отфильтровывания нежелательных запросов.

Встроенный INGLOREREWARKEST Исключение может быть повышено, чтобы избежать просьбы. Я быстро построил список ссылок «кроличьей дыры», которые вставали в очередь и заставляли мою ползу отступить на закат вместо того, чтобы посетить страницы продукта.

import os

from scrapy.linkextractors import IGNORED_EXTENSIONS
from scrapy.exceptions import IgnoreRequest


class IgnoredExtensionsMiddleware:
    IGNORE_PATTERNS = (
        "/stores/",
        "gp/profile",
        "gp/product",
        "gp/customer-reviews",
        "product-reviews",
        "ask/answer",
    )

    def process_request(self, request, spider):
        for pattern in self.IGNORE_PATTERNS:
            if pattern in request.url:
                raise IgnoreRequest()

        if request.url.lower().endswith(tuple(IGNORED_EXTENSIONS)):
            raise IgnoreRequest()

Правила SCRAPY и Linkextractors – ваш друг

Устранение всей логики в один метод разбора был рецептом для перемешательства. Рефакторирование ползанной логики для использования правил и экстракторы связи значительно очистили класс паука. Усилители связи определяют, какую часть (ы) страницы Scrapy следует изучить для следующих ссылок. Эта логика, в сочетании с промежуточным программным обеспечением, контролирует, как гусенично перемещается через веб-сайт.

from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor


class ComputerPCHardwareSpider(CrawlSpider):
    name = "computer_pc_hardware_spider"

    rules = (
        Rule(
            LinkExtractor(
                restrict_xpaths="//div[contains(@class, 'bxc-grid__container')]//*[img]"
            )
        ),
        Rule(LinkExtractor(restrict_text="See all results")),
        Rule(
            LinkExtractor(restrict_xpaths="//div[contains(@class, 's-main-slot')]//h2"),
            callback="parse_item",
        ),
    )

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

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

Сохранить данные с использованием трубопровода товара

Коленик сохраняет детали продукта в базу данных PostgreSQL. Для этого я использую трубопровод товара, который позволяет приятное разделение проблем. Трубопровод товара сохраняет логику участвовать в сохранении данных, кроме логики ползания.

Pipure.py Файл содержит все код, связанные с базой данных для проекта.

class DatabasePipeline:
    def __init__(self):
        engine = sa.create_engine(
            "postgresql://{}:{}@{}:5432/{}".format(
                os.environ["POSTGRES_USER"],
                os.environ["POSTGRES_PASSWORD"],
                os.environ["POSTGRES_HOST"],
                os.environ["POSTGRES_DB"],
            )
        )

        Base.metadata.create_all(engine)
        Session = sessionmaker(bind=engine)

        self.session = Session()

    def process_item(self, item, spider):
        try:
            self.session.execute(
                insert(InventoryItem)
                .values([item])
                .on_conflict_do_nothing()
            )
        except:
            self.session.rollback()

        self.session.commit()

process_item Способ будет вызван всякий раз, когда паук проанализирует объект не запрашивания. По соглашению, SCRAPY ожидает, что функции разбора, чтобы получить предмет, либо другой запрос, который будет выдан. Когда продукт соскоблен, паук дает словарь, который, в свою очередь, вставлен в базу данных.

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

Используйте AutoThroottle в начале при отладке

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

К счастью, AutoThrottle_Enabled Установка – это простой способ замедления вещей, пока ваш гусеник не является твердым роком. Настройка AutoThroottle адаптирует скорость запроса на основе времени отклика домена, которое вы ползаете. Это приводит к значительному замедлению, особенно если вы за прокси.

Есть также Download_delay Установка, которая добавит указанное количество секунд к каждому запросу. Либо One будет работать, если вам просто нужно медленно замедлять вещи, пока вы находитесь в режиме отладки.

Используйте XPath для выбора элементов

Селекторы CSS просто не режут его, когда дело доходит до соскоба сайтов, таких как Amazon. Имена классов часто повторяются на элементах, которые вы не хотите включать, и полезные идентификаторы являются редкостью. Довольно часто единственный способ нацелиться на правильные ссылки состоит в том, чтобы схема состоиться с подделом элементов, а не одного элемента в изоляции.

        Rule(
            LinkExtractor(restrict_xpaths="//div[contains(@class, 's-main-slot')]//h2"),
            callback="parse_item",
        )

Это правило, например, соответствует не только имени класса, но также требует, чтобы H2 проживайте где-то в поддереве родителя.

XPath может быть немного пугающим, но гибкость стоит тратить время, чтобы познакомиться с ним.

Оформить заказ код скребка Amazon

Код свободно доступен для всех, кто использовать или изменять. Вы можно проверить это на Github Для дополнительных инструкций по использованию.

Оригинал: “https://dev.to/zchtodd_79/7-tips-for-building-an-amazon-scraper-5ccp”