Простой парсер товаров с Amazon с помощью BeautifulSoup

Тема в разделе "Python", создана пользователем Dotrox, 31 авг 2016.

  1. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Для знакомства с парсингом на Python и таким прекрасным инструментом для этого, как BeautifulSoup, напишем небольшой парсер товаров с Amazon.
    В данном примере я буду использовать Python 2.7, для 3.x нужно будет внести некоторые правки.
    Из библиотек нам понадобится BeautifulSoup и requests, а также time для задания паузы между обращениями к серверу Amazon, чтоб парсер не забанили. Вместо requests можно использовать urllib2, но это добавит ручной работы.

    Для примера будем парсить категорию мониторов:


    Основной контент здесь находится в блоке #mainResults. Контейнер отдельного товара имеет класс s-result-item.
    На странице категории нас будут интересовать только ссылки на отдельные товары, а информацию о товарах будем брать со страниц товаров.

    1. Импортируем необходимые библиотеки, прописываем заголовок с User-agent, чтоб выдать себя за браузер и отправляем GET запрос к Amazon с помощью Requests:


    2. Теперь надо создать экземпляр BeautifulSoup и передать в него содержимое полученной страницы.


    3. Теперь соберём со страницы ссылки на товары.


    4. Получив список ссылок на товары можно начать обход страниц товаров и получение информации о каждом товаре.


    После работы парсера вы должны увидеть нечто подобное:


    Полный код из этой статьи выглядит так:
     
    Последнее редактирование: 23 ноя 2016
    Zulus, Jess23, samuel_L и ещё 1-му нравится это.
  2. Skladchina

    Skladchina

    Регистрация:
    15 янв 2019
    Сообщения:
    5
    Симпатии:
    0
    Ожидаются ли еще такие же занимательные примеры? Очень понравилось. У Python 3.x трудности со всеми кодировками, кроме UTF-8, лучше и правда 2.х.
     
  3. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Спрос слишком маленький.

    Не припомню необходимости в кодировках отличных от UTF-8, так что на счёт трудностей ничего не скажу, но с UTF-8 в тройке стало как раз лучше.

    А двойку уже поздно использовать, у неё поддержка заканчивается 1 января 2020.
    Туториалу этому то уже больше двух лет, тогда в двойке ещё был смысл. Если не ошибаюсь, BeautifulSoup тогда из коробки ещё даже не поддерживал тройку, нужно было самостоятельно пропускать через 2to3.
     
  4. Deen_don

    Deen_don

    Регистрация:
    22 май 2019
    Сообщения:
    0
    Симпатии:
    0
    Выдает только Parse и Link без цены и названия
     
  5. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Вероятно, там вёрстка изменилась, почти 3 года прошло. Для названия попробуйте так:
    python:
    	    
    data['name'] = soup.find(id='productTitle').text.strip()
     
  6. LoneRevenger

    LoneRevenger

    Регистрация:
    29 сен 2019
    Сообщения:
    0
    Симпатии:
    0
    Здравствуйте! Поробовал переименовать, к сожалению, безрезультатно. Выдаёт только Parse с сылкой на товар. Проверил код страницы, вроде, элементы правильно указаны, но не могу понять почему не работает корректно.
    Будьте добры, объясните как исправить и сделать так чтоб данные выводились в .txt файл. Ещё не могу понять как получить эту ссылку
    https://www.amazon.com/Monitors-Computers-Accessories/b/?node=1292115011, т.к. на Amozon везде они такие https://www.amazon.com/b/ref=s9_acs...d2-28c3-4a64-91af-254d7a033ada&pf_rd_i=541966
     
  7. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Не уверен, где я её достал тогда, но сейчас её можно найти в хлебных крошках на странице товара из категории.
    Вообще, формат ссылок не принципиален, главное, чтоб ссылка была рабочей.


    Для начала проверьте получаете ли вы саму страницу.

    После строчки
    python:
    	    
    r = requests.get(url, headers=headers)
    добавьте
    python:
    	    
    print(r.text)
    И посмотрите на код полученной страницы.
     
  8. LoneRevenger

    LoneRevenger

    Регистрация:
    29 сен 2019
    Сообщения:
    0
    Симпатии:
    0
    Ссылка получается рабочей, только если использовать такой тип, что Вы делали, а не как при просмотре сайта.
    На счет проверки, то я пробовал, да, страница получается, но отдельно вытащить элементы с неё я не могу

    Всё, работает, не получалось по собственной глупости
    --- Добавлено, 30 сен 2019 ---
    Вышла ошибка, теперь оно сново не работает. Использую изначальный код, вот что выдаёт

    []

    Process finished with exit code 0
    --- Добавлено, 30 сен 2019 ---
    Исправил
     
    Последнее редактирование: 30 сен 2019
  9. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    А в чём была проблема?
     
  10. Floki

    Floki

    Регистрация:
    8 мар 2021
    Сообщения:
    0
    Симпатии:
    0
    Dotrox, не подскажешь в чём проблема может быть: хочу спарсить тайтл со страницы (юзаю 3-й пайтон), и вместо тайтла выводит "Adding to Cart...", та и я посмотрел на остальные запросы и вместо любого текста Adding to Cart... или что-то подобное(
    На всякий случай мой код:

    Код:
    import requests
    from bs4 import BeautifulSoup
    
    URL = 'https://www.amazon.com/dp/B08RJ3XS6Y/'
    HEADERS = {
            'authority': 'www.amazon.com',
            'dnt': '1',
            'upgrade-insecure-requests': '1',
            'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',
            'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,'
                      'image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
            'sec-fetch-site': 'none',
            'sec-fetch-mode': 'navigate',
            'sec-fetch-dest': 'document',
            'accept-language': 'en-GB,en-US;q=0.9,en;q=0.8',
        }
    def get_html(url, params = None):
        r = requests.get(url, headers=HEADERS, params = params)
        return r
    
    def parse():
        html = get_html(URL)
        if html.status_code == 200:
            get_contant(html.text)
        else:
            print('Error')
    
    def get_contant(html):
        soup = BeautifulSoup(html, 'html.parser')
        #item = soup.find_all('h1', class_='a-section a-spacing-none')
        data = dict()
        data['Title'] = soup.find('h1').text.strip()
        print(data['Title'])
    
    parse()
     
  11. Deniurg

    Deniurg

    Регистрация:
    1 апр 2021
    Сообщения:
    6
    Симпатии:
    1
    Floki, как насчет изменить селектор на data['Title'] = soup.find(id="productTitle").text.strip() либо если нужно содержимое тега TITLE, то: data['Title'] = soup.title.string.strip()
     
  12. Dr.Dream

    Dr.Dream

    Регистрация:
    23 май 2022
    Сообщения:
    0
    Симпатии:
    0
    Доброй ночи! Подскажите решение этой проблемы. Как решилась?
     
  13. Thomas Bergersen

    Thomas Bergersen

    Регистрация:
    26 май 2022
    Сообщения:
    0
    Симпатии:
    0
    Доброй ночи! Подскажите решение этой проблемы. Как решилась?
     
  14. pidorpidor

    pidorpidor

    Регистрация:
    24 авг 2022
    Сообщения:
    0
    Симпатии:
    0
    амазон защиту от парсинга ввел, теперь вы не сможете обычным реквестом запарсить.