• Читаемое за неделю
  • Последние ответы
  • Новые темы

Как парсить сайты на Python.

Node

Следящий за кураторами.
Старший Куратор

Node

Следящий за кураторами.
Старший Куратор
Статус
Offline
Регистрация
20 Мар 2021
Сообщения
64
Реакции
181
В данной теме поговорим о парсинге сайтов на , с использованием библиотеки и .
Мы сделаем простой парсер сообщений в профилях пользователей HTM.
Данное руководство рассчитано для людей, которые знают хотя бы базу .

Нам понадобится:

-
-

1. Установка.

Первое, что вам нужно установить , а после установить библиотеку . Переходим на официальный сайт , скачиваем и устанавливаем.
После установки запускаем любую консоль cmd/powershell. (Я буду использовать )
Устанавливаем и requests:
Код:
pip install beautifulsoup4
pip install requests

2. Создание парсера.
Если вы все установили, то переходим к созданию парсера.
Как я говорил ранее мы будем парсить сообщения пользователей в профилях других пользователей.

Создаем новый .py файл с любым названием, в моем случае - parser.py.

1) Импортируем наши библиотеки:
Код:
from bs4 import BeautifulSoup
import requests

2) Пишем функцию для парсинга.
Для этого нам понадобится взять наш юзерагент или любой другой, чтобы сайт не считал нас ботом.
Сделать вы можете это на сайте - .
Переходим к написанию базы для парсинга.
Ниже будет код с пояснением каждой строки.
Код:
def parse(): // Создание функции.
    URL =  'https://hard-tm.su/whats-new/' // URL откуда будем парсить.
    HEADERS = {  // Создание  словаря.
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.91 Safari/537.36' // Наш юзерагент.
    }
    response = requests.get(URL, headers = HEADERS)  // Переменная отвечающая за отправку запросов на страницу.
    soup = BeautifulSoup(response.content, 'html.parser')  // Получение контента с страницы и указание, что мы парсим html.
parse()
Переходим дальше к самому интересному.
Выбираем, что мы будем парсить. В моем случае - это сообщения в профилях.
Я буду парсить кто написал и что написал. ( Если хотите можете доделать сами: у кого написал. Мне было лень :) )
Для этого нам нужно узнать тэг и класс.
Как это сделать:
Жмете Ctrl + Shift + I (Открываем инспектирование страницы), переходим в Elements и видим слева вверху инструмент выбора элемента.
AKGJMhq.png

Нажимаем на этот инструмент и наводимся и жмем на блок с сообщением.
ipmmiUc.png
И видим тэг и класс нашего блока сообщений.
kD7BKDa.png
Тут мы видим "div" - это Тэг.
И видим наш "message-cell message-cell --main" - это наш Класс.

Проделываем то же самое, но в этот раз с ником.
THRABMv.png
Наводимся и нажимаем на ник.
42XykgW.png
Тут мы видим "a" - это Тэг.
И видим наш "username" - это наш Класс.
Запоминаем эту информацию, а лучше класс скопировать, чтобы не ошибиться при написании.
С текстом в будущем делаем то же самое.
Переходим к написанию кода.
Код:
    fmsg = soup.findAll('div', class_ = 'message-cell message-cell--main') // Здесь мы осуществляем поиск блока с сообщением.
    msgs = [] // Создаем список.
    for msg in fmsg: // Создаем цикл.
        msgs.append({
            'username' : msg.find('a', class_ = 'username').get_text(strip = True), // Парсинг юзернейма. get_text - получение текста
            'title' : msg.find('div', class_ = 'bbWrapper').get_text(strip = True) // Парсинг текста, написанного пользователем. get_text - получение текста
        })
        for msg in msgs: // 2 цикл.
            print(f'{msg["username"]} : {msg["title"]}')  // Вывод нашего текста.
parse()  // Запуск функции.

На данном этапе мы можем уже запустить наш парсер и посмотреть результат.
6ttsRzn.png
Наш парсер вывел всего 5 сообщений, т.к. в данный момент их всего 5. Вывелось все кроме смайликов, т.к. мы получали только текст.
Так же мы можем сделать сохранения наших полученных данных парсером.
Для этого нам нужно создать новую ф-цию, назовем ее save.
Код:
def save(): // Создание функции.
    with open('messages.txt', 'a') as file: // Сохранение данных в файл messages.txt, "a" дополнение информацией файл без удаления прошлых данных.
        file.write(f'{msg["username"]} : {msg["title"]}\n') // Текст, который будет сохранятся.
