начал изучать парсинг, жёстко тупил и путался из-за не структуированного и как попало написанного кода, щас увидел твою структуру и всё резко стало понятно и просто, парсинг это работа с многочисленным количеством разных данных, чтобы не запутаться чуть ли не обязательно нужно писать структуированный код, в принпице во всём программировании структуированный код - понятный код
Подписан. Прокомментирую для продвижения канала. В отличие от широкого ряда других авторов каналов на подобные темы, понятная подача материала. В принципе даже для меня, далеко не молодого человека, в том случае, если многократно повторю действие и буду одновременно его проговаривать, есть шанс понять происходящее, саму логику написания программ, которые способны последовательно осуществлять действия и даже вдумчиво и с толком запустить тот парсер, который нужен. Выбрать-бы ещё время для этого.
Видео отличное! Узнал ряд новых вещей про bs4. а в чем здесь преимущество использования датаклассов, перед, например, банальным списком словарей?@@the_parse_hub
в целом соблюдая логику видео, и использую другой раздел сайта все получилось реализовать без не решаемых проблем. занимаюсь питоном по 4 каналам параллельно, за 1.5 месяца по выходным ( 40% месяца по 4-5 часов) свитчер 36 лет. дошел до ооп, решил сделать парсер как подведение итогов по функциональному. Спасибо автору. 1 замечание - перед началом подобного видео указывайте настройки исходной среды. на разных версиях продуктов или не скачанных надстройках, типа lxml, могут быть проблемы
Полезное видео, странно что просмотров мало. Баловался с парсером полгода назад, основная проблема(я новичок) когда я циклом обходил каждую ссылку на товар и тянул данные, то не смог настроить скрипт так, чтобы эти данные последовательно записывались в эксель файл😢
Спасибо. Насчет просмотров: канал относительно новый, всё впереди. Насчет последовательной записи: нужно использовать контекстный менеджер with, чтобы случайно не заблокировать файл, ну и стараться писать не по одной записи а блоками
Спасибо тебе огромное, очень понятно объясняешь, продолжай радовать контентом))) P. S: а можешь рассказать про динамический парсинг? (В экселе так можно) и про применение, например как создать файл, для обученмя бесплаиной модели? Как можно динамически парсить различные данные в этот файл что бы модель автоматически дообучалась? Возможно ли это? Было бы очень интерестно, так как тебя понятно воспринимать и слушать
Видео супер! Спасибо! Обратите внимание, что когда открывает получившийся файл на 16:35, внизу вкладка data и вот в ней всё в столбцах. У меня открылось в первой вкладке text, голову ломал что не так сделал.
Крутой видос! А что если у нужного нам тега класс не с читаемым названием (div, class_='product-card'), а например такой какой-нибудь? 'col-lg-3 col-md-4 col-sm-6 col-xs-6 col-xxs-12 item item-parent catalog-block-view__item js-notice-block item_block'. Как быть?
Спасибо. Насчет нужного селектора: бывают такие сложные моменты, особенно где названия классов генерируются (привет озону). Но почти всегда можно выйти на нужный элемент через его родителей\соседей или просто использовать какой-то один уникальный класс или атрибут, в твоём примере ".catalog-block-view__item" выглядит довольно нормальным
16:40 Судя по информации из "Инспектора" браузера, лучшим решением для проверки , наверное всё-же явилось-бы, считывать информацию о количестве товаров из атрибутов, которые доступны: Раковины 581 Так на сегодня "раковин" 581, в то время, как на момент съёмки видео их было 587. При этом возможно считать заведомо ложным утверждение о том, что когда-то товаров под каталожным названием "Раковины", не станет больше 587 (пятисот восьмидесяти семи). То есть проверка количества по атрибутам, наверное всё-же более правильное решение для автоматизации задачи, в том случае, если сама задача не разовая.
Отдельное видео это будет наверное слишком, проще отвечу прямо здесь: Вот примерная логика: # находим элемент и забираем у него координаты box = page.get_by_role("button").bounding_box() # перемещаем курсор на середину этого элемента page.mouse.move(box["x"] + box["width"] / 2, box["y"] + box["height"] / 2) # здесь нужно добавить ожидание, нового текста кнопки, класса или чего-то еще # клик page.mouse.click(box["x"] + box["width"] / 2, box["y"] + box["height"] / 2)
@@the_parse_hub а если эта кнопка не элемент button а типа span или div? есть может Telegram чат? upd: ааа. кликом мышки отчаливая от ближайшего элемента..
Добрый день! Не поможете советом? Мне нужно спарсить из интернет магазина все товары, которые там есть. Я так понимаю requests + bs4 в этом случае лучший вариант по скорости и удобству? И еще вопрос по поводу блокировки бота, она же возможна, ее как-то можно избежать? Может быть вы имели подобный опыт или есть совет, как это лучше реализовать?
Здравствуйте! А вы не сталкивались с блокировкой на wildberries? После нескольких часов парсинга выдает код 429, значит заблокировали. И приватные прокси не помогают. И не могу дальше парсить.
Добрый день. 429 это значит слишком частые запросы, это не блокировка. В ВБ возникает обычно когда идет парсинг страницы примерно > 30. Видимо считается, что настоящий пользователь до этого не дойдет никогда. Попробуйте делать повторный запрос, до 50-60-й страницы это обычно помогает
При открытии полученного файла кодировки пайчарма спрашивают что выбрать, при открытии файла в текст выдаются ошибки, какую кодировку стоит использовать? пишет что .csv только на проф версии пайчарма, есть вариация чем корректно его открыть в среде пайчарм без проф версии?
Насчёт кодировки, многое зависит от операционной системы. Как нормально (в табличном виде) открыть csv в бесплатной версии - наверное никак. В крайнем случае, можете найти где скачать "бесплатную" про версию и использовать полный функционал или переписать немного кода и сохранять результат в формате xlsx например
@@the_parse_hub теперь в csv файле вообще нет данных. Вообще это не очень большая проблема, тк эксель прекрасно читает эти файлы. Просто ради интереса узнаю
Добрый день! при наборе: sku = product.find("span", class_="product-card_key").text print(sku), и после запуска программы выдает ошибку : sku = product.find("span", class_="product-card_key").text AttributeError: 'NoneType' object has no attribute 'text' скажите пожайлуста что не так?
sku = product.find("span", class_="product-card_key") Здесь идет поиск какого-то элемента, если элемент не найден, то функция вернет None, далее идет попытка у этого элемента взять значение атрибута text и конечно у None не может быть такого атрибута. Скорее всего неправильно записан селектор: class_="product-card_key", проверяем на сайте - точно там class_ = "product-card__key" (Двойное нижнее подчеркивание)
Привет, можешь сделать инструкцию, как получать har файлы со траниц с помощью playwright? Еще можно browsermob + selenium разобрать, но мне кажется это уже устаревающая связка
Привет! Спасибо за объяснение, супер! НО у меня небольшая ошибка, на текущий момент раковин = 832, показывать элементов на сайте стоит по 100. Парсит нормально, но показывает в выводе консоли всего 9 страниц, хотя на сайте 11 страниц. Можешь подсказать где моя ошибка?
Здравствуйте! Подскажите, как написать такого бота, который бы "слушал" несколько чатов в Телеграм и пересылал сообщения в личку по каким-то ключевым словам? К примеру, я занимаюсь строительством и ремонтом, и надо первым получать предложения в чатах своего города, если кто-то ищет строителя.
@@the_parse_hub Это уже посмотрел, спасибо! Но там парсинг используется, чтобы просматривать сообщения в чате, а как сделать, чтобы бот "слушал" сообщение в текущем времени, чтобы успеть первым ответить потенциальному клиенту?
@@the_parse_hub У меня ещё вопрос. В статье описывается сохранение новых сообщений в файл на ПК, но не всегда есть возможность иметь ПК под рукой на котором запущен бот. Подскажите, как настроить перенаправление сообщений в телеграм-клиент на телефон?
начал изучать парсинг, жёстко тупил и путался из-за не структуированного и как попало написанного кода, щас увидел твою структуру и всё резко стало понятно и просто, парсинг это работа с многочисленным количеством разных данных, чтобы не запутаться чуть ли не обязательно нужно писать структуированный код, в принпице во всём программировании структуированный код - понятный код
доброго времени суток!
Подписан и посмотрел почти все видео с канала!Очень информативно и доходчиво даже для нубов подобных мне)
Спасибо за ваш труд!
Спасибо!
@@the_parse_hub с первого заказа задоначу))
Подписан. Прокомментирую для продвижения канала.
В отличие от широкого ряда других авторов каналов на подобные темы, понятная подача материала.
В принципе даже для меня, далеко не молодого человека, в том случае, если многократно повторю действие и буду одновременно его проговаривать, есть шанс понять происходящее, саму логику написания программ, которые способны последовательно осуществлять действия и даже вдумчиво и с толком запустить тот парсер, который нужен. Выбрать-бы ещё время для этого.
Спасибо!
Спасибо за полезный контент, учусь по твоим видео, про датаклассы очень информация помогла!)
Спасибо! наверное про датаклассы нужно отдельное видео, там возможностей гораздо больше, чем я использую в видео
Видео отличное! Узнал ряд новых вещей про bs4. а в чем здесь преимущество использования датаклассов, перед, например, банальным списком словарей?@@the_parse_hub
в целом соблюдая логику видео, и использую другой раздел сайта все получилось реализовать без не решаемых проблем.
занимаюсь питоном по 4 каналам параллельно, за 1.5 месяца по выходным ( 40% месяца по 4-5 часов) свитчер 36 лет. дошел до ооп, решил сделать парсер как подведение итогов по функциональному. Спасибо автору.
1 замечание - перед началом подобного видео указывайте настройки исходной среды. на разных версиях продуктов или не скачанных надстройках, типа lxml, могут быть проблемы
Ну насчет lxml и остальных зависимостей я это показывал в видео: ruclips.net/video/1dzbC4xRIXw/видео.html
Полезное видео, странно что просмотров мало. Баловался с парсером полгода назад, основная проблема(я новичок) когда я циклом обходил каждую ссылку на товар и тянул данные, то не смог настроить скрипт так, чтобы эти данные последовательно записывались в эксель файл😢
Спасибо. Насчет просмотров: канал относительно новый, всё впереди.
Насчет последовательной записи: нужно использовать контекстный менеджер with, чтобы случайно не заблокировать файл, ну и стараться писать не по одной записи а блоками
Спасибо большое за годный видос! С bs4 знаком, но всё равно что-то полезное находится 👍
Спасибо!
Спасибо за Вашу работу.
Большое спасибо, очень интересно!
Спасибо тебе огромное, очень понятно объясняешь, продолжай радовать контентом)))
P. S: а можешь рассказать про динамический парсинг? (В экселе так можно) и про применение, например как создать файл, для обученмя бесплаиной модели? Как можно динамически парсить различные данные в этот файл что бы модель автоматически дообучалась? Возможно ли это? Было бы очень интерестно, так как тебя понятно воспринимать и слушать
Спасибо!
Насчет Excel и нейросетей, я в них далеко не специалист, поэтому пока этим порадовать не смогу
Супер информативное видео. Хорошая работа
Спасибо за ваш труд!
Подписался) Очень полезно) Спасибо!
Очень интересно и информативно
сайт очень добрый к парсингу, редкость такое
Таких сайтов на самом деле много, не всегда есть смысл как-то защищать данные
👍
ТОп вообще огонь канал
Спасибо!
Классно!
блин чётко👍
Видео супер! Спасибо!
Обратите внимание, что когда открывает получившийся файл на 16:35, внизу вкладка data и вот в ней всё в столбцах.
У меня открылось в первой вкладке text, голову ломал что не так сделал.
Ну это особенность формата csv. По сути, это обычный текст разделенный запятыми или другими символами
Крутой видос! А что если у нужного нам тега класс не с читаемым названием (div, class_='product-card'), а например такой какой-нибудь? 'col-lg-3 col-md-4 col-sm-6 col-xs-6 col-xxs-12 item item-parent catalog-block-view__item js-notice-block item_block'. Как быть?
Спасибо.
Насчет нужного селектора: бывают такие сложные моменты, особенно где названия классов генерируются (привет озону). Но почти всегда можно выйти на нужный элемент через его родителей\соседей или просто использовать какой-то один уникальный класс или атрибут, в твоём примере ".catalog-block-view__item" выглядит довольно нормальным
16:40
Судя по информации из "Инспектора" браузера, лучшим решением для проверки , наверное всё-же явилось-бы, считывать информацию о количестве товаров из атрибутов, которые доступны:
Раковины
581
Так на сегодня "раковин" 581, в то время, как на момент съёмки видео их было 587.
При этом возможно считать заведомо ложным утверждение о том, что когда-то товаров под каталожным названием "Раковины", не станет больше 587 (пятисот восьмидесяти семи). То есть проверка количества по атрибутам, наверное всё-же более правильное решение для автоматизации задачи, в том случае, если сама задача не разовая.
Согласен. Но вариант с учётом дублей мне больше по душе
сделай пожалуйста видео на нажатие динамических кнопок playwright. которые меняются при наводке курсором
Отдельное видео это будет наверное слишком, проще отвечу прямо здесь:
Вот примерная логика:
# находим элемент и забираем у него координаты
box = page.get_by_role("button").bounding_box()
# перемещаем курсор на середину этого элемента
page.mouse.move(box["x"] + box["width"] / 2, box["y"] + box["height"] / 2)
# здесь нужно добавить ожидание, нового текста кнопки, класса или чего-то еще
# клик
page.mouse.click(box["x"] + box["width"] / 2, box["y"] + box["height"] / 2)
@@the_parse_hub а если эта кнопка не элемент button а типа span или div? есть может Telegram чат?
upd: ааа. кликом мышки отчаливая от ближайшего элемента..
Добрый день! Не поможете советом? Мне нужно спарсить из интернет магазина все товары, которые там есть. Я так понимаю requests + bs4 в этом случае лучший вариант по скорости и удобству? И еще вопрос по поводу блокировки бота, она же возможна, ее как-то можно избежать? Может быть вы имели подобный опыт или есть совет, как это лучше реализовать?
Эх, если бы всё было так просто, то этого канала не было бы)
Всё зависит от сайта, поэтому какой-то внятный совет не могу дать
@@the_parse_hub Мне это нужно в рамках учебного проекта, поэтому не особо важно какой это будет магазин. Например dns
@@ru8954 Возьмите тогда rdstroy.ru/. Там точно можно парсить через requests и bs4,защиты нет, недавно проверял
Здравствуйте! А вы не сталкивались с блокировкой на wildberries? После нескольких часов парсинга выдает код 429, значит заблокировали. И приватные прокси не помогают. И не могу дальше парсить.
Добрый день. 429 это значит слишком частые запросы, это не блокировка. В ВБ возникает обычно когда идет парсинг страницы примерно > 30. Видимо считается, что настоящий пользователь до этого не дойдет никогда. Попробуйте делать повторный запрос, до 50-60-й страницы это обычно помогает
@@the_parse_hub попробовал. Действительно, если снова начать с первой страницы, то идёт.
Спасибо вам большое!
При открытии полученного файла кодировки пайчарма спрашивают что выбрать, при открытии файла в текст выдаются ошибки, какую кодировку стоит использовать? пишет что .csv только на проф версии пайчарма, есть вариация чем корректно его открыть в среде пайчарм без проф версии?
Насчёт кодировки, многое зависит от операционной системы.
Как нормально (в табличном виде) открыть csv в бесплатной версии - наверное никак.
В крайнем случае, можете найти где скачать "бесплатную" про версию и использовать полный функционал или переписать немного кода и сохранять результат в формате xlsx например
price можно в try - exept обработать
Можно, пожалуйста разъясните: у меня в VScode кариллица отображается знаками вопроса. Как мне настроить кодировку?
пропишите кодировку, к примеру: open(f"glavsnab.csv", mode="w", newline="", encoding="utf-8")
@@the_parse_hub теперь в csv файле вообще нет данных. Вообще это не очень большая проблема, тк эксель прекрасно читает эти файлы. Просто ради интереса узнаю
Добрый день!
при наборе: sku = product.find("span", class_="product-card_key").text
print(sku), и после запуска программы выдает ошибку : sku = product.find("span", class_="product-card_key").text
AttributeError: 'NoneType' object has no attribute 'text'
скажите пожайлуста что не так?
sku = product.find("span", class_="product-card_key")
Здесь идет поиск какого-то элемента, если элемент не найден, то функция вернет None, далее идет попытка у этого элемента взять значение атрибута text и конечно у None не может быть такого атрибута.
Скорее всего неправильно записан селектор: class_="product-card_key", проверяем на сайте - точно там class_ = "product-card__key" (Двойное нижнее подчеркивание)
Привет, можешь сделать инструкцию, как получать har файлы со траниц с помощью playwright? Еще можно browsermob + selenium разобрать, но мне кажется это уже устаревающая связка
Вот официальная инструкция, по-моему нормально расписано: playwright.dev/python/docs/mock#mocking-with-har-files
@@the_parse_hub Да, это я уже все читал, но все равно не получается. Поэтому я подумал, что инструкция по этой штуке будет неплохим контентом
@@AnimationLook Это будет в курсе по Playwright, но когда он будет готов для меня большой вопрос
Привет!
Спасибо за объяснение, супер!
НО у меня небольшая ошибка, на текущий момент раковин = 832, показывать элементов на сайте стоит по 100. Парсит нормально, но показывает в выводе консоли всего 9 страниц, хотя на сайте 11 страниц. Можешь подсказать где моя ошибка?
Нужно выводить отладочную информацию и смотреть, так сказать не могу
@@the_parse_hub
Я вроде разобрался, там сайт кривой. (на мой взгляд)
@@IamZAS такое тоже бывает)
Интересна тема обход различных блокировок при отправке post запросов
Согласен. Но с post запросами многое зависит от сайта, так что универсального решения быть не может.
На каком-нибудь сайте обязательно покажу
А почему не спарсил максимальную страницу, чтоб просто за нее не шагать?
я уже не помню)
Здравствуйте! Подскажите, как написать такого бота, который бы "слушал" несколько чатов в Телеграм и пересылал сообщения в личку по каким-то ключевым словам? К примеру, я занимаюсь строительством и ремонтом, и надо первым получать предложения в чатах своего города, если кто-то ищет строителя.
Добрый день! Начните с этого: skillbox.ru/media/code/parsim-dannye-v-telegram-na-python-chast-1/
@@the_parse_hub Это уже посмотрел, спасибо! Но там парсинг используется, чтобы просматривать сообщения в чате, а как сделать, чтобы бот "слушал" сообщение в текущем времени, чтобы успеть первым ответить потенциальному клиенту?
@@alexandrchur5665 к примеру так: habr.com/ru/articles/425151/
@@the_parse_hub Большое спасибо! )
@@the_parse_hub У меня ещё вопрос. В статье описывается сохранение новых сообщений в файл на ПК, но не всегда есть возможность иметь ПК под рукой на котором запущен бот. Подскажите, как настроить перенаправление сообщений в телеграм-клиент на телефон?
Паршу 2 сайта для сравнение цен, где лучше сохранять данние для сравнения (json, sqlite) или в чем?
Sqlite вполне нормальная бд для таких целей
@@the_parse_hub спасибо за подказку
Мне оно просто выдаёт
None
None
None
None
И все, уже пробовал с 4 сайтами, не получается
Значит что-то делаете не так
сделай пж видео о том как пройти recaptcha v2 callback на selenium
В планах есть такое
+++
Почему может выводить None при первой (8:12-8:26) проверке?
Значит такой элемент не найден. Возможно неправильно записан селектор
@@the_parse_hub спасибо, нашла ошибку)
А в ссылке ?limit=600 нельзя было указать? :)
Указать можно, только работать не будет) На лимиты тоже есть лимиты
почему не сохраняет в отдельный столбпец?
Не знаю про что вопрос, но наверное пропущена запятая где-то в функции записи
@@the_parse_hub with open(f'eprr.csv', mode='w', newline='', encoding='utf-8') as fie:
writer = csv.writer(fie)
writer.writerow(['name',
'price'])
Почему я не понял? Чувствую себя тупым
Если какой-то момент непонятен - могу прояснить
не по теме ролика конечно
хочется увидеть видео о решении callback капчи с помощью rucaptcha
в интернете нет объяснений как это сделать
Да, в планах есть
Спасибо за полезный контент, учусь по твоим видео, про датаклассы очень информация помогла!)
Спасибо! Датаклассы и правда очень крутая штука, особенно при передаче данных, гораздо меньше шансов ошибиться