AutoScraper и Flask: создание API для любого сайта менее чем за 5 минут

В этом руководстве мы создадим собственный поисковый API электронной коммерции с поддержкой как eBay, так и Etsy без использования каких-либо внешних API. С помощью AutoScraper и Flask мы можем достичь этой цели менее чем за 20 строк Python кода для каждого сайта.

Требования

Установите необходимые библиотеки через pip:

pip install -U autoscraper flask

Приступим

Во-первых, мы собираемся создать умный скрейпер для извлечения данных со страницы результатов поиска eBay. Допустим, надо получить title, price и product link для каждого элемента. Используя AutoScraper, это легко сделать, просто предоставив некоторый образец данных:

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

Теперь сгруппируем результаты по правилам скрейпера:

scraper.get_result_similar(url, grouped=True)

Из выходных данных мы узнаем, какое правило каким данным соответствует, чтобы правильно его использовать. Установим некоторые псевдонимы на основе выходных данных, удалим избыточные правила и сохраним модель, чтобы применить ее позже:

Обратите внимание, что ID правил в вашем коде будут отличаться.

С eBay разобрались. Добавим поддержку результатов поиска Etsy. Начнем с того, что создадим для него скрейпер. На этот раз мы будем использовать wanted_dict вместо wanted_list. Он автоматически установит для нас псевдонимы:

url = 'https://www.etsy.com/search?q=macbook'

wanted_dict = {
    'title': [
        'Apple MacBook Pro i9 32GB 500GB Radeon 560X 15.4 2018 Touch Bar 2.9GHz 6-Core', 
        'Laptop MacBook Premium Ergonomic Wood Stand Holder Computer Gift Nerd Tech Geek Mens, woodworking gift, Home office workspace accessories',
    ],
    'price': ['1,500.00', '126.65'],
    'url': ['851553172']
}

scraper = AutoScraper()
scraper.build(url=url, wanted_dict=wanted_dict)

# получим результаты, сгруппированные по правилам, чтобы знать, какое использовать
scraper.get_result_similar(url, grouped=True)

Поскольку на Etsy ссылки генерируются с уникальным ID каждый раз, мы добавили один ID типового продукта в wanted_dict, чтобы из него можно было создать ссылку. Кроме того, мы предоставили два образца для titleи price, так как структура элементов на страницах результатов поиска Etsy отличается и нужно, чтобы скрейпер изучил их все.

Проанализировав выходные данные, сохраним нужные правила, удалим остальные и сохраним нашу модель:

Теперь, когда скрейперы готовы, мы можем создать полностью функционирующий API для обоих сайтов менее чем за 40 строк:

Здесь мы определяем API с параметром q в качестве поискового запроса. Получим и объединим результаты поиска eBay и Etsy и вернем их в качестве ответа. Обратите внимание, что мы передаем скрейперу group_by_alias=True, чтобы получить результаты, сгруппированные по нашим определенным псевдонимам.

После запуска кода, сервер API будет прослушивать порт 8080. Протестируем API, открыв http://localhost:8080/?q=headphone в браузере:

Результаты с eBay
Результаты с Etsy

Вуаля! Теперь у нас есть готовый API для электронной коммерции. Просто замените headphone в URL-адресе на нужный запрос, чтобы получить результаты его поиска.

Заключение

Окончательный код этого руководства доступен на GitHub.

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

Данное руководство предназначено для личного и образовательного использования. Если вы хотите получать данные с веб-сайтов, то проверьте их политику в отношении скрейпинг-ботов.

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

Читайте также:

Читайте нас в Telegram, VK и Яндекс.Дзен


Перевод статьи Alireza Mika: AutoScraper and Flask: Create an API From Any Website in Less Than 5 Minutes