Обучение парсингу на Python #3 | Парсинг динамического сайта | Выполняем заказ на фрилансе

Поделиться
HTML-код
  • Опубликовано: 5 июн 2024
  • Обучение (Web-Scraping) веб парсингу на Python. В данном видео выполним заказ на фрилансе и разберем на практике работу с библиотеками requests и Beautifulsoup4. Научимся делать запросы к динамическому веб сайту, сохранять страницы, парсить из них нужную нам информацию и рассмотрим сохранение данных в json файл.
    🔥 Доступ в приват | Поддержать проект:
    boosty.to/pythontoday
    / pythontoday
    yoomoney.ru/to/410019570956160
    🔥 Стать спонсором канала:
    / @pythontoday
    Таймкоды:
    00:00 - Интро
    00:15 - Описание проекта
    01:00 - Изучаем структуру страницы
    01:47 - Установка нужных для работы библиотек
    02:05 - Создаём функцию, и получаем главную страницу
    03:40 - Получаем ссылки на стартапы с первой страницы
    05:21 - Получаем страницу стартапа
    08:16 - Собираем данные стартапа
    13:15 - Сохраняем данные в JSON файл
    13:54 - Собираем данные всех стартапов с первой страницы
    14:40 - Сбор динамических данных
    19:16 - Запуск парсера
    ****Ссылки****
    Обучение парсингу на Python #1 | Парсинг сайтов | Разбираем методы библиотеки Beautifulsoup
    • Обучение парсингу на P...
    Обучение парсингу на Python #2 | Парсинг сайтов | Выполняем заказ на фрилансе
    • Обучение парсингу на P...
    Документация Beautifulsoup:
    EN: www.crummy.com/software/Beaut...
    RU: www.crummy.com/software/Beaut...
    Код проекта на github:
    github.com/pythontoday/scrap_...
    И в telegram канале:
    t.me/python2day
    ****Соц.сети****
    Telegram: t.me/python2day

