Обучение парсингу на 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
Таймкоды для вас:
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 - Запуск парсера
Опять годнота)
я не понимаю как сделать терминал как у тебя у меня там PS C:\Users\User\Desktop> вот так выходит я пишу как у тебя но все ровно не получается
Я понимаю что код написан быстро, но для новичков нужно будет учесть несколько не критичных, но ошибок в коде:
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 и сохранить туда, куда укажет заказчик.
Вроде всё верно, кроме имени переменной responSe😊
Спасибо, друг
А как называется ошибка, связанная с прерыванием программы Ctrl + C?
@@SAVSAV1212 KeyboardInterrupt
09:40 - Try except: отдельное спасибо за огромную подсказку
Уроки очень классные, только одна просьба можете ТЗ показывать, было бы очень интересно
Круто подметили
А вот тут то и начинается настоящее искусство - транслировать- тз.
допарсились. нет больше этого сайта))
Этот сайтик был из тех, кто просто любил жизнь...
Сайт есть, но он изменился. Ну тем интереснее. Будем его изучать. Не все же время готовое списывать. ))))
Без слов, это было четко, ясно, понятно, КРАСИВО!
шикарные видосы продолжай пожалуйста)))
Супер!!! Смотреть одно наслождение. Видна рука проффесионала. Спасибо за видео!
Благодарю 😀 Но я только учусь, и делюсь опытом. Далеко не профессионал
Вы молодец. Не надо бояться делиться знаниями. Правда молодец. 😊
Искренне благодарю за видео. Было очень полезно узнать про динамический сбор данных со страницы. Постараюсь сделать что-то похожее на вашу программу, уж очень мне нравится делать парсеры. Когда начну работать на фрилансе, первым делом поддержу вас и ваш канал копеечкой за неоценимый труд.
Благодарю! Очень интересно и понятно объясняешь!
Отличное видео! Спасибо! Продолжай обязательно!
Благодарю за фидбэк
Как всегда, только самое нужное и интересное, без воды!!!
Спасибо большое за фидбэк!
@@PythonToday, огромное спасибо за ролики, очень полезная информация при обучении! Подскажите пожалуйста, нет ли у вас на примете аналогичного сайта? Просто текущий уже не работает...( Я взяла изначально на пробу другой динамический сайт, но при парсинге первой странице нет ни единого элемента, т.е. пусто на странице до первого движения колесиком
Очень круто и понятно объясняешь
Я давно такой канал искал
Желаю успехов
Спасибо 💪 Главная награда, мотивирует продолжать
Ты большой молодец! Спасибо тебе
Спасибо за фидбэк
@@PythonToday реально красавца!!
Для домашнего задания кто занимается доработайте код так что бы он обрабатывал не 23 страницы а все с учётом того что могут быть добавлены страницы. Очень интересное видео. Автору спасибо.
Спасибо за очень качественный контент
Огромное спасибо автору!!!!
Отличная подача материала. Спасибо большое
Благодарю за фидбэк 👍
Отличный урок! Спасибо!
Благодарю!
отличный урок! спасибо за гайд!👍🤘
Благодарю за фидбэк 💪
Супер! Спасибо за инфу!)
Большое спасибо за прекрасный материал
Спасибо за фидбэк!
Спасибо огромнейшее за видео!
Спасибо за фидбэк!
с помощью вашего канала зашел в программирование, большое спасибо
Уууу, поздравляю. Главное практика, успехов 👍
Как же ты меня мотивируешь ) я кажется знаю чем буду заниматься) именно парить, очень красиво получается!
"Парить" - это что-то другое) Спасибо за фидбэк! Рад что видео интересны.
@@PythonToday опечатка :))) именно парсить 🤗
Хотелось бы видеть побольше объектов, дабы переиспользовать их по нужде . А так всё супер.
ТОП Контент!!!
Спасибо.
Благодарю!
Молодец. Растешь)
Это было круто! Сначала - все казалось огромным драконищем, а оказалось - дело разбора на 2-3 дня. Пасяб - теперь можно топать выполнять заказы👍)
Благодарю за фидбэк!
как вы разбирали видео? гуглили что делает каждая строчка?
@@squidwardtentacles7724 нет конечно) код же весьма логичен. А вообще - самый простой способ - повторить, разбить на функции и написать тесты. И, разумеется, смотреть в документацию периодически
@@takiekakmi7532 как успехи сегодня в парсинге? Вы еще учитесь? я ищу себе единомышленников, я подросток с хромой базой Python(нужно повторить темы ООП, методов и функций), хочу научиться парсингу и ищу единомышленников
@@squidwardtentacles7724 Тоже подросток, и желаю научиться парсингу) мыслим мы одинаково
Годно!
благодарю Вас за труд!
Благодарю за фидбэк!
@@PythonToday как с Вами связаться, у меня есть предложение к Вам
Ты чёртов гений, я с этой пагинацией мучаюсь 2-ой день, всякие видео смотрю, stackoverflow чекаю, нихрена не помогало, ну не работало и всё, зашёл к тебе, а тут, просто тупо через request запрос делаешь и всё, никакие параметры не нужны, отличные гайды, просто идеальные.
Благодарю за фидбэк 💪
@@user-hv4or2mz9q, там вроде все продукты на flex блоках, кстати не знаете как парятся подобные вещи?
Это круто!!
Спасибо!
спасибо все ясно, понятно.
Благодарю 💪
Спасибо за поучительный видеоролик! Как всегда все понятно и подробно рассказано и показано!
Спасибо 👍
Отличные уроки !!!! Если будете работаете на фрилансе не могли бы сделать новые
уроки , на новых сайтах будет понятнее.
Спасибо!)Вдохновляешь!
Мб...вопросы такие:
1)был ли опыт работы с прокси-серверами для парсинга?
2) имеется ли опыт обхода блокировок сайта для парсинга (блокировка по IP)?
Будет ли видос по данным темам?
Спасибо! ;3
Это очень кртуо!
Я вообще дизайнер, но приятно порабить под твои видосы
спасибо все грамотно
Все по классике: сначала написал код, потом решил посмотреть гайд. Хорошо, что мой код пока что никто не видел))
Да всё ок, это самая лучшая практика!
Нормальный, детальный обзор, с боевым проектом, где есть сложности и нюансы, такие как несколько страниц, запросы вложенные. Кстати хорошая тема просто сохранять как HTML страницы, тогда будут обычные HTML без json запросов и грязи) отличные урок продолжай, надо денежкой тебя отблагодарить !
Благодарю!
@@user-hv4or2mz9q Коммент был для благодарности, за разъяснение логики парсинга, нежели самой технологии и еще как первый учебный проект на python, так как в основном пишу на js, php. Лично для меня по удобству конечно js лучше, я с него могу парсить все что мне надо используя puppeteer и тор браузер для обхода блокировок, а на счет кода выше, да думаю вы скорее всего правы, так как этот код не везде применим, но это скорее пособие для новичков)
@@user-hv4or2mz9q все же еще и от самого тз зависит, есть парсинги вообще которые обрабатывают тучу страниц и преобразуют их в отдельные файлы
Просто лучший!
Благодарю 💪
@@PythonToday скажи пожалуйста, мне нужно спарсить елемент, но он доступен только после нажатия кнопки, можешь снять ролик или подсказать здесь как решить эту проблему? Спасибо за труды
@@user-zj1cb7cz3f Воспользуйся библиотекой Selenium(активно использовали в плейлисте по instagram боту), нажми на кнопку и забирай все, что нужно.
@@PythonToday Ахах, спасибо, даже не думал)
Спасибо
super
Круто)
Благодарю!
@@PythonTodayне используете опп в своей практике? Хотелось бы посмотреть на парсинг в ооп стиле.
@@Vladimir-re8xl Например? Не совсем понятно для чего при парсинге использовать ООП. Каждый сайт индивидуален. Можно всё обернуть в класс, но зачем, на основе этого класса нет смысла создавать объекты. Или не правильно понял?
спасибо очень полезно) !!! И конечно же было бы неплохо узнать как работать с API , ключами и так далее, на сайтах где надо авторизоваться например ВК или опять же какая то торговая биржа ))))
Благодарю за фидбэк 👍 Но ведь у API есть подробные документации, там ведь вообще не нужно заморачиваться)
@@PythonToday то, что синьорам кажется элементарно, джунам и интерном - как будто "в тумане". )
ага, сколько я копался в доках/инете чтоб спарсить вк, чертов ад
Ай красавчик
Большое спасибо!
Ролик оказался полезным, хотелось бы новую вершину, например парсинг Ютуба. К примеру, выгрузка комментов с видео.
Благодарю. У ютуба есть своё api, которое позволяет доставать много данных. Можно попробовать использовать его. По парсингу ютуба точно видео не будет. Чревато
Спасибо за очень познавательный урок!
Но вот возник вопрос, я правильно понимаю, что парсер захардкожен на 23 страницы? У заказчика в будущем не возникнут проблемы, когда сайт перевалит за 23 страницы?
Если известна ссылка и необходимо менять число, лучше использовать while, выход по получению кода 404. Да и толка от записи html нет. Но для понимания основ сойдет
Автоматизация рутинных задач с помощью Python. Там хорошо объяснена тема регулярных выражений
Благодарю 💪
Плюсую! Если кому надо в электронном виде: yadi.sk/i/QmwgS3erpfADjw Если ссылки не желательны, удалю
👍👍👍
💪
То чувство, когда видео длится 20 минут, а на его понимание, повторение о осознание всех процессов в коде тратишь часа по 3 ) Не так давно начал заниматься Python, освоил базу на каком-то бесплатном курсе, решил что будет интересно попробовать себя именно в этой сфере. Как практика Ваши уроки крайне полезны, хоть и не просты, этого не отнять 😅
Большое спасибо за фидбэк! За каждым видео стоят десятки часов работы. В том и смысл, дать максимум полезной информации, без воды за короткий промежуток времени.
Как успехи ?
легкий сайт без защит, капчи и прочего. Удобная задача, но в реальности в основном замудренные задачи с тестами тьюринга... где реквест рассыпается и помогает только селениум и то, через костыли.
Заменить группу символов в слове. Довольно удобно
New_word = "".join([i if i not in ("b", "a", "n", "l", "e", "t", "r" ) else "_" for i in old_word])
Вопрос по дальнейшей публикации данных через wordpress: есть ли какой-то разбор, как это напарсенное (для статей например с использованием advanced custom fields) разместить на сайте с помощью питона?
Здравствуйте, не могли бы вы подсказать сайты подобные на представленному в уроке (он сейчас не доступен)
Спасибо за видео! Подскажи, а зачем нужен Scrapy или Selenium например?
блин, пока писал, увидел что на канале есть видео о Seleniume)))
Благодарю за фидбэк. Scrapy сильная библиотека для скрапинга. А Selenium преимущественно инструмент для тестирования.
У меня возможно тупой вопрос, но все-же: есть ли какой-то вариант прикрутить декоратор не к результату функции, а к итерации цикла for в ней (чтобы не писать в теле функции переменные со счётчиком итерации, а вынести это все в декоратор)????
- удалит все теги в тексте.
Использовать 'Requests' в век асинхронного Python, под музыкальный фон уроков от ХоудиХо...
Да, это работает, но интересно уже что-то новое видеть, учитывая исключительно I/O-bound задачу.
ничего плохого в том, что автор вдохновился, уже всем известным ХаудиХо
Итак, мы вместе выполнили заказ на фрилансе, где получать свою долю? :)
*Спасибо за полезную информацию.
Благодарю за фидбэк!
Музыка качает
Ребят, видео супер. Подскажите пожалуйста на моменте 14:09 при сохранении файлов (html) в папку, сохраняет в папку только один файл (последний) на странице, в чем может быть ошибка?
with open("projects.html", "w", encoding="utf-8") as file:
file.write(req.text) - оставлю тут. Думаю не у меня одного будет ругаться на кодировку файла.
У всех, кто на windows)
@@PythonToday ну так ведь общее количество переглядывающих это обычные пользователи...а не владельцы маков))
Было бы круто если бы нашлось время про гугл драйв API так как в реальности разбираю и понимаю что все западные за него на базовом уровне чисто для пиара..а на деле сидишь сам ботанишь методом проб и ошибок..)
Ты лучший
Привет, как сделать такой же перенос длинных ссылок как на 16:24. При Hard wrap 120 и Wrap on tayping при вставке не делает перенос, только если пробелы поставить вручную
Решил попробовать собрать информацию с сайта Animego. Почему-то html страниц собираемый парсером отличается от того что пишется в браузере и фактически отображается на страницах.
А на какой платформе вы принимаете задания от клиентов и актуально ли это сейчас?
Красиво!
Сайт, который вы выбрали для примера раскрытия темы имеет сильно другую конфигурацию. Посоветуйте подобный для практического разбора
Здравствуйте еще раз, помогите пожалуйста. Есть сайт госреестр.рф там при поиске урл не меняется. а мне нужно парсить его. Как это реализовать? Заранее спасибо
Круто, спасибо. Но вопрос: сайт динамический и данные в нем добавляются. Как только пагинаций станет более 23-х результат будет неполный. Возможно ли кодом написать проверку на поиск последнего индекса пагинации? Было бы интересно посмотреть реализацию такой логики, чтобы парсеру было "пофиг" на изменение количества позиций-записей и он работал долго и счастливо)).
А в целом ОГРОМНОЕ спасибо!!! Тема парсинга очень широка и дает много возможностей для воплощения идей в реальность.
цикл while true / break и внутри try/except и проверку на ответ сервера или наличие данных
Можешь попробовать через проверку status_code сделать, если на сайте 404 код отправляется, когда за пагинацию выходишь
Или через try/except отлавливать, когда нет контента на странице и прекращать парсинг
Приветствую. А как вы клиенту данный код передавали? упаковывали в ехе? или это разовая работа и вы передали только файлы с результатом?
Честно говоря, я тоже ещё не понимаю как передавать готовые проекты заказчику, если как нибудь в конце видео это было бы озвучено, было бы вообще супер
Пожалуйста, кто-нибудь может написать под этим комментарии ссылку на сайт? Я не могу его найти.
На 3:20 вы говорите -"воспользуемся поиском..." вы какие-то горячие клавиши используете для открытия поисковой строчки? Я тоже пользуюсь пайчармом.
ctrl + f ?
подскажите пожалуйста столкнулся с такой ошибкой при попытке распарсить сайт: return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x98 in position 1583: character maps to
проблема в кодировке страницы, посоветуйте что-нибудь?
Давно вы этим занимаетесь?)
Я попытался спарсить ТИК ТОК, что бы узнать количество видео у пользователя, но с пагинацией у меня так ничего и не получилось, я не нашел там такого и не понял как прокручивать страницы
Может сможете подсказать что-то? Буду очень благодарен
PS
Я совсем новичок, если что)
Все, не работает больше ссылка на тот сайт. Тренировки закончены.
Нет, можно найти сайт, где в конце страницы есть кнопка - показать еще, или перейти в этот же сайт, и нажать например: Тесты, в ссылке в конце подставляя: "?page-2", забыл. Можешь посмотреть сам, посмотрев код кнопки - показать еще, и перейти по его href ссылке в коде, и сверху будет в ссылке написано - ?page-2
Классный видос, только зачем тут selenium? Он не использовался в коде
а как быть если это уже совершенно другой сайт, не тот что в ролике?
привет, не могу понять, в каком формате нужно скидывать заказчикам заказ? Просто выходные файлы или саму программу (exe)?
Приветствую, все зависит от ТЗ. Кому то просто скрипт, кому на сервер закинуть и настроить или веб интерфейс парсера на Django. Бывали и exe.
@@PythonToday спасибо большое)
Отличное видео! У меня только один вопрос, как открыть поиск по коду в структуре сайта ?
Благодарю за фидбэк! Так же почти во всех программах CTRL + F
Бро, учился парсингу по твоим роликам. Хотел устроиться в одну конторку для написания парсеров. В качестве тестового задания писал парсер с яндекс-карт. В итоге получил отказ по причине того, что код слишком базовый. Как выглядит НЕбазовый код - загадка.
Спасибо за ваши видео! Есть вопрос, а если на сайте для появления доп информации надо нажать кнопку , но при этом ни чего в строку адреса не передается. Как тогда быть? например как тут mosecom. mos. ru/zelenograd-16/ это сайт мос эко мониторинга и для того чтоб отображались все показатели воздуха надо нажать кнопку. Можете подсказать в какую сторону гуглить, хоть примерно :)
Смотреть в network куда, какой и с какими параметрами запрос уходит. Откуда то ведь данные приходят
4:05...всё идет по плану. Знал бы автор, что это за выражение будет вскоре...
Очень прошу вас помочь. Я запутался. Я писал всё по вашему примеру, но более структурировал код и запутался, когда в игру вошла пагинация.
Я разделил проект на два файла: файл, который проверяет страницу на 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)
И да, у меня без записи в жсон файл, так как пока что данные не верны. Очень жду ваш ответ. Спасибо !!!
Отличная рубрика, спасибо! Недавно я задался вопросом, любой ли сайт можно спарсить через запросы без использования Selenium? Кто знает - ответьте, буду очень признателен)
Нет не любой к сожалению есть сайты в которых весь контент формируется через Java Script например сайт FlashScore. Если парсить с селеном то очень много ресурсов нужно для загрузки. С данным сайтом requests бесполезен.
@@th-Happy в начале года ломал голову как его распарсить запросами, получилось только селениум. сейчас скрипт работает на сервере и парсит flashscore, затем уведомления в телегу присылает, удобная вещь
Все неплохо, но хардкодить количество страниц не хорошо. Можно проходить по страницам до тех пор, пока они открываются и есть контент
Всем добрый день. не могу разобраться почему при данном коде images = soup.find_all('div', class_='carousel__item custom-carousel__item').find('a').get('href') выдает ошибку AttributeError: ResultSet object has no attribute 'find'? помогите плз
@PythonToday, в первом уроке изучали методы, все было хорошо, но уже со второго урока начались задания на фрилансе и я больше половины не понимаю че вообще происходит, как учиться ? мне очень нравится твоя подача и твои видосы
смотришь код, читаешь мануалы по командам, которые используются. конструкции в коде очень простые, ничего военного, никакого ООП и прочей ереси.
Поздно, конечно, но чтобы писать на питоне его нужно сначала "выучить". Разве нет?
@@forraz2286 про методы я имею в виду .find & .find_all и что в задании на фрилансе совсем другое и уровень резко поднимается
помогите, пожалуйста, понять!)
второе видео к ряду задаюсь вопросом, зачем при записи сформированного списка в .json файл используется флаг "a"? ведь выглядит логичней "w".. что я упускаю?
@Ender Dragon так, судя по коду, в любом случае при каждом запуске происходит наполнение списка и дальнейшая запись в json, что при "a" варианте многое просто задублирует. да и автор перед каждым новым запуском удалял все файлы.. вопрос остался открытым) возможно я ищу проблему там, где её нет и это просто привычка автора и не более..
А если get запросов при добавлении элементов нет? В network добавляются только png файлы. Такой сайт можно как то спарсить? Или только Selenium?
Вы не разобрались? пытался для практики спарсить сайт dns-shop, но в network только картинки
@@VItoSRostov Не разобрался, селениум пошел изучать
@@TheAsbor я тоже изучаю python, и мне он кажется легким. Одному скучновато, да и не с кем делиться достижениями, нет желания создать дискорд чат или телеграм, чтобы общаться и делиться идеями. В двоем веселее будет
12:14 - *Cоздание список*
У меня после после сохранения файла html кириллица отображается в виде вопросительных знаков. Как можно подкрутить кодировку, чтобы это исправить? Заранее спасибо!
Добавь при сохранении файла параметр encoding="utf-8"
Почему у нас выходит ошибка "name error url"?
Классный и полезный контент!
Не подскажите, как можно получить класс по точному совпадению вместо частично? Например, я хочу получать только class_name_main, исключая class_name_main base и class_name_main hide.
Если что, тег с классом class_name_main base относится к 2 классам: class_name_main и base. Как вариант, можно получить все теги с нужным классом через find_all, и проверять полное значение класса через get(‘class’)
@@kutsokon 4 месяца прошло, но спасибо)
@@TheUchihaSamara лучше поздно, чем никогда :)
посмотри метод .select() вместо .find_all. Select использует механизм поиска такой как селекторы в CSS. я уже не помню точно как они работают, но может через них можно задавать точное соответствие.
почему в прошлом уроке было headers=headers а в это просто headers?
заранее благодарю за ответ !
Почитай про именованные аргументы. Посмотри под капот к методу get и посмотри какие параметры он принимает. В данном случае разницы не было