Таймкоды для вас: 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-el5bi4 жыл бұрын
Опять годнота)
@matrixxd6842 Жыл бұрын
я не понимаю как сделать терминал как у тебя у меня там PS C:\Users\User\Desktop> вот так выходит я пишу как у тебя но все ровно не получается
@ОлександрБуланов-ы2е2 жыл бұрын
Я понимаю что код написан быстро, но для новичков нужно будет учесть несколько не критичных, но ошибок в коде: 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 Жыл бұрын
Вроде всё верно, кроме имени переменной responSe😊
@СергейПоляков-м5х Жыл бұрын
Спасибо, друг
@SAVSAV1212 Жыл бұрын
А как называется ошибка, связанная с прерыванием программы Ctrl + C?
@ОлександрБуланов-ы2е Жыл бұрын
@@SAVSAV1212 KeyboardInterrupt
@Jon_Britva8 ай бұрын
09:40 - Try except: отдельное спасибо за огромную подсказку
@pythonx87324 жыл бұрын
Уроки очень классные, только одна просьба можете ТЗ показывать, было бы очень интересно
@РусланСабитов-и2ь3 жыл бұрын
Круто подметили
@DrZlad2 жыл бұрын
А вот тут то и начинается настоящее искусство - транслировать- тз.
@begula_chan2 жыл бұрын
Искренне благодарю за видео. Было очень полезно узнать про динамический сбор данных со страницы. Постараюсь сделать что-то похожее на вашу программу, уж очень мне нравится делать парсеры. Когда начну работать на фрилансе, первым делом поддержу вас и ваш канал копеечкой за неоценимый труд.
@aeca42844 жыл бұрын
Без слов, это было четко, ясно, понятно, КРАСИВО!
@tenebris88004 жыл бұрын
шикарные видосы продолжай пожалуйста)))
@takiekakmi75323 жыл бұрын
Это было круто! Сначала - все казалось огромным драконищем, а оказалось - дело разбора на 2-3 дня. Пасяб - теперь можно топать выполнять заказы👍)
@PythonToday3 жыл бұрын
Благодарю за фидбэк!
@squidwardtentacles77242 жыл бұрын
как вы разбирали видео? гуглили что делает каждая строчка?
@takiekakmi75322 жыл бұрын
@@squidwardtentacles7724 нет конечно) код же весьма логичен. А вообще - самый простой способ - повторить, разбить на функции и написать тесты. И, разумеется, смотреть в документацию периодически
@squidwardtentacles77242 жыл бұрын
@@takiekakmi7532 как успехи сегодня в парсинге? Вы еще учитесь? я ищу себе единомышленников, я подросток с хромой базой Python(нужно повторить темы ООП, методов и функций), хочу научиться парсингу и ищу единомышленников
@kostya22222 жыл бұрын
@@squidwardtentacles7724 Тоже подросток, и желаю научиться парсингу) мыслим мы одинаково
@NickKirieiev2 жыл бұрын
Для домашнего задания кто занимается доработайте код так что бы он обрабатывал не 23 страницы а все с учётом того что могут быть добавлены страницы. Очень интересное видео. Автору спасибо.
@ЕгорСауткин-щ6г3 жыл бұрын
Ты чёртов гений, я с этой пагинацией мучаюсь 2-ой день, всякие видео смотрю, stackoverflow чекаю, нихрена не помогало, ну не работало и всё, зашёл к тебе, а тут, просто тупо через request запрос делаешь и всё, никакие параметры не нужны, отличные гайды, просто идеальные.
@PythonToday3 жыл бұрын
Благодарю за фидбэк 💪
@ЕгорСауткин-щ6г3 жыл бұрын
@@Александр_1-й, там вроде все продукты на flex блоках, кстати не знаете как парятся подобные вещи?
@ruservices4 жыл бұрын
Супер!!! Смотреть одно наслождение. Видна рука проффесионала. Спасибо за видео!
@PythonToday4 жыл бұрын
Благодарю 😀 Но я только учусь, и делюсь опытом. Далеко не профессионал
@МаковыйРулет-э2щ4 жыл бұрын
Ты большой молодец! Спасибо тебе
@PythonToday4 жыл бұрын
Спасибо за фидбэк
@Koshsky-f7y4 жыл бұрын
@@PythonToday реально красавца!!
@crussaider3 жыл бұрын
Все по классике: сначала написал код, потом решил посмотреть гайд. Хорошо, что мой код пока что никто не видел))
@PythonToday3 жыл бұрын
Да всё ок, это самая лучшая практика!
@ПавелСтодумов3 жыл бұрын
допарсились. нет больше этого сайта))
@DiMoNy4 Жыл бұрын
Этот сайтик был из тех, кто просто любил жизнь...
@SherinYuri8 ай бұрын
Сайт есть, но он изменился. Ну тем интереснее. Будем его изучать. Не все же время готовое списывать. ))))
@makedatauseful10153 жыл бұрын
с помощью вашего канала зашел в программирование, большое спасибо
@PythonToday3 жыл бұрын
Уууу, поздравляю. Главное практика, успехов 👍
@DenisE251002 жыл бұрын
Вы молодец. Не надо бояться делиться знаниями. Правда молодец. 😊
@set1qs Жыл бұрын
Как же ты меня мотивируешь ) я кажется знаю чем буду заниматься) именно парить, очень красиво получается!
@PythonToday Жыл бұрын
"Парить" - это что-то другое) Спасибо за фидбэк! Рад что видео интересны.
@set1qs Жыл бұрын
@@PythonToday опечатка :))) именно парсить 🤗
@3310-s4u4 жыл бұрын
Очень круто и понятно объясняешь Я давно такой канал искал Желаю успехов
@PythonToday4 жыл бұрын
Спасибо 💪 Главная награда, мотивирует продолжать
@HeyArtem3 жыл бұрын
Как всегда, только самое нужное и интересное, без воды!!!
@PythonToday3 жыл бұрын
Спасибо большое за фидбэк!
@alinaveter73713 жыл бұрын
@@PythonToday, огромное спасибо за ролики, очень полезная информация при обучении! Подскажите пожалуйста, нет ли у вас на примете аналогичного сайта? Просто текущий уже не работает...( Я взяла изначально на пробу другой динамический сайт, но при парсинге первой странице нет ни единого элемента, т.е. пусто на странице до первого движения колесиком
@ЮрийБлинов-л5м3 жыл бұрын
Нормальный, детальный обзор, с боевым проектом, где есть сложности и нюансы, такие как несколько страниц, запросы вложенные. Кстати хорошая тема просто сохранять как HTML страницы, тогда будут обычные HTML без json запросов и грязи) отличные урок продолжай, надо денежкой тебя отблагодарить !
@PythonToday3 жыл бұрын
Благодарю!
@ЮрийБлинов-л5м3 жыл бұрын
@@Александр_1-й Коммент был для благодарности, за разъяснение логики парсинга, нежели самой технологии и еще как первый учебный проект на python, так как в основном пишу на js, php. Лично для меня по удобству конечно js лучше, я с него могу парсить все что мне надо используя puppeteer и тор браузер для обхода блокировок, а на счет кода выше, да думаю вы скорее всего правы, так как этот код не везде применим, но это скорее пособие для новичков)
@ЮрийБлинов-л5м3 жыл бұрын
@@Александр_1-й все же еще и от самого тз зависит, есть парсинги вообще которые обрабатывают тучу страниц и преобразуют их в отдельные файлы
@road2zion24 жыл бұрын
Отличное видео! Спасибо! Продолжай обязательно!
@PythonToday4 жыл бұрын
Благодарю за фидбэк
@ZinFuku2 жыл бұрын
Благодарю! Очень интересно и понятно объясняешь!
@Zizya14864 жыл бұрын
- удалит все теги в тексте.
@МихаилПаскин-ю5о2 жыл бұрын
Отличные уроки !!!! Если будете работаете на фрилансе не могли бы сделать новые уроки , на новых сайтах будет понятнее.
@amurlamur31253 жыл бұрын
Я вообще дизайнер, но приятно порабить под твои видосы
@BorisenkoV893 жыл бұрын
Отличная подача материала. Спасибо большое
@PythonToday3 жыл бұрын
Благодарю за фидбэк 👍
@akovemil95282 жыл бұрын
Спасибо!)Вдохновляешь! Мб...вопросы такие: 1)был ли опыт работы с прокси-серверами для парсинга? 2) имеется ли опыт обхода блокировок сайта для парсинга (блокировка по IP)? Будет ли видос по данным темам?
@denys59512 жыл бұрын
Спасибо за очень качественный контент
@radmirsharifullin57702 жыл бұрын
Отличный урок! Спасибо!
@PythonToday2 жыл бұрын
Благодарю!
@Ruslantuber3 жыл бұрын
легкий сайт без защит, капчи и прочего. Удобная задача, но в реальности в основном замудренные задачи с тестами тьюринга... где реквест рассыпается и помогает только селениум и то, через костыли.
@leonidasspartasson97594 жыл бұрын
Хотелось бы видеть побольше объектов, дабы переиспользовать их по нужде . А так всё супер.
@alexanderchemeza1772 Жыл бұрын
Если известна ссылка и необходимо менять число, лучше использовать while, выход по получению кода 404. Да и толка от записи html нет. Но для понимания основ сойдет
@iuriibuga53832 жыл бұрын
Огромное спасибо автору!!!!
@pishy_kommentu3 жыл бұрын
Пожалуйста, кто-нибудь может написать под этим комментарии ссылку на сайт? Я не могу его найти.
@ЕвгенийПетров-и4в2р4 жыл бұрын
Годно!
@plushfly9003 жыл бұрын
with open("projects.html", "w", encoding="utf-8") as file: file.write(req.text) - оставлю тут. Думаю не у меня одного будет ругаться на кодировку файла.
@PythonToday3 жыл бұрын
У всех, кто на windows)
@plushfly9003 жыл бұрын
@@PythonToday ну так ведь общее количество переглядывающих это обычные пользователи...а не владельцы маков)) Было бы круто если бы нашлось время про гугл драйв API так как в реальности разбираю и понимаю что все западные за него на базовом уровне чисто для пиара..а на деле сидишь сам ботанишь методом проб и ошибок..)
@Dan-er9vf3 жыл бұрын
Ты лучший
@dodo-ip2hd3 жыл бұрын
Здравствуйте, не могли бы вы подсказать сайты подобные на представленному в уроке (он сейчас не доступен)
@affinozt23192 жыл бұрын
12:14 - *Cоздание список*
@selviont84434 жыл бұрын
Автоматизация рутинных задач с помощью Python. Там хорошо объяснена тема регулярных выражений
@PythonToday4 жыл бұрын
Благодарю 💪
@deniskononov27084 жыл бұрын
Плюсую! Если кому надо в электронном виде: yadi.sk/i/QmwgS3erpfADjw Если ссылки не желательны, удалю
@bigmek4051 Жыл бұрын
То чувство, когда видео длится 20 минут, а на его понимание, повторение о осознание всех процессов в коде тратишь часа по 3 ) Не так давно начал заниматься Python, освоил базу на каком-то бесплатном курсе, решил что будет интересно попробовать себя именно в этой сфере. Как практика Ваши уроки крайне полезны, хоть и не просты, этого не отнять 😅
@PythonToday Жыл бұрын
Большое спасибо за фидбэк! За каждым видео стоят десятки часов работы. В том и смысл, дать максимум полезной информации, без воды за короткий промежуток времени.
@ProgrammingBro-e9t Жыл бұрын
Как успехи ?
@artpro91914 жыл бұрын
Молодец. Растешь)
@ЕрмолинНикита-у7м2 жыл бұрын
Супер! Спасибо за инфу!)
@vitaliyhusti3 жыл бұрын
Спасибо огромнейшее за видео!
@PythonToday3 жыл бұрын
Спасибо за фидбэк!
@ИванЛюбаев-й5к3 жыл бұрын
Привет, как сделать такой же перенос длинных ссылок как на 16:24. При Hard wrap 120 и Wrap on tayping при вставке не делает перенос, только если пробелы поставить вручную
@GreekkAlex3 жыл бұрын
отличный урок! спасибо за гайд!👍🤘
@PythonToday3 жыл бұрын
Благодарю за фидбэк 💪
@alexlotion5055 Жыл бұрын
Решил попробовать собрать информацию с сайта Animego. Почему-то html страниц собираемый парсером отличается от того что пишется в браузере и фактически отображается на страницах.
@dimamalyk86084 жыл бұрын
Ролик оказался полезным, хотелось бы новую вершину, например парсинг Ютуба. К примеру, выгрузка комментов с видео.
@PythonToday4 жыл бұрын
Благодарю. У ютуба есть своё api, которое позволяет доставать много данных. Можно попробовать использовать его. По парсингу ютуба точно видео не будет. Чревато
@Gast1_GAME-gg5ro8 ай бұрын
Почему у нас выходит ошибка "name error url"?
@squidwardtentacles77242 жыл бұрын
а как быть если это уже совершенно другой сайт, не тот что в ролике?
@jackmetropolitan78453 жыл бұрын
ТОП Контент!!! Спасибо.
@PythonToday3 жыл бұрын
Благодарю!
@ajira82733 жыл бұрын
Спасибо за очень познавательный урок! Но вот возник вопрос, я правильно понимаю, что парсер захардкожен на 23 страницы? У заказчика в будущем не возникнут проблемы, когда сайт перевалит за 23 страницы?
@АлександрВыскребцев3 жыл бұрын
Это круто!!
@PythonToday3 жыл бұрын
Спасибо!
@MrSunchezz4 жыл бұрын
Использовать 'Requests' в век асинхронного Python, под музыкальный фон уроков от ХоудиХо... Да, это работает, но интересно уже что-то новое видеть, учитывая исключительно I/O-bound задачу.
@ПавелСеребренников-п5н3 жыл бұрын
ничего плохого в том, что автор вдохновился, уже всем известным ХаудиХо
@r1-yzf216 Жыл бұрын
благодарю Вас за труд!
@PythonToday Жыл бұрын
Благодарю за фидбэк!
@r1-yzf216 Жыл бұрын
@@PythonToday как с Вами связаться, у меня есть предложение к Вам
@ivanzozulia8857 Жыл бұрын
Ребят, видео супер. Подскажите пожалуйста на моменте 14:09 при сохранении файлов (html) в папку, сохраняет в папку только один файл (последний) на странице, в чем может быть ошибка?
@Fiz_kent239 ай бұрын
А на какой платформе вы принимаете задания от клиентов и актуально ли это сейчас?
@АлександрБельтипетеров3 жыл бұрын
Может здесь это сообщение увидят. Не получается собрать данные с сайта криптовалют coinmarketcap (это пример из старого курса по парсингу, тогда сайт работал иначе). На этом сайте есть 100 позиций на каждой странице, там вся информация по валютам, так вот удаётся собрать информацию только с первых 10 позиций, а дальше программа возвращает пустые значения, потому что остальные позиции подгружаются в процессе скроллинга страницы, но во вкладке Сеть ничего подобного как в этом видео нет, соответственно непонятно куда лезть и что делать, чтобы собирать данные с подобных сайтов. Прошу помощи у знающих людей, что это за явление и как с ним работать? Благодарю за внимание!
@pavelsaichkin77423 жыл бұрын
Спасибо за контент!
@PythonToday3 жыл бұрын
Благодарю за фидбэк!
@MrPavel12074 ай бұрын
большое спасибо за видео. маленький вопрос - при формировании json флаг 'a' не обязателен (мы вроде один раз весь словарь записываем) или я ошибаюсь?
@Koshsky-f7y4 жыл бұрын
Заменить группу символов в слове. Довольно удобно New_word = "".join([i if i not in ("b", "a", "n", "l", "e", "t", "r" ) else "_" for i in old_word])
@sinoikromov73223 жыл бұрын
Сайт обновили что нету страница стартапа
@pythonx87323 жыл бұрын
Здравствуйте еще раз, помогите пожалуйста. Есть сайт госреестр.рф там при поиске урл не меняется. а мне нужно парсить его. Как это реализовать? Заранее спасибо
@ДенисСюсин-р1е3 жыл бұрын
На 3:20 вы говорите -"воспользуемся поиском..." вы какие-то горячие клавиши используете для открытия поисковой строчки? Я тоже пользуюсь пайчармом.
@PythonToday3 жыл бұрын
ctrl + f ?
@agrxlol2 жыл бұрын
Вопрос по дальнейшей публикации данных через wordpress: есть ли какой-то разбор, как это напарсенное (для статей например с использованием advanced custom fields) разместить на сайте с помощью питона?
@sjotik2 жыл бұрын
Круто, спасибо. Но вопрос: сайт динамический и данные в нем добавляются. Как только пагинаций станет более 23-х результат будет неполный. Возможно ли кодом написать проверку на поиск последнего индекса пагинации? Было бы интересно посмотреть реализацию такой логики, чтобы парсеру было "пофиг" на изменение количества позиций-записей и он работал долго и счастливо)). А в целом ОГРОМНОЕ спасибо!!! Тема парсинга очень широка и дает много возможностей для воплощения идей в реальность.
@jackdaniel1272 жыл бұрын
цикл while true / break и внутри try/except и проверку на ответ сервера или наличие данных
@imfiwile8995 Жыл бұрын
Можешь попробовать через проверку status_code сделать, если на сайте 404 код отправляется, когда за пагинацию выходишь Или через try/except отлавливать, когда нет контента на странице и прекращать парсинг
@6blctpo_cnatb464 Жыл бұрын
Сайт, который вы выбрали для примера раскрытия темы имеет сильно другую конфигурацию. Посоветуйте подобный для практического разбора
@Simple-r4l4 жыл бұрын
Просто лучший!
@PythonToday4 жыл бұрын
Благодарю 💪
@Simple-r4l4 жыл бұрын
@@PythonToday скажи пожалуйста, мне нужно спарсить елемент, но он доступен только после нажатия кнопки, можешь снять ролик или подсказать здесь как решить эту проблему? Спасибо за труды
@PythonToday4 жыл бұрын
@@Simple-r4l Воспользуйся библиотекой Selenium(активно использовали в плейлисте по instagram боту), нажми на кнопку и забирай все, что нужно.
@Simple-r4l4 жыл бұрын
@@PythonToday Ахах, спасибо, даже не думал)
@СакенБоранкулов-е8л3 жыл бұрын
Ай красавчик
@PythonToday3 жыл бұрын
Большое спасибо!
@ve23763 жыл бұрын
Итак, мы вместе выполнили заказ на фрилансе, где получать свою долю? :) *Спасибо за полезную информацию.
@PythonToday3 жыл бұрын
Благодарю за фидбэк!
@AtomNuclearChannel4 жыл бұрын
Спасибо за поучительный видеоролик! Как всегда все понятно и подробно рассказано и показано!
@PythonToday4 жыл бұрын
Спасибо 👍
@НиколайБардаков-б5щ7 ай бұрын
Бро, учился парсингу по твоим роликам. Хотел устроиться в одну конторку для написания парсеров. В качестве тестового задания писал парсер с яндекс-карт. В итоге получил отказ по причине того, что код слишком базовый. Как выглядит НЕбазовый код - загадка.
@serpol4ik Жыл бұрын
Это очень кртуо!
@gowaw8344 жыл бұрын
спасибо все ясно, понятно.
@PythonToday4 жыл бұрын
Благодарю 💪
@Михаил-з1ь3д Жыл бұрын
Пробую парсить другой сайт по этому уроку. По get запросу получаю 404 в голове и центре, боди просто пустая. Пробую менять заголовки, пока не нашел решения, если кто знает подскажите куда капнуть)
@СергейНауменко-ь6н2 жыл бұрын
подскажите пожалуйста столкнулся с такой ошибкой при попытке распарсить сайт: return codecs.charmap_decode(input,self.errors,decoding_table)[0] UnicodeDecodeError: 'charmap' codec can't decode byte 0x98 in position 1583: character maps to проблема в кодировке страницы, посоветуйте что-нибудь?
@inosensey68933 жыл бұрын
Классный видос, только зачем тут selenium? Он не использовался в коде
@AmbassadorOfLogic3 жыл бұрын
блин, а че делать, если после операции на 2:54, у меня выдает javascript вместо html??
@Vladimir-re8xl3 жыл бұрын
расширение html указываете?
@ivankirshchin12282 жыл бұрын
хотел повторять за автором написание кода, но не смог, т.к. сегодня, 30 ноября 2022 сайт, который препарирует автор уже не такой :(
@alex-shitov2 жыл бұрын
Как я понял, сайт теперь не работает
@musicforyou1380 Жыл бұрын
4:05...всё идет по плану. Знал бы автор, что это за выражение будет вскоре...
@takiekakmi75323 жыл бұрын
У меня возможно тупой вопрос, но все-же: есть ли какой-то вариант прикрутить декоратор не к результату функции, а к итерации цикла for в ней (чтобы не писать в теле функции переменные со счётчиком итерации, а вынести это все в декоратор)????
@evgeniiwjay61772 жыл бұрын
Всем добрый день. не могу разобраться почему при данном коде images = soup.find_all('div', class_='carousel__item custom-carousel__item').find('a').get('href') выдает ошибку AttributeError: ResultSet object has no attribute 'find'? помогите плз
@zxcvvbnn3 жыл бұрын
а сайта-то нету(
@alexhovsepyan5333 Жыл бұрын
А мы не можем просто с классом взять тот элемент который нам нужен, а не взять родителя а потом нужный элемент?
@mikhail6188 Жыл бұрын
не удается получить доступ к сайту :(
@user-tp2cq7yq9g Жыл бұрын
у меня тоже :( надо залайкать тебя, чтобы наверх пробились наши проблемы
@user-tp2cq7yq9g Жыл бұрын
ну точнее как... Сай то у меня открылся а вот страница со всеми стартапами и их страницами в частности нет... У тебя также?
@mikhail6188 Жыл бұрын
По всей видимости его не вернут, смотрим запоминаем, переходим к следующему уроку, я, например, парсил на свой выбор, и перешёл к следующему уроку
@user-tp2cq7yq9g Жыл бұрын
@@mikhail6188 Я тоже. Тем более следующий урок тоже с динамически подгружаемыми данными...
@ИванИванов-ш1ш1й3 жыл бұрын
как взять с одного сайта какую та инфу и автоматом выложить её на другом? дайте кто ни бдуь ссылку на такое видео. или скажите кк оно называется, это явно ен парсинг.
@arhigeneral3 жыл бұрын
Начал недавно смотреть эти ролики, у меня у одного сайт который в видео не работает?
@abdumannonmurodiy3 жыл бұрын
Здраствуйте можете подсказать как получить свой --access token
@PythonToday3 жыл бұрын
Привет, о каком -access token идет речь?
@abdumannonmurodiy3 жыл бұрын
@@PythonToday я имел ввиду как можно получит токен через cookie
@Alex-hh5oe4 жыл бұрын
У меня после после сохранения файла html кириллица отображается в виде вопросительных знаков. Как можно подкрутить кодировку, чтобы это исправить? Заранее спасибо!
@PythonToday4 жыл бұрын
Добавь при сохранении файла параметр encoding="utf-8"
@illuminate31512 жыл бұрын
а зачем передавать заголовки headers?
@ВладимирВермутов Жыл бұрын
слушай друг подскажи где ты такие адекватные заказы находишь))
@bambimbambas4 жыл бұрын
Очень прошу вас помочь. Я запутался. Я писал всё по вашему примеру, но более структурировал код и запутался, когда в игру вошла пагинация. Я разделил проект на два файла: файл, который проверяет страницу на 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) И да, у меня без записи в жсон файл, так как пока что данные не верны. Очень жду ваш ответ. Спасибо !!!
@Andrey_Grishin_primera77902 жыл бұрын
помогите, пожалуйста, понять!) второе видео к ряду задаюсь вопросом, зачем при записи сформированного списка в .json файл используется флаг "a"? ведь выглядит логичней "w".. что я упускаю?
@Andrey_Grishin_primera77902 жыл бұрын
@Ender Dragon так, судя по коду, в любом случае при каждом запуске происходит наполнение списка и дальнейшая запись в json, что при "a" варианте многое просто задублирует. да и автор перед каждым новым запуском удалял все файлы.. вопрос остался открытым) возможно я ищу проблему там, где её нет и это просто привычка автора и не более..
@Alexey17234 жыл бұрын
А как в projects_data_list = [] добавить еще и ссылки из project_urls = [] ?
@Alexey17234 жыл бұрын
Все, сам разобрался)
@PythonToday4 жыл бұрын
😀👍
@Vladimir-re8xl3 жыл бұрын
Круто)
@PythonToday3 жыл бұрын
Благодарю!
@Vladimir-re8xl3 жыл бұрын
@@PythonTodayне используете опп в своей практике? Хотелось бы посмотреть на парсинг в ооп стиле.
@PythonToday3 жыл бұрын
@@Vladimir-re8xl Например? Не совсем понятно для чего при парсинге использовать ООП. Каждый сайт индивидуален. Можно всё обернуть в класс, но зачем, на основе этого класса нет смысла создавать объекты. Или не правильно понял?
@SeriesWOT4 жыл бұрын
Привет, скажите у кого была проблема с кодировкой UnicodeEncodeError: 'charmap' codec can't encode character '\ufeff' in position 5670: character maps to и как это можно исправить
@PythonToday4 жыл бұрын
Что же все на винде то сидят. Попробуй всегда когда работаешь с сохранением файла дописывать параметр encoding="utf-8"
@SeriesWOT4 жыл бұрын
@@PythonToday Спасибо за ответ, помогло )
@SeriesWOT4 жыл бұрын
@@PythonToday Попробовал линь не зашло)
@PythonToday4 жыл бұрын
Да я тоже даленько не специалист в нём. Всё заводится из коробки, а на винде часто бывают траблы.
@SeriesWOT4 жыл бұрын
@@PythonToday ;)Ок
@ffonlfoff50052 жыл бұрын
Приветствую. А как вы клиенту данный код передавали? упаковывали в ехе? или это разовая работа и вы передали только файлы с результатом?
@k2d4e602 жыл бұрын
Честно говоря, я тоже ещё не понимаю как передавать готовые проекты заказчику, если как нибудь в конце видео это было бы озвучено, было бы вообще супер
@devZu94 жыл бұрын
Эх, когда же уже будет урок с авторизацией, куками и сессией?
@PythonToday4 жыл бұрын
Запишу как нибудь. Там же 10 строчек. В google полно примеров)
@ВикторЖидов4 жыл бұрын
@@PythonToday Поддерживаю про авторизацию. Интересна не простая авторизация, а сторонняя. Например, парсинг ЛК Кинопоиска. Там авторизация происходит на стороне через yandex.passport. Тут нужны печеньки, сессия и т.п. Также сложность в том, что если открыть панель разработчика, можно увидеть огромное кол-во запросов, и без опыта сложно разобрать, что к чему относится и какая важная часть запроса нужна. Если созреете готов профинансировать такое разбор-видео)
@nyakakun33983 жыл бұрын
Спасибо! ;3
@software92564 жыл бұрын
все хорошо а как сприть такое нужны value это все есть в в обекте soup var handler = function() { doc.gethertId("godf").value = "gf234re12d"; doc.gethertId("godfh").value = "kbJJIgmP+YS3sslJ746XMWwXh+s="; var form = doc.gethertId("login_form"); if (form.addEventListener) { form.addEventListener("submit", handler, false); else if (form.attachEvent) { form.attachEvent("onsubmit", handler);
@PythonToday4 жыл бұрын
Это же js. Мне кажется тут проще в строку прочитать файл и забрать значения срезом например если мы о Python говорим.