Так же делаем глобальной функцию msg и запускаем нашу функцию во втором цикле.
Код:
    global msg // Делаем  функцию глобальной
    for msg in fmsg:
        msgs.append({
            'username' : msg.find('a', class_ = 'username').get_text(strip = True),
            'title' : msg.find('div', class_ = 'bbWrapper').get_text(strip = True)
        })
        for msg in msgs:
            print(f'{msg["username"]} : {msg["title"]}')
            save() // Запуск функции
И что мы видим:
У нас вывелись данные в консоль и создался файл с данными.
VhrjVuN.png

Итоговый исходный код:
Код:
from bs4 import BeautifulSoup
import requests
def save():
    with open('messages.txt', 'a') as file:
        file.write(f'{msg["username"]} : {msg["title"]}\n')
def parse():
    URL =  'https://hard-tm.su/whats-new/'
    HEADERS = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.91 Safari/537.36'
    }
    response = requests.get(URL, headers = HEADERS)
    soup = BeautifulSoup(response.content, 'html.parser')
    fmsg = soup.findAll('div', class_ = 'message-cell message-cell--main')
    msgs = []
    global msg
    for msg in fmsg:
        msgs.append({
            'username' : msg.find('a', class_ = 'username').get_text(strip = True),
            'title' : msg.find('div', class_ = 'bbWrapper').get_text(strip = True)
        })
        for msg in msgs:
            print(f'{msg["username"]} : {msg["title"]}')
            save()
parse()

📁
📁

На этом тема подходит к концу, буду рад, если узнали полезную информацию из данной темы. :)
 
Последнее редактирование:

DontWorry Plus

По всем вопросам.
Администратор

DontWorry Plus

По всем вопросам.
Администратор
Статус
Online
Регистрация
14 Мар 2021
Сообщения
34
Реакции
671
В данной теме поговорим о парсинге сайтов на , с использованием библиотеки и .
Мы сделаем простой парсер сообщений в профилях пользователей HTM.
Данное руководство рассчитано для людей, которые знают хотя бы базу .

Нам понадобится:

-
-

1. Установка.

Первое, что вам нужно установить , а после установить библиотеку . Переходим на официальный сайт , скачиваем и устанавливаем.
После установки запускаем любую консоль cmd/powershell. (Я буду использовать )
Устанавливаем и requests:
Код:
pip install beautifulsoup4
pip install requests

2. Создание парсера.
Если вы все установили, то переходим к созданию парсера.
Как я говорил ранее мы будем парсить сообщения пользователей в профилях других пользователей.

Создаем новый .py файл с любым названием, в моем случае - parser.py.

1) Импортируем наши библиотеки:
Код:
from bs4 import BeautifulSoup
import requests

2) Пишем функцию для парсинга.
Для этого нам понадобится взять наш юзерагент или любой другой, чтобы сайт не считал нас ботом.
Сделать вы можете это на сайте - .
Переходим к написанию базы для парсинга.
Ниже будет код с пояснением каждой строки.
Код:
def parse(): // Создание функции.
    URL =  'https://hard-tm.su/whats-new/' // URL откуда будем парсить.
    HEADERS = {  // Создание  словаря.
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.91 Safari/537.36' // Наш юзерагент.
    }
    response = requests.get(URL, headers = HEADERS)  // Переменная отвечающая за отправку запросов на страницу.
    soup = BeautifulSoup(response.content, 'html.parser')  // Получение контента с страницы и указание, что мы парсим html.
parse()
Переходим дальше к самому интересному.
Выбираем, что мы будем парсить. В моем случае - это сообщения в профилях.
Я буду парсить кто написал и что написал. ( Если хотите можете доделать сами: у кого написал. Мне было лень :) )
Для этого нам нужно узнать тэг и класс.
Как это сделать:
Жмете Ctrl + Shift + I (Открываем инспектирование страницы), переходим в Elements и видим слева вверху инструмент выбора элемента.
AKGJMhq.png

Нажимаем на этот инструмент и наводимся и жмем на блок с сообщением.
ipmmiUc.png
И видим тэг и класс нашего блока сообщений.
kD7BKDa.png
Тут мы видим "div" - это Тэг.
И видим наш "message-cell message-cell --main" - это наш Класс.

Проделываем то же самое, но в этот раз с ником.
THRABMv.png
Наводимся и нажимаем на ник.
42XykgW.png
Тут мы видим "a" - это Тэг.
И видим наш "username" - это наш Класс.
Запоминаем эту информацию, а лучше класс скопировать, чтобы не ошибиться при написании.
С текстом в будущем делаем то же самое.
Переходим к написанию кода.
Код:
    fmsg = soup.findAll('div', class_ = 'message-cell message-cell--main') // Здесь мы осуществляем поиск блока с сообщением.
    msgs = [] // Создаем список.
    for msg in fmsg: // Создаем цикл.
        msgs.append({
            'username' : msg.find('a', class_ = 'username').get_text(strip = True), // Парсинг юзернейма. get_text - получение текста
            'title' : msg.find('div', class_ = 'bbWrapper').get_text(strip = True) // Парсинг текста, написанного пользователем. get_text - получение текста
        })
        for msg in msgs: // 2 цикл.
            print(f'{msg["username"]} : {msg["title"]}')  // Вывод нашего текста.
parse()  // Запуск функции.

На данном этапе мы можем уже запустить наш парсер и посмотреть результат.
6ttsRzn.png
Наш парсер вывел всего 5 сообщений, т.к. в данный момент их всего 5. Вывелось все кроме смайликов, т.к. мы получали только текст.
Так же мы можем сделать сохранения наших полученных данных парсером.
Для этого нам нужно создать новую ф-цию, назовем ее save.
Код:
def save(): // Создание функции.
    with open('messages.txt', 'a') as file: // Сохранение данных в файл messages.txt, "a" дополнение информацией файл без удаления прошлых данных.
        file.write(f'{msg["username"]} : {msg["title"]}\n') // Текст, который будет сохранятся.
Так же делаем глобальной функцию msg и запускаем нашу функцию во втором цикле.
Код:
    global msg // Делаем  функцию глобальной
    for msg in fmsg:
        msgs.append({
            'username' : msg.find('a', class_ = 'username').get_text(strip = True),
            'title' : msg.find('div', class_ = 'bbWrapper').get_text(strip = True)
        })
        for msg in msgs:
            print(f'{msg["username"]} : {msg["title"]}')
            save() // Запуск функции
И что мы видим:
У нас вывелись данные в консоль и создался файл с данными.
VhrjVuN.png

Итоговый исходный код:
Код:
from bs4 import BeautifulSoup
import requests
def save():
    with open('messages.txt', 'a') as file:
        file.write(f'{msg["username"]} : {msg["title"]}\n')
def parse():
    URL =  'https://hard-tm.su/whats-new/'
    HEADERS = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.91 Safari/537.36'
    }
    response = requests.get(URL, headers = HEADERS)
    soup = BeautifulSoup(response.content, 'html.parser')
    fmsg = soup.findAll('div', class_ = 'message-cell message-cell--main')
    msgs = []
    global msg
    for msg in fmsg:
        msgs.append({
            'username' : msg.find('a', class_ = 'username').get_text(strip = True),
            'title' : msg.find('div', class_ = 'bbWrapper').get_text(strip = True)
        })
        for msg in msgs:
            print(f'{msg["username"]} : {msg["title"]}')
            save()
parse()

📁
📁

На этом тема подходит к концу, буду рад, если узнали полезную информацию из данной темы. :)
Ого, круто. То то я думаю, чего ты в профиле сидел))
 

knownaim

Новорег

knownaim

Новорег
Статус
Offline
Регистрация
20 Мар 2021
Сообщения
1
Реакции
3
Очень круто, спасибо
 
  • Like
Реакции: Node

Jag

Новорег

Jag

Новорег
Статус
Offline
Регистрация
1 Май 2021
Сообщения
0
Реакции
0
Можно гайд как парсить динамические сайты
 

Talomir

Местный
Местный

Talomir

Местный
Местный
Статус
Offline
Регистрация
20 Мар 2021
Сообщения
12
Реакции
201
Лично у меня - свой рекурсивный разборщик HTML, с синтаксическим анализатором, на C#. Я ушёл с питона лет 15 назад, мне сейчас 43 и я уже 10 лет программирую на C#, люблю его :)
 
  • Like
Реакции: Node

Germgerm

Новорег

Germgerm

Новорег
Статус
Offline
Регистрация
17 Май 2021
Сообщения
0
Реакции
0
Можно гайд как парсить динамические сайты
Как вариант – использовать библиотеку типа selenium и имитировать нажатие в точку с заданными координатами. Но это если под динамичностью имеется ввиду изменение названий классов/блоков
 

Pojiloi_lox

Пользователь

Pojiloi_lox

Пользователь
Статус
Offline
Регистрация
1 Июн 2021
Сообщения
18
Реакции
30
Зачем делать функцию save() если можно было просто использовать json.dump()

P.S. использование одинаковой переменной в цикле и во вложенном цикле это не круто
 

yojyk

Новорег

yojyk

Новорег
Статус
Offline
Регистрация
25 Мар 2021
Сообщения
0
Реакции
1
Спасибо за труд)
 

larje

Новорег

larje

Новорег
Статус
Offline
Регистрация
26 Июл 2021
Сообщения
0
Реакции
0
Шикарная статья, спасибо)
 

IvanSmirnov

Пользователь

IvanSmirnov

Пользователь
Статус
Offline
Регистрация
8 Сен 2021
Сообщения
12
Реакции
83
Зачем делать функцию save() если можно было просто использовать json.dump()

P.S. использование одинаковой переменной в цикле и во вложенном цикле это не круто
Вероятно, это для тех, кто не хочет сохранять в json. Мне, например, гораздо приятнее, когда код сохраняет результат в txt, но с одной оговоркой - если после этого с результатом ничего не надо делать
 

Talomir

Местный
Местный

Talomir

Местный
Местный
Статус
Offline
Регистрация
20 Мар 2021
Сообщения
12
Реакции
201
КАК ПАРСИТЬ САЙТЫ НА ПИТОН

1. Скачать корневую страничку сайта

2. Распарсить страничку

3. Для всех ссылок странички

4. Если ссылку не качали - перейти к пункту 2

5. Удалить питон и скачать самоучитель языка C#
 

IvanSmirnov

Пользователь

IvanSmirnov

Пользователь
Статус
Offline
Регистрация
8 Сен 2021
Сообщения
12
Реакции
83
КАК ПАРСИТЬ САЙТЫ НА ПИТОН

1. Скачать корневую страничку сайта

2. Распарсить страничку

3. Для всех ссылок странички

4. Если ссылку не качали - перейти к пункту 2

5. Удалить питон и скачать самоучитель языка C#
Ща бы в эпоху процветания Data Science советовать удалить питон))
 

IvanSmirnov

Пользователь

IvanSmirnov

Пользователь
Статус
Offline
Регистрация
8 Сен 2021
Сообщения
12
Реакции
83
Именно так я и сделал )) Причём 10 лет назад....
Ну это вкусовщина. Лично мне шарп не зашел просто, мб не в то время попробовал.
Питон - другое дело, я с него начинал, и он зашел идеально. Динамическая неявная, но при этом строгая типизация. Ммммм. На питоне можно кучу всякой рутины автоматизировать (причем легко, понятно и красиво), если знать как - есть любая библа на любые нужды. Ну и DS, куда без этого.
При этом, плюсы мне зашли, но уже после кучи времени на питоне.
 

Talomir

Местный
Местный

Talomir

Местный
Местный
Статус
Offline
Регистрация
20 Мар 2021
Сообщения
12
Реакции
201
Ну это вкусовщина. Лично мне шарп не зашел просто, мб не в то время попробовал.
Питон - другое дело, я с него начинал, и он зашел идеально. Динамическая неявная, но при этом строгая типизация. Ммммм. На питоне можно кучу всякой рутины автоматизировать (причем легко, понятно и красиво), если знать как - есть любая библа на любые нужды. Ну и DS, куда без этого.
При этом, плюсы мне зашли, но уже после кучи времени на питоне.
У меня наоборот, я 30 лет программирую, из них 10 последних лет - на Си Шарпе. Ещё что уважаю - Java, с NetBeans IDE, чуть лучше по дизайну приложений получается чем у microsoft, но шрифты в IDE ломают глаза понемногу, поэтому я до сих пор в Microsoft Visual Studio.

Когда я писал на Питоне, это было 10-15 лет назад, у него была кривая поддержка классов, отсутсnвовали средства визуального проектирования интерфейсов, не было средств быстрой разработки приложений с интеллектуальным окончанием строк кода, не было средств быстрого документирования классов и библиотек. Я фрилансер, и в одиночку пишу код для всей фирмы, да, один делаю работу по кодированию для всей корпорации. Поэтому мне нужны именно средства быстрой разработки приложений, я год колбасил на Visual Basic, потом, попробовав 1 год питон и 3 года Java, пришёл к Си Шарп и Студии как к идеальным средствам быстрой разработки программ!
--- Добавлено позже: ---

Ещё проще. Вот Си-шарп, показываю апликухи. Покажи Питон....


--- Добавлено позже: ---

И вот ещё, куча классных приложений на Си-Шарп, мои, и вряд ли ты покажешь что-нибудь подобное на python, из своих разработок. Просто потому, что Python не является профессиональным языком программирования, это - язык высокоточных расчётов, который сейчас используется НИИ вместо Фортрана для некоммерческих вычислений. Профессиональных программ на Питоне практически нет!

 
Последнее редактирование:

IvanSmirnov

Пользователь

IvanSmirnov

Пользователь
Статус
Offline
Регистрация
8 Сен 2021
Сообщения
12
Реакции
83
У меня наоборот, я 30 лет программирую, из них 10 последних лет - на Си Шарпе. Ещё что уважаю - Java, с NetBeans IDE, чуть лучше по дизайну приложений получается чем у microsoft, но шрифты в IDE ломают глаза понемногу, поэтому я до сих пор в Microsoft Visual Studio.

Когда я писал на Питоне, это было 10-15 лет назад, у него была кривая поддержка классов, отсутсnвовали средства визуального проектирования интерфейсов, не было средств быстрой разработки приложений с интеллектуальным окончанием строк кода, не было средств быстрого документирования классов и библиотек. Я фрилансер, и в одиночку пишу код для всей фирмы, да, один делаю работу по кодированию для всей корпорации. Поэтому мне нужны именно средства быстрой разработки приложений, я год колбасил на Visual Basic, потом, попробовав 1 год питон и 3 года Java, пришёл к Си Шарп и Студии как к идеальным средствам быстрой разработки программ!
--- Добавлено позже: ---

Ещё проще. Вот Си-шарп, показываю апликухи. Покажи Питон....


--- Добавлено позже: ---

И вот ещё, куча классных приложений на Си-Шарп, мои, и вряд ли ты покажешь что-нибудь подобное на python, из своих разработок. Просто потому, что Python не является профессиональным языком программирования, это - язык высокоточных расчётов, который сейчас используется НИИ вместо Фортрана для некоммерческих вычислений. Профессиональных программ на Питоне практически нет!

Признаю, приложения на Python не пишутся обычно. Главный его недостаток - медлительность, даже несмотря на то, что написан он на плюсах.
И сам я приложений на нем особо не писал, да и в те, в которых я про овал разные библиотеки, без слез не взглянешь, по сравнению с приведёнными в пример.
Однако, как уже и было отмечено, у Python совсем другая цель. На нем и не нужно писать приложения. Достаточно просто того, что именно на нем сейчас прогают прорывные вещи в науках о данных. Нейросети? Добро пожаловать в Python. Можно и не на нем, но удобство, гибкость, вариативность инструментов и результат пострадают. Хочешь предсказывать болезнь человека по МРТ? Вот тебе нейроночка. Не приложение, да. Нет красивого интерфейса, но цели такой тоже нет. Хочешь свою рекламу оптимизировать? Добро пожаловать в Python. Хочешь чат бота в ТГ? Туда же. Парсер? Да, легко. Это не просто расчеты. Для них хватило бы Python + numpy (ну мб ещё scipy). Но цель иная.
Поэтому для тех, кто приложения пилит Python не интересен. Он не для этого. И для деплоя он далеко не всегда годен, если счёт времени идёт на секунды и памяти на байты. Но каждому своё под свои конкретные нужды и интересы.
 

Talomir

Местный
Местный

Talomir

Местный
Местный
Статус
Offline
Регистрация
20 Мар 2021
Сообщения
12
Реакции
201
Да, спасибо за ответ, именно это я и хотел сказать. Питон - в первую очередь для научных расчётов и научного программирования, в Украине в институтах его сейчас используют вместо Фортрана.
 

Сверху