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

Автоматический Скребок и Колба: Создайте API С любого Веб-Сайта менее чем за 5 Минут И менее чем с 20 Строками Python

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

Автор оригинала: Mika.

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

Требования

Установите необходимые библиотеки с помощью pip:

pip install -U autoscraper flask

Давайте Сделаем Это

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

from autoscraper import AutoScraper


url = 'https://www.ebay.com/sch/i.html?_nkw=iphone'
wanted_list = ['Apple iPhone X 64GB Factory Unlocked Smartphone', '$389.99', 'https://www.ebay.com/itm/Apple-iPhone-X-64GB-Factory-Unlocked-Smartphone/254187579586?epid=238944741&hash=item3b2ec2a8c2:g:ZPQAAOSwD6VdpL~9']

scraper = AutoScraper()
result = scraper.build(url=url, wanted_list=wanted_list)

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

scraper.get_result_similar(url, grouped=True)

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

scraper.set_rule_aliases({'rule_0aok': 'title', 'rule_vn5z': 'price', 'rule_buz1': 'url'})

scraper.keep_rules(['rule_0aok', 'rule_vn5z', 'rule_buz1'])

scraper.save('ebay-search')

Обратите внимание, что идентификаторы правил будут отличаться для вас, если вы запустите код. Хорошо, у нас есть 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)

# get results grouped per rule so we'll know which one to use 
scraper.get_result_similar(url, grouped=True)

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

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

scraper.keep_rules(['rule_705x', 'rule_70m8', 'rule_d9wp', 'rule_kv6p'])

scraper.save('etsy-search')

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

from autoscraper import AutoScraper
from flask import Flask, request


ebay_scraper = AutoScraper()
etsy_scraper = AutoScraper()
ebay_scraper.load('ebay-search')
etsy_scraper.load('etsy-search')
app = Flask(__name__)


def get_ebay_result(search_query):
    url = 'https://www.ebay.com/sch/i.html?_nkw=%s' % search_query
    result = ebay_scraper.get_result_similar(url, group_by_alias=True)
    return _aggregate_result(result)
  
  
def get_etsy_result(search_query):
    url = 'https://www.etsy.com/search?q=%s' % search_query
    result = etsy_scraper.get_result_similar(url, group_by_alias=True)
    result['url'] = [f'https://www.etsy.com/listing/{i}' for i in result['url']]
    return _aggregate_result(result)
  
  
def _aggregate_result(result):
    final_result = []
    for i in range(len(list(result.values())[0])):
        final_result.append({alias: result[alias][i] for alias in result})
    return final_result
  
  
@app.route('/', methods=['GET'])
def search_api():
    query = request.args.get('q')
    return dict(result=get_ebay_result(query) + get_etsy_result(query))
  
  
if __name__ == '__main__':
    app.run(port=8080, host='0.0.0.0')

Здесь мы определяем API с параметром q в качестве поискового запроса. Мы получим и присоединимся к результатам поиска eBay и Etsy и вернем их в качестве ответа. Обратите внимание, что мы передаем group_by_alias=True в скребок, чтобы получить результаты, сгруппированные по нашим определенным псевдонимам. Запустив этот код, сервер API будет прослушивать порт 8080. Итак, давайте протестируем наш API, открыв http://localhost:8080/?q=headphone в вашем браузере:

Некоторые результаты с eBay
Некоторые результаты Etsy

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

Заключительные примечания

Окончательный код для этого учебника доступен на GitHub . Это настройка разработки, подходящая для разработки и тестирования. Встроенный сервер Flask не подходит для производства. Для производственного использования, пожалуйста, проверьте Параметры развертывания колб . Этот учебник предназначен для личного и образовательного использования. Если вы хотите очистить веб-сайты, вы можете проверить их политику в отношении ботов для очистки. Я надеюсь, что эта статья полезна и поможет воплотить ваши идеи в код быстрее, чем когда-либо. Счастливого кодирования!