Комментарии • 329

  • @PythonToday
    @PythonToday  3 года назад +14

    Таймкоды для вас:
    00:00 - Интро
    00:15 - Описание проекта
    01:00 - Изучаем структуру страницы
    01:47 - Установка нужных для работы библиотек
    02:05 - Создаём функцию, и получаем главную страницу
    03:40 - Получаем ссылки на стартапы с первой страницы
    05:21 - Получаем страницу стартапа
    08:16 - Собираем данные стартапа
    13:15 - Сохраняем данные в JSON файл
    13:54 - Собираем данные всех стартапов с первой страницы
    14:40 - Сбор динамических данных
    19:16 - Запуск парсера

    • @helloworld-el5bi
      @helloworld-el5bi 3 года назад

      Опять годнота)

    • @matrixxd6842
      @matrixxd6842 Год назад

      я не понимаю как сделать терминал как у тебя у меня там PS C:\Users\User\Desktop> вот так выходит я пишу как у тебя но все ровно не получается

  • @user-ch1pi8ce3d
    @user-ch1pi8ce3d Год назад +67

    Я понимаю что код написан быстро, но для новичков нужно будет учесть несколько не критичных, но ошибок в коде:
    1. Довольно странно постоянно сохранять html файл, потом открывать его и парсить данные из него (по сути просто лишние движения). Правильно будет просто использовать responce.text и доставать информацию оттуда (но возможно у заказчика было требования сохранить html файлы)
    2. Хардкод пагинации может привести к тому что в будущем не все стартапы будут пасриться (на сайт банально добавят новые стартапы и пагинаций станет больше). Правильно будет проверять ответ на каждой итерации цикла, и если responce.status_code == 404 то выходим из цикла
    3. Это уже ошибка в стиле написания кода. Абсолютно весь код находится в одной функции. Получения запроса с основного сайта и распарсивание карточек стартапов должно быть отдельно (для сумасшедших можно даже на 2 функции разбить). Парсинг данных со страницы стартапа так же должно производится отдельной функцией. Сохранения json, так же должно быть отдельной функцией.
    4. Это скорее совет чем ошибка. На сайте не так много карточек, но если учесть что в будующем их вероятно станет больше (запросов станет больше), то код может выполняться несколько десятков минут. Если вы пишите парсер и либо он уже делает много запросов, либо есть вероятность что в будующем он будет делать много запросов, то просто необходимо использовать aiohttp (или любую другую асинхронную библиотеку). Если парсер одноразовый, это можно упустить.
    5.Было бы правильно вывести базовый URL в отдельную переменную, а не копировать его к каждой относительной ссылке.
    6. Считается неправильным отлавливать все исключения в блоке try except, так как если пользователь нажмёт CTRL+C, то это не прекратит работу программы, а выкинет исключение. Если вам нужно поймать конкретное исключение, укажите его в блоке except, если нужно отловить все (за исключением нажатия CTRL+C), то просто внутри блока except выполняйте проверку.
    7. Заголовки лучше прописывать вне функции как константу (в ином случаи вы либо используете одну функцию на всю программу (что неправильно) либо копипастите headers в тело каждой функции)
    8. Что бы не заниматься лишними телодвижениями, можно использовать XPATH для указания необходимого блока.
    Думаю это всё к чему смог придраться. Отличный урок особенно для новичков. На парсерах можно заработать первый деньги питон разработчику, так как офферов достаточно много. Дам совет для тех кто парсит какой то сложный сайт. Изучите траффик, который идёт от сайта. Иногда можно найти запрос в котором все данные поступают в одном json ответе и вам не нужно долбить сайт сотнями запросов. Если вам удалось найти такой запрос, считайте что вы выполнили заказ на фрилансе за 5 минут, так как вам остаётся лишь достать данные из json и сохранить туда, куда укажет заказчик.

    • @Vladimir_F609
      @Vladimir_F609 11 месяцев назад +1

      Вроде всё верно, кроме имени переменной responSe😊

    • @user-vt6zb4pl9m
      @user-vt6zb4pl9m 8 месяцев назад

      Спасибо, друг

    • @SAVSAV1212
      @SAVSAV1212 6 месяцев назад

      А как называется ошибка, связанная с прерыванием программы Ctrl + C?

    • @user-ch1pi8ce3d
      @user-ch1pi8ce3d 6 месяцев назад

      @@SAVSAV1212 KeyboardInterrupt

  • @DeStreamTV
    @DeStreamTV Месяц назад

    09:40 - Try except: отдельное спасибо за огромную подсказку

  • @pythonx8732
    @pythonx8732 3 года назад +82

    Уроки очень классные, только одна просьба можете ТЗ показывать, было бы очень интересно

    • @user-dp1ke7bx7c
      @user-dp1ke7bx7c 2 года назад

      Круто подметили

    • @DrZlad
      @DrZlad 2 года назад

      А вот тут то и начинается настоящее искусство - транслировать- тз.

  • @user-gz7yc4vi1y
    @user-gz7yc4vi1y 3 года назад +39

    допарсились. нет больше этого сайта))

    • @DiMoNy4
      @DiMoNy4 11 месяцев назад +1

      Этот сайтик был из тех, кто просто любил жизнь...

    • @SherinYuri
      @SherinYuri Месяц назад

      Сайт есть, но он изменился. Ну тем интереснее. Будем его изучать. Не все же время готовое списывать. ))))

  • @aeca4284
    @aeca4284 3 года назад +11

    Без слов, это было четко, ясно, понятно, КРАСИВО!

  • @tenebris8800
    @tenebris8800 3 года назад +15

    шикарные видосы продолжай пожалуйста)))

  • @ruservices
    @ruservices 3 года назад +1

    Супер!!! Смотреть одно наслождение. Видна рука проффесионала. Спасибо за видео!

    • @PythonToday
      @PythonToday  3 года назад +1

      Благодарю 😀 Но я только учусь, и делюсь опытом. Далеко не профессионал

  • @DenisE25100
    @DenisE25100 Год назад +2

    Вы молодец. Не надо бояться делиться знаниями. Правда молодец. 😊

  • @begula_chan
    @begula_chan Год назад +6

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

  • @ZinFuku
    @ZinFuku 2 года назад

    Благодарю! Очень интересно и понятно объясняешь!

  • @road2zion2
    @road2zion2 3 года назад +1

    Отличное видео! Спасибо! Продолжай обязательно!

    • @PythonToday
      @PythonToday  3 года назад +1

      Благодарю за фидбэк

  • @HeyArtem
    @HeyArtem 2 года назад

    Как всегда, только самое нужное и интересное, без воды!!!

    • @PythonToday
      @PythonToday  2 года назад

      Спасибо большое за фидбэк!

    • @alinaveter7371
      @alinaveter7371 2 года назад

      @@PythonToday, огромное спасибо за ролики, очень полезная информация при обучении! Подскажите пожалуйста, нет ли у вас на примете аналогичного сайта? Просто текущий уже не работает...( Я взяла изначально на пробу другой динамический сайт, но при парсинге первой странице нет ни единого элемента, т.е. пусто на странице до первого движения колесиком

  • @user-on2wn6pq8d
    @user-on2wn6pq8d 3 года назад +3

    Очень круто и понятно объясняешь
    Я давно такой канал искал
    Желаю успехов

    • @PythonToday
      @PythonToday  3 года назад

      Спасибо 💪 Главная награда, мотивирует продолжать

  • @user-ig1hf8fb7r
    @user-ig1hf8fb7r 3 года назад +6

    Ты большой молодец! Спасибо тебе

    • @PythonToday
      @PythonToday  3 года назад +1

      Спасибо за фидбэк

    • @user-iy6vk4pn1j
      @user-iy6vk4pn1j 3 года назад +1

      @@PythonToday реально красавца!!

  • @user-wg6fe7gg6p
    @user-wg6fe7gg6p 2 года назад +2

    Для домашнего задания кто занимается доработайте код так что бы он обрабатывал не 23 страницы а все с учётом того что могут быть добавлены страницы. Очень интересное видео. Автору спасибо.

  • @denys5951
    @denys5951 2 года назад

    Спасибо за очень качественный контент

  • @iuriibuga5383
    @iuriibuga5383 Год назад

    Огромное спасибо автору!!!!

  • @BorisenkoV89
    @BorisenkoV89 3 года назад

    Отличная подача материала. Спасибо большое

    • @PythonToday
      @PythonToday  3 года назад +1

      Благодарю за фидбэк 👍

  • @radmirsharifullin5770
    @radmirsharifullin5770 2 года назад

    Отличный урок! Спасибо!

  • @GreekkAlex
    @GreekkAlex 3 года назад

    отличный урок! спасибо за гайд!👍🤘

    • @PythonToday
      @PythonToday  3 года назад

      Благодарю за фидбэк 💪

  • @user-po3sg7vn4y
    @user-po3sg7vn4y Год назад

    Супер! Спасибо за инфу!)

  • @evgeniyvojtik64
    @evgeniyvojtik64 2 года назад

    Большое спасибо за прекрасный материал

    • @PythonToday
      @PythonToday  2 года назад

      Спасибо за фидбэк!

  • @vitaliyhusti
    @vitaliyhusti 3 года назад

    Спасибо огромнейшее за видео!

    • @PythonToday
      @PythonToday  3 года назад

      Спасибо за фидбэк!

  • @makedatauseful1015
    @makedatauseful1015 2 года назад

    с помощью вашего канала зашел в программирование, большое спасибо

    • @PythonToday
      @PythonToday  2 года назад

      Уууу, поздравляю. Главное практика, успехов 👍

  • @set1qs
    @set1qs Год назад

    Как же ты меня мотивируешь ) я кажется знаю чем буду заниматься) именно парить, очень красиво получается!

    • @PythonToday
      @PythonToday  Год назад +1

      "Парить" - это что-то другое) Спасибо за фидбэк! Рад что видео интересны.

    • @set1qs
      @set1qs Год назад

      @@PythonToday опечатка :))) именно парсить 🤗

  • @leonidasspartasson9759
    @leonidasspartasson9759 3 года назад

    Хотелось бы видеть побольше объектов, дабы переиспользовать их по нужде . А так всё супер.

  • @jackmetropolitan7845
    @jackmetropolitan7845 3 года назад

    ТОП Контент!!!
    Спасибо.

  • @artpro9191
    @artpro9191 3 года назад +2

    Молодец. Растешь)

  • @takiekakmi7532
    @takiekakmi7532 3 года назад +21

    Это было круто! Сначала - все казалось огромным драконищем, а оказалось - дело разбора на 2-3 дня. Пасяб - теперь можно топать выполнять заказы👍)

    • @PythonToday
      @PythonToday  3 года назад +1

      Благодарю за фидбэк!

    • @squidwardtentacles7724
      @squidwardtentacles7724 Год назад

      как вы разбирали видео? гуглили что делает каждая строчка?

    • @takiekakmi7532
      @takiekakmi7532 Год назад

      @@squidwardtentacles7724 нет конечно) код же весьма логичен. А вообще - самый простой способ - повторить, разбить на функции и написать тесты. И, разумеется, смотреть в документацию периодически

    • @squidwardtentacles7724
      @squidwardtentacles7724 Год назад +2

      @@takiekakmi7532 как успехи сегодня в парсинге? Вы еще учитесь? я ищу себе единомышленников, я подросток с хромой базой Python(нужно повторить темы ООП, методов и функций), хочу научиться парсингу и ищу единомышленников

    • @kostya2222
      @kostya2222 Год назад +2

      @@squidwardtentacles7724 Тоже подросток, и желаю научиться парсингу) мыслим мы одинаково

  • @user-cj7if7us8u
    @user-cj7if7us8u 3 года назад +3

    Годно!

  • @r1-yzf216
    @r1-yzf216 Год назад

    благодарю Вас за труд!

    • @PythonToday
      @PythonToday  Год назад

      Благодарю за фидбэк!

    • @r1-yzf216
      @r1-yzf216 Год назад

      @@PythonToday как с Вами связаться, у меня есть предложение к Вам

  • @user-if3qe4oj2n
    @user-if3qe4oj2n 3 года назад +4

    Ты чёртов гений, я с этой пагинацией мучаюсь 2-ой день, всякие видео смотрю, stackoverflow чекаю, нихрена не помогало, ну не работало и всё, зашёл к тебе, а тут, просто тупо через request запрос делаешь и всё, никакие параметры не нужны, отличные гайды, просто идеальные.

    • @PythonToday
      @PythonToday  3 года назад

      Благодарю за фидбэк 💪

    • @user-if3qe4oj2n
      @user-if3qe4oj2n 2 года назад

      @@user-hv4or2mz9q, там вроде все продукты на flex блоках, кстати не знаете как парятся подобные вещи?

  • @user-de7vk7gm7b
    @user-de7vk7gm7b 3 года назад +1

    Это круто!!

  • @gowaw834
    @gowaw834 3 года назад

    спасибо все ясно, понятно.

  • @AtomNuclearChannel
    @AtomNuclearChannel 3 года назад

    Спасибо за поучительный видеоролик! Как всегда все понятно и подробно рассказано и показано!

  • @user-cx7iz8pw4c
    @user-cx7iz8pw4c Год назад +1

    Отличные уроки !!!! Если будете работаете на фрилансе не могли бы сделать новые
    уроки , на новых сайтах будет понятнее.

  • @akovemil9528
    @akovemil9528 2 года назад +4

    Спасибо!)Вдохновляешь!
    Мб...вопросы такие:
    1)был ли опыт работы с прокси-серверами для парсинга?
    2) имеется ли опыт обхода блокировок сайта для парсинга (блокировка по IP)?
    Будет ли видос по данным темам?

  • @nyakakun3398
    @nyakakun3398 3 года назад

    Спасибо! ;3

  • @serpol4ik
    @serpol4ik 6 месяцев назад

    Это очень кртуо!

  • @amurlamur3125
    @amurlamur3125 3 года назад

    Я вообще дизайнер, но приятно порабить под твои видосы

  • @user-vg4kj7mx2z
    @user-vg4kj7mx2z 3 года назад

    спасибо все грамотно

  • @crussaider
    @crussaider 2 года назад +1

    Все по классике: сначала написал код, потом решил посмотреть гайд. Хорошо, что мой код пока что никто не видел))

    • @PythonToday
      @PythonToday  2 года назад

      Да всё ок, это самая лучшая практика!

  • @user-qe9pd1yk3k
    @user-qe9pd1yk3k 3 года назад +3

    Нормальный, детальный обзор, с боевым проектом, где есть сложности и нюансы, такие как несколько страниц, запросы вложенные. Кстати хорошая тема просто сохранять как HTML страницы, тогда будут обычные HTML без json запросов и грязи) отличные урок продолжай, надо денежкой тебя отблагодарить !

    • @PythonToday
      @PythonToday  3 года назад

      Благодарю!

    • @user-qe9pd1yk3k
      @user-qe9pd1yk3k 2 года назад +1

      @@user-hv4or2mz9q Коммент был для благодарности, за разъяснение логики парсинга, нежели самой технологии и еще как первый учебный проект на python, так как в основном пишу на js, php. Лично для меня по удобству конечно js лучше, я с него могу парсить все что мне надо используя puppeteer и тор браузер для обхода блокировок, а на счет кода выше, да думаю вы скорее всего правы, так как этот код не везде применим, но это скорее пособие для новичков)

    • @user-qe9pd1yk3k
      @user-qe9pd1yk3k 2 года назад

      @@user-hv4or2mz9q все же еще и от самого тз зависит, есть парсинги вообще которые обрабатывают тучу страниц и преобразуют их в отдельные файлы

  • @user-zj1cb7cz3f
    @user-zj1cb7cz3f 3 года назад

    Просто лучший!

    • @PythonToday
      @PythonToday  3 года назад

      Благодарю 💪

    • @user-zj1cb7cz3f
      @user-zj1cb7cz3f 3 года назад

      @@PythonToday скажи пожалуйста, мне нужно спарсить елемент, но он доступен только после нажатия кнопки, можешь снять ролик или подсказать здесь как решить эту проблему? Спасибо за труды

    • @PythonToday
      @PythonToday  3 года назад

      @@user-zj1cb7cz3f Воспользуйся библиотекой Selenium(активно использовали в плейлисте по instagram боту), нажми на кнопку и забирай все, что нужно.

    • @user-zj1cb7cz3f
      @user-zj1cb7cz3f 3 года назад

      @@PythonToday Ахах, спасибо, даже не думал)

  • @simpleanalysis1946
    @simpleanalysis1946 2 года назад

    Спасибо

  • @turalnagi
    @turalnagi 2 года назад

    super

  • @Vladimir-re8xl
    @Vladimir-re8xl 3 года назад

    Круто)

    • @PythonToday
      @PythonToday  3 года назад

      Благодарю!

    • @Vladimir-re8xl
      @Vladimir-re8xl 3 года назад

      @@PythonTodayне используете опп в своей практике? Хотелось бы посмотреть на парсинг в ооп стиле.

    • @PythonToday
      @PythonToday  3 года назад

      @@Vladimir-re8xl Например? Не совсем понятно для чего при парсинге использовать ООП. Каждый сайт индивидуален. Можно всё обернуть в класс, но зачем, на основе этого класса нет смысла создавать объекты. Или не правильно понял?

  • @Monte_Cristo_R
    @Monte_Cristo_R 3 года назад +4

    спасибо очень полезно) !!! И конечно же было бы неплохо узнать как работать с API , ключами и так далее, на сайтах где надо авторизоваться например ВК или опять же какая то торговая биржа ))))

    • @PythonToday
      @PythonToday  3 года назад +1

      Благодарю за фидбэк 👍 Но ведь у API есть подробные документации, там ведь вообще не нужно заморачиваться)

    • @nikitabbrv5947
      @nikitabbrv5947 3 года назад +7

      @@PythonToday то, что синьорам кажется элементарно, джунам и интерном - как будто "в тумане". )

    • @djdkdkrk
      @djdkdkrk Год назад

      ага, сколько я копался в доках/инете чтоб спарсить вк, чертов ад

  • @user-qi9ts9xd6f
    @user-qi9ts9xd6f 2 года назад +1

    Ай красавчик

    • @PythonToday
      @PythonToday  2 года назад

      Большое спасибо!

  • @dimamalyk8608
    @dimamalyk8608 3 года назад +1

    Ролик оказался полезным, хотелось бы новую вершину, например парсинг Ютуба. К примеру, выгрузка комментов с видео.

    • @PythonToday
      @PythonToday  3 года назад +3

      Благодарю. У ютуба есть своё api, которое позволяет доставать много данных. Можно попробовать использовать его. По парсингу ютуба точно видео не будет. Чревато

  • @ajira8273
    @ajira8273 2 года назад +3

    Спасибо за очень познавательный урок!
    Но вот возник вопрос, я правильно понимаю, что парсер захардкожен на 23 страницы? У заказчика в будущем не возникнут проблемы, когда сайт перевалит за 23 страницы?

  • @alexanderchemeza1772
    @alexanderchemeza1772 9 месяцев назад

    Если известна ссылка и необходимо менять число, лучше использовать while, выход по получению кода 404. Да и толка от записи html нет. Но для понимания основ сойдет

  • @selviont8443
    @selviont8443 3 года назад +2

    Автоматизация рутинных задач с помощью Python. Там хорошо объяснена тема регулярных выражений

    • @PythonToday
      @PythonToday  3 года назад

      Благодарю 💪

    • @deniskononov2708
      @deniskononov2708 3 года назад

      Плюсую! Если кому надо в электронном виде: yadi.sk/i/QmwgS3erpfADjw Если ссылки не желательны, удалю

  • @user-iy3yo2wt1n
    @user-iy3yo2wt1n 2 года назад

    👍👍👍

  • @bigmek4051
    @bigmek4051 11 месяцев назад

    То чувство, когда видео длится 20 минут, а на его понимание, повторение о осознание всех процессов в коде тратишь часа по 3 ) Не так давно начал заниматься Python, освоил базу на каком-то бесплатном курсе, решил что будет интересно попробовать себя именно в этой сфере. Как практика Ваши уроки крайне полезны, хоть и не просты, этого не отнять 😅

    • @PythonToday
      @PythonToday  11 месяцев назад +2

      Большое спасибо за фидбэк! За каждым видео стоят десятки часов работы. В том и смысл, дать максимум полезной информации, без воды за короткий промежуток времени.

    • @user-um2eu1dy8t
      @user-um2eu1dy8t 11 месяцев назад

      Как успехи ?

  • @Ruslantuber
    @Ruslantuber 2 года назад +2

    легкий сайт без защит, капчи и прочего. Удобная задача, но в реальности в основном замудренные задачи с тестами тьюринга... где реквест рассыпается и помогает только селениум и то, через костыли.

  • @user-iy6vk4pn1j
    @user-iy6vk4pn1j 3 года назад +1

    Заменить группу символов в слове. Довольно удобно
    New_word = "".join([i if i not in ("b", "a", "n", "l", "e", "t", "r" ) else "_" for i in old_word])

  • @agrxlol
    @agrxlol Год назад

    Вопрос по дальнейшей публикации данных через wordpress: есть ли какой-то разбор, как это напарсенное (для статей например с использованием advanced custom fields) разместить на сайте с помощью питона?

  • @dodo-ip2hd
    @dodo-ip2hd 2 года назад +4

    Здравствуйте, не могли бы вы подсказать сайты подобные на представленному в уроке (он сейчас не доступен)

  • @nikitabbrv5947
    @nikitabbrv5947 3 года назад

    Спасибо за видео! Подскажи, а зачем нужен Scrapy или Selenium например?
    блин, пока писал, увидел что на канале есть видео о Seleniume)))

    • @PythonToday
      @PythonToday  3 года назад

      Благодарю за фидбэк. Scrapy сильная библиотека для скрапинга. А Selenium преимущественно инструмент для тестирования.

  • @takiekakmi7532
    @takiekakmi7532 2 года назад

    У меня возможно тупой вопрос, но все-же: есть ли какой-то вариант прикрутить декоратор не к результату функции, а к итерации цикла for в ней (чтобы не писать в теле функции переменные со счётчиком итерации, а вынести это все в декоратор)????

  • @Zizya1486
    @Zizya1486 3 года назад +24

    - удалит все теги в тексте.

  • @MrSunchezz
    @MrSunchezz 3 года назад +2

    Использовать 'Requests' в век асинхронного Python, под музыкальный фон уроков от ХоудиХо...
    Да, это работает, но интересно уже что-то новое видеть, учитывая исключительно I/O-bound задачу.

    • @user-zz1ev4hu5l
      @user-zz1ev4hu5l 2 года назад

      ничего плохого в том, что автор вдохновился, уже всем известным ХаудиХо

  • @ve2376
    @ve2376 3 года назад +1

    Итак, мы вместе выполнили заказ на фрилансе, где получать свою долю? :)
    *Спасибо за полезную информацию.

    • @PythonToday
      @PythonToday  3 года назад +1

      Благодарю за фидбэк!

  • @Djamal2004
    @Djamal2004 Год назад

    Музыка качает

  • @ivanzozulia8857
    @ivanzozulia8857 Год назад

    Ребят, видео супер. Подскажите пожалуйста на моменте 14:09 при сохранении файлов (html) в папку, сохраняет в папку только один файл (последний) на странице, в чем может быть ошибка?

  • @plushfly900
    @plushfly900 3 года назад +10

    with open("projects.html", "w", encoding="utf-8") as file:
    file.write(req.text) - оставлю тут. Думаю не у меня одного будет ругаться на кодировку файла.

    • @PythonToday
      @PythonToday  3 года назад +1

      У всех, кто на windows)

    • @plushfly900
      @plushfly900 3 года назад

      @@PythonToday ну так ведь общее количество переглядывающих это обычные пользователи...а не владельцы маков))
      Было бы круто если бы нашлось время про гугл драйв API так как в реальности разбираю и понимаю что все западные за него на базовом уровне чисто для пиара..а на деле сидишь сам ботанишь методом проб и ошибок..)

    • @Dan-er9vf
      @Dan-er9vf 2 года назад +1

      Ты лучший

  • @user-lc2zz4cn3x
    @user-lc2zz4cn3x 2 года назад

    Привет, как сделать такой же перенос длинных ссылок как на 16:24. При Hard wrap 120 и Wrap on tayping при вставке не делает перенос, только если пробелы поставить вручную

  • @alexlotion5055
    @alexlotion5055 Год назад +1

    Решил попробовать собрать информацию с сайта Animego. Почему-то html страниц собираемый парсером отличается от того что пишется в браузере и фактически отображается на страницах.

  • @Fiz_kent23
    @Fiz_kent23 2 месяца назад

    А на какой платформе вы принимаете задания от клиентов и актуально ли это сейчас?

  • @jokaharu7219
    @jokaharu7219 Год назад

    Красиво!

  • @6blctpo_cnatb464
    @6blctpo_cnatb464 Год назад

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

  • @pythonx8732
    @pythonx8732 3 года назад +1

    Здравствуйте еще раз, помогите пожалуйста. Есть сайт госреестр.рф там при поиске урл не меняется. а мне нужно парсить его. Как это реализовать? Заранее спасибо

  • @sjotik
    @sjotik 2 года назад +2

    Круто, спасибо. Но вопрос: сайт динамический и данные в нем добавляются. Как только пагинаций станет более 23-х результат будет неполный. Возможно ли кодом написать проверку на поиск последнего индекса пагинации? Было бы интересно посмотреть реализацию такой логики, чтобы парсеру было "пофиг" на изменение количества позиций-записей и он работал долго и счастливо)).
    А в целом ОГРОМНОЕ спасибо!!! Тема парсинга очень широка и дает много возможностей для воплощения идей в реальность.

    • @romanbond1060
      @romanbond1060 2 года назад

      цикл while true / break и внутри try/except и проверку на ответ сервера или наличие данных

    • @imfiwile8995
      @imfiwile8995 Год назад

      Можешь попробовать через проверку status_code сделать, если на сайте 404 код отправляется, когда за пагинацию выходишь
      Или через try/except отлавливать, когда нет контента на странице и прекращать парсинг

  • @ffonlfoff5005
    @ffonlfoff5005 Год назад

    Приветствую. А как вы клиенту данный код передавали? упаковывали в ехе? или это разовая работа и вы передали только файлы с результатом?

    • @k2d4e60
      @k2d4e60 Год назад

      Честно говоря, я тоже ещё не понимаю как передавать готовые проекты заказчику, если как нибудь в конце видео это было бы озвучено, было бы вообще супер

  • @pishy_kommentu
    @pishy_kommentu 2 года назад +5

    Пожалуйста, кто-нибудь может написать под этим комментарии ссылку на сайт? Я не могу его найти.

  • @user-kw1fv1dj4y
    @user-kw1fv1dj4y 3 года назад

    На 3:20 вы говорите -"воспользуемся поиском..." вы какие-то горячие клавиши используете для открытия поисковой строчки? Я тоже пользуюсь пайчармом.

  • @user-ym3yt1uq7s
    @user-ym3yt1uq7s Год назад

    подскажите пожалуйста столкнулся с такой ошибкой при попытке распарсить сайт: return codecs.charmap_decode(input,self.errors,decoding_table)[0]
    UnicodeDecodeError: 'charmap' codec can't decode byte 0x98 in position 1583: character maps to
    проблема в кодировке страницы, посоветуйте что-нибудь?

  • @JohnDoe-hp5kw
    @JohnDoe-hp5kw 2 года назад

    Давно вы этим занимаетесь?)
    Я попытался спарсить ТИК ТОК, что бы узнать количество видео у пользователя, но с пагинацией у меня так ничего и не получилось, я не нашел там такого и не понял как прокручивать страницы
    Может сможете подсказать что-то? Буду очень благодарен
    PS
    Я совсем новичок, если что)

  • @daddy_eddy
    @daddy_eddy 2 года назад +8

    Все, не работает больше ссылка на тот сайт. Тренировки закончены.

    • @myata04
      @myata04 Год назад

      Нет, можно найти сайт, где в конце страницы есть кнопка - показать еще, или перейти в этот же сайт, и нажать например: Тесты, в ссылке в конце подставляя: "?page-2", забыл. Можешь посмотреть сам, посмотрев код кнопки - показать еще, и перейти по его href ссылке в коде, и сверху будет в ссылке написано - ?page-2

  • @inosensey6893
    @inosensey6893 3 года назад +1

    Классный видос, только зачем тут selenium? Он не использовался в коде

  • @squidwardtentacles7724
    @squidwardtentacles7724 Год назад +1

    а как быть если это уже совершенно другой сайт, не тот что в ролике?

  • @raufauf3979
    @raufauf3979 2 года назад

    привет, не могу понять, в каком формате нужно скидывать заказчикам заказ? Просто выходные файлы или саму программу (exe)?

    • @PythonToday
      @PythonToday  2 года назад

      Приветствую, все зависит от ТЗ. Кому то просто скрипт, кому на сервер закинуть и настроить или веб интерфейс парсера на Django. Бывали и exe.

    • @raufauf3979
      @raufauf3979 2 года назад

      @@PythonToday спасибо большое)

  • @Oskar-oskar
    @Oskar-oskar 2 года назад

    Отличное видео! У меня только один вопрос, как открыть поиск по коду в структуре сайта ?

    • @PythonToday
      @PythonToday  2 года назад +1

      Благодарю за фидбэк! Так же почти во всех программах CTRL + F

  • @user-cm6jg8vu2g
    @user-cm6jg8vu2g День назад

    Бро, учился парсингу по твоим роликам. Хотел устроиться в одну конторку для написания парсеров. В качестве тестового задания писал парсер с яндекс-карт. В итоге получил отказ по причине того, что код слишком базовый. Как выглядит НЕбазовый код - загадка.

  • @maximgordeev601
    @maximgordeev601 3 года назад

    Спасибо за ваши видео! Есть вопрос, а если на сайте для появления доп информации надо нажать кнопку , но при этом ни чего в строку адреса не передается. Как тогда быть? например как тут mosecom. mos. ru/zelenograd-16/ это сайт мос эко мониторинга и для того чтоб отображались все показатели воздуха надо нажать кнопку. Можете подсказать в какую сторону гуглить, хоть примерно :)

    • @PythonToday
      @PythonToday  3 года назад +1

      Смотреть в network куда, какой и с какими параметрами запрос уходит. Откуда то ведь данные приходят

  • @musicforyou1380
    @musicforyou1380 7 месяцев назад

    4:05...всё идет по плану. Знал бы автор, что это за выражение будет вскоре...

  • @bambimbambas
    @bambimbambas 3 года назад

    Очень прошу вас помочь. Я запутался. Я писал всё по вашему примеру, но более структурировал код и запутался, когда в игру вошла пагинация.
    Я разделил проект на два файла: файл, который проверяет страницу на 200ый респонс, и осовной файл.
    Проблема в том, что я не понимаю как и куда впихнуть ссылку с пагинами, взятую из вкладки "сеть" в консоли разраба - получается список, в котором 9 словарей по 23 одинаковых экземпляра.
    Вот файл, который проверяет респонсе:
    import requests
    from bs4 import BeautifulSoup
    from fake_useragent import UserAgent
    def get_html_tree(url):
    headers = {'user-agent': UserAgent().Chrome}
    html = requests.get(url, headers)
    if html.status_code == 200:
    soup = BeautifulSoup(html.text, 'lxml')
    return {'html': html.text, 'soup': soup}
    raise Warning('HTML страница не отвечает.')
    Вот основной файл:
    from html_page import get_html_tree
    HOST = 'www.edutainme.ru/edindex'
    URL = 'www.edutainme.ru/edindex/ajax.php?params=%7B%22LETTER%22%3Anull%2C%22RESTART%22%3A%22N%22%2C%22CHECK_DATES%22%3Afalse%2C%22arrWHERE%22%3A%5B%22iblock_startaps%22%5D%2C%22arrFILTER%22%3A%5B%22iblock_startaps%22%5D%2C%22startups%22%3A%22Y%22%2C%22SHOW_WHERE%22%3Atrue%2C%22PAGE_RESULT_COUNT%22%3A9%2C%22CACHE_TYPE%22%3A%22A%22%2C%22CACHE_TIME%22%3A0%2C%22TAGS_SORT%22%3A%22NAME%22%2C%22TAGS_PAGE_ELEMENTS%22%3A%22999999999999999999%22%2C%22TAGS_PERIOD%22%3A%22%22%2C%22TAGS_URL_SEARCH%22%3A%22%22%2C%22TAGS_INHERIT%22%3A%22Y%22%2C%22SHOW_RATING%22%3A%22Y%22%2C%22FONT_MAX%22%3A%2214%22%2C%22FONT_MIN%22%3A%2214%22%2C%22COLOR_NEW%22%3A%22000000%22%2C%22COLOR_OLD%22%3A%22C8C8C8%22%2C%22PERIOD_NEW_TAGS%22%3A%22%22%2C%22DISPLAY_TOP_PAGER%22%3A%22N%22%2C%22DISPLAY_BOTTOM_PAGER%22%3A%22N%22%2C%22SHOW_CHAIN%22%3A%22Y%22%2C%22COLOR_TYPE%22%3A%22Y%22%2C%22WIDTH%22%3A%22100%25%22%2C%22USE_LANGUAGE_GUESS%22%3A%22N%22%2C%22PATH_TO_USER_PROFILE%22%3A%22%23SITE_DIR%23people%5C%2Fuser%5C%2F%23USER_ID%23%5C%2F%22%2C%22SHOW_WHEN%22%3Afalse%2C%22PAGER_TITLE%22%3A%22%5Cu0420%5Cu0435%5Cu0437%5Cu0443%5Cu043b%5Cu044c%5Cu0442%5Cu0430%5Cu0442%5Cu044b+%5Cu043f%5Cu043e%5Cu0438%5Cu0441%5Cu043a%5Cu0430%22%2C%22PAGER_SHOW_ALWAYS%22%3Atrue%2C%22USE_TITLE_RANK%22%3Afalse%2C%22PAGER_TEMPLATE%22%3A%22%22%2C%22DEFAULT_SORT%22%3A%22rank%22%2C%22noTitle%22%3A%22Y%22%7D&'
    def get_links_pages_projects(url):
    code = get_html_tree(url)
    articles = code['soup'].find('div', class_='threeColumn').find_all('article', class_='listItem')
    links_to_projects = []
    for article in articles:
    link = url[:-8] + article.find('div', class_='txtBlock').find('a', class_='absolute').get('href')
    links_to_projects.append(link)
    print(links_to_projects)
    return links_to_projects
    def all_info_about_projects(host, url):
    projects_data_list = []
    counter_pages = 1
    while True:
    pagination = get_html_tree(url + f'&PAGEN_1={counter_pages}&PAGEN_2={counter_pages}')['soup']
    if pagination.find('div') == None:
    break
    print(f'Parsing page number {counter_pages}')
    counter_projects = 1
    for project in get_links_pages_projects(host):
    print(project)
    print(f'. . . . Parsing project number {counter_projects}')
    project_split = project.split('/')[:-1]
    html_and_soup = get_html_tree(project)
    with open(f'Info_Pages/{project_split[-1]}.html', 'w', encoding='utf-8') as file:
    file.write(html_and_soup['html'])
    try:
    project_logo = project[:-1] + html_and_soup['soup'].find('div', class_='Img logo').find('img').get('src')
    except AttributeError:
    project_logo = 'No Logo'
    try:
    project_name = html_and_soup['soup'].find('div', class_='txt').find('h1').get_text()
    except AttributeError:
    project_name = 'No title'
    try:
    project_header = html_and_soup['soup'].find('h4', class_='head').get_text()
    except AttributeError:
    project_header = 'No title 4'
    try:
    project_website = html_and_soup['soup'].find('div', class_='txt').find('p').find('a').get('href')
    except AttributeError:
    project_website = project
    try:
    project_description = html_and_soup['soup'].find('div', class_='textBlock').find('div', class_='rBlock').find('p').get_text()
    except AttributeError:
    project_description = 'No description'
    projects_data_list.append({
    'project_logo': project_logo,
    'project_name': project_name,
    'project_header': project_header,
    'project_website': project_website,
    'project_description': project_description
    })
    counter_projects += 1
    counter_pages += 1
    print(projects_data_list)
    all_info_about_projects(HOST, URL)
    И да, у меня без записи в жсон файл, так как пока что данные не верны. Очень жду ваш ответ. Спасибо !!!

  • @user-xn2nu6nc7y
    @user-xn2nu6nc7y 3 года назад

    Отличная рубрика, спасибо! Недавно я задался вопросом, любой ли сайт можно спарсить через запросы без использования Selenium? Кто знает - ответьте, буду очень признателен)

    • @th-Happy
      @th-Happy 3 года назад +1

      Нет не любой к сожалению есть сайты в которых весь контент формируется через Java Script например сайт FlashScore. Если парсить с селеном то очень много ресурсов нужно для загрузки. С данным сайтом requests бесполезен.

    • @makedatauseful1015
      @makedatauseful1015 2 года назад

      @@th-Happy в начале года ломал голову как его распарсить запросами, получилось только селениум. сейчас скрипт работает на сервере и парсит flashscore, затем уведомления в телегу присылает, удобная вещь

  • @user-do5my2xl5q
    @user-do5my2xl5q Год назад

    Все неплохо, но хардкодить количество страниц не хорошо. Можно проходить по страницам до тех пор, пока они открываются и есть контент

  • @evgeniiwjay6177
    @evgeniiwjay6177 2 года назад

    Всем добрый день. не могу разобраться почему при данном коде images = soup.find_all('div', class_='carousel__item custom-carousel__item').find('a').get('href') выдает ошибку AttributeError: ResultSet object has no attribute 'find'? помогите плз

  • @squidwardtentacles7724
    @squidwardtentacles7724 2 года назад

    @PythonToday, в первом уроке изучали методы, все было хорошо, но уже со второго урока начались задания на фрилансе и я больше половины не понимаю че вообще происходит, как учиться ? мне очень нравится твоя подача и твои видосы

    • @mkalalaka
      @mkalalaka Год назад

      смотришь код, читаешь мануалы по командам, которые используются. конструкции в коде очень простые, ничего военного, никакого ООП и прочей ереси.

    • @forraz2286
      @forraz2286 Год назад

      Поздно, конечно, но чтобы писать на питоне его нужно сначала "выучить". Разве нет?

    • @squidwardtentacles7724
      @squidwardtentacles7724 Год назад

      @@forraz2286 про методы я имею в виду .find & .find_all и что в задании на фрилансе совсем другое и уровень резко поднимается

  • @andreygrishin3303
    @andreygrishin3303 Год назад

    помогите, пожалуйста, понять!)
    второе видео к ряду задаюсь вопросом, зачем при записи сформированного списка в .json файл используется флаг "a"? ведь выглядит логичней "w".. что я упускаю?

    • @andreygrishin3303
      @andreygrishin3303 Год назад

      @Ender Dragon так, судя по коду, в любом случае при каждом запуске происходит наполнение списка и дальнейшая запись в json, что при "a" варианте многое просто задублирует. да и автор перед каждым новым запуском удалял все файлы.. вопрос остался открытым) возможно я ищу проблему там, где её нет и это просто привычка автора и не более..

  • @TheAsbor
    @TheAsbor 2 года назад

    А если get запросов при добавлении элементов нет? В network добавляются только png файлы. Такой сайт можно как то спарсить? Или только Selenium?

    • @VItoSRostov
      @VItoSRostov 2 года назад

      Вы не разобрались? пытался для практики спарсить сайт dns-shop, но в network только картинки

    • @TheAsbor
      @TheAsbor 2 года назад +2

      @@VItoSRostov Не разобрался, селениум пошел изучать

    • @VItoSRostov
      @VItoSRostov 2 года назад

      @@TheAsbor я тоже изучаю python, и мне он кажется легким. Одному скучновато, да и не с кем делиться достижениями, нет желания создать дискорд чат или телеграм, чтобы общаться и делиться идеями. В двоем веселее будет

  • @affinozt2319
    @affinozt2319 Год назад

    12:14 - *Cоздание список*

  • @Alex-hh5oe
    @Alex-hh5oe 3 года назад +1

    У меня после после сохранения файла html кириллица отображается в виде вопросительных знаков. Как можно подкрутить кодировку, чтобы это исправить? Заранее спасибо!

    • @PythonToday
      @PythonToday  3 года назад

      Добавь при сохранении файла параметр encoding="utf-8"

  • @Gast1_GAME-gg5ro
    @Gast1_GAME-gg5ro Месяц назад +1

    Почему у нас выходит ошибка "name error url"?

  • @TheUchihaSamara
    @TheUchihaSamara 2 года назад +2

    Классный и полезный контент!
    Не подскажите, как можно получить класс по точному совпадению вместо частично? Например, я хочу получать только class_name_main, исключая class_name_main base и class_name_main hide.

    • @kutsokon
      @kutsokon 2 года назад +1

      Если что, тег с классом class_name_main base относится к 2 классам: class_name_main и base. Как вариант, можно получить все теги с нужным классом через find_all, и проверять полное значение класса через get(‘class’)

    • @TheUchihaSamara
      @TheUchihaSamara 2 года назад

      @@kutsokon 4 месяца прошло, но спасибо)

    • @kutsokon
      @kutsokon 2 года назад +1

      @@TheUchihaSamara лучше поздно, чем никогда :)

    • @mkalalaka
      @mkalalaka Год назад

      посмотри метод .select() вместо .find_all. Select использует механизм поиска такой как селекторы в CSS. я уже не помню точно как они работают, но может через них можно задавать точное соответствие.

  • @oshstreet610
    @oshstreet610 3 года назад

    почему в прошлом уроке было headers=headers а в это просто headers?
    заранее благодарю за ответ !

    • @PythonToday
      @PythonToday  3 года назад +1

      Почитай про именованные аргументы. Посмотри под капот к методу get и посмотри какие параметры он принимает. В данном случае разницы не было