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

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

Node

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

Node

Следящий за кураторами.
Старший Куратор
Статус
Offline
Регистрация
20 Мар 2021
Сообщения
63
Реакции
168
В данной теме поговорим о парсинге сайтов на , с использованием библиотеки и .
Мы сделаем простой парсер сообщений в профилях пользователей 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

По всем вопросам.
Администратор
Статус
Offline
Регистрация
14 Мар 2021
Сообщения
33
Реакции
565
В данной теме поговорим о парсинге сайтов на , с использованием библиотеки и .
Мы сделаем простой парсер сообщений в профилях пользователей 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
Сообщения
11
Реакции
182
Лично у меня - свой рекурсивный разборщик HTML, с синтаксическим анализатором, на C#. Я ушёл с питона лет 15 назад, мне сейчас 43 и я уже 10 лет программирую на C#, люблю его :)
 

Germgerm

Новорег

Germgerm

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

Pojiloi_lox

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

Pojiloi_lox

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

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

larje

Новорег

larje

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

Сверху