Для знакомства с парсингом на 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. Получив список ссылок на товары можно начать обход страниц товаров и получение информации о каждом товаре. После работы парсера вы должны увидеть нечто подобное: Полный код из этой статьи выглядит так:
Ожидаются ли еще такие же занимательные примеры? Очень понравилось. У Python 3.x трудности со всеми кодировками, кроме UTF-8, лучше и правда 2.х.
Спрос слишком маленький. Не припомню необходимости в кодировках отличных от UTF-8, так что на счёт трудностей ничего не скажу, но с UTF-8 в тройке стало как раз лучше. А двойку уже поздно использовать, у неё поддержка заканчивается 1 января 2020. Туториалу этому то уже больше двух лет, тогда в двойке ещё был смысл. Если не ошибаюсь, BeautifulSoup тогда из коробки ещё даже не поддерживал тройку, нужно было самостоятельно пропускать через 2to3.
Вероятно, там вёрстка изменилась, почти 3 года прошло. Для названия попробуйте так: python: data['name'] = soup.find(id='productTitle').text.strip()
Здравствуйте! Поробовал переименовать, к сожалению, безрезультатно. Выдаёт только 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
Не уверен, где я её достал тогда, но сейчас её можно найти в хлебных крошках на странице товара из категории. Вообще, формат ссылок не принципиален, главное, чтоб ссылка была рабочей. Для начала проверьте получаете ли вы саму страницу. После строчки python: r = requests.get(url, headers=headers) добавьте python: print(r.text) И посмотрите на код полученной страницы.
Ссылка получается рабочей, только если использовать такой тип, что Вы делали, а не как при просмотре сайта. На счет проверки, то я пробовал, да, страница получается, но отдельно вытащить элементы с неё я не могу Всё, работает, не получалось по собственной глупости --- Добавлено, 30 сен 2019 --- Вышла ошибка, теперь оно сново не работает. Использую изначальный код, вот что выдаёт [] Process finished with exit code 0 --- Добавлено, 30 сен 2019 --- Исправил
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()
Floki, как насчет изменить селектор на data['Title'] = soup.find(id="productTitle").text.strip() либо если нужно содержимое тега TITLE, то: data['Title'] = soup.title.string.strip()