LukinterLab
LukInterLab

LukInterLab- -LukInterLab

profile-pic

Парсим статьи и публикуем в блоге №1

12 февраля 2025 г. 16:32
Изображение поста

Вот пример кода на Python с использованием Django для парсинга статей и публикации их в блоге.  Этот код предполагает, что у вас уже настроена модель Post в вашем Django приложении.  Я старался добавить как можно больше комментариев для понимания логики. Пожалуйста, адаптируйте его под ваши конкретные нужды и структуру данных.

import requests
from bs4 import BeautifulSoup
from django.utils import timezone
from .models import Post  # Импортируем вашу модель Post
 
def parse_and_publish(url, title_selector, content_selector, author="Автоматический парсер"):
        """ Парсит статью с указанного URL, извлекает заголовок и контент,   и публикует ее в блоге.
        Args: url (str): URL статьи для парсинга.
                    title_selector (str): CSS-селектор для извлечения заголовка.
                    content_selector (str): CSS-селектор для извлечения контента.
                    author (str): Автор поста (по умолчанию "Автоматический парсер").
        Returns: bool: True, если статья успешно опубликована, False в противном случае.   """
    try:
        response = requests.get(url)
        response.raise_for_status()  # Вызывает исключение для плохих статусов (4XX, 5XX)
        soup = BeautifulSoup(response.content, 'html.parser')
        # Извлекаем заголовок статьи
        title_element = soup.select_one(title_selector)
        if title_element:
                title = title_element.get_text(strip=True)
        else:
                print(f"Не удалось найти заголовок по селектору: {title_selector}")
                return False
        # Извлекаем контент статьи
        content_element = soup.select_one(content_selector)
        if content_element:
                content = content_element.prettify()  # Сохраняем HTML-форматирование
        else:
                print(f"Не удалось найти контент по селектору: {content_selector}")
                return False
        # Создаем и сохраняем пост в базе данных
        post = Post(
                title=title,
                content=content,
                author=author,
                publication_date=timezone.now()  # Устанавливаем текущую дату и время публикации
        )
        post.save()
        print(f"Статья '{title}' успешно опубликована.")
        return True
    except requests.exceptions.RequestException as e:
            print(f"Ошибка при запросе URL: {e}")
            return False
    except Exception as e:
            print(f"Произошла ошибка: {e}")
            return False

# Пример использования (замените URL и селекторы на ваши значения)

# Предполагаем, что у вас есть задача Celery или Cron, которая вызывает эту функцию.

def main():
    """Основная функция для запуска парсинга."""
    url_to_parse = "https://example.com/article"  # Замените на реальный URL статьи
    title_css_selector = "h1.article-title"  # Замените на CSS-селектор заголовка
    content_css_selector = ".article-body"  # Замените на CSS-селектор контента
    if parse_and_publish(url_to_parse, title_css_selector, content_css_selector):
        print("Парсинг и публикация выполнены успешно.")
    else:
        print("Парсинг и публикация не удались.")
if __name__ == "__main__":

    # Этот блок позволяет запускать скрипт напрямую для тестирования

    # В реальной среде лучше использовать Celery, Cron или другой планировщик задач.

    main()

Важные замечания и что нужно адаптировать:

Модель Post:  Убедитесь, что у вас есть модель Post в вашем приложении Django.  Она должна содержать поля title, content, author (или author_id, если у вас связь с моделью User), и publication_date.  Пример модели:

from django.db import models
from django.utils import timezone
class Post(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    author = models.CharField(max_length=100, default="Автоматический парсер") # Или ForeignKey к User
    publication_date = models.DateTimeField(default=timezone.now)
def __str__(self):
    return self.title

Селекторы CSS: Самое важное – правильно определить CSS-селекторы (title_selector и content_selector).  Используйте инструменты разработчика в вашем браузере (обычно вызываются клавишей F12) для инспектирования HTML-кода целевой страницы и определения подходящих селекторов.  Важно, чтобы селекторы были достаточно точными, чтобы извлекать только нужный контент.  Если контент находится внутри нескольких вложенных тегов, возможно, потребуется использовать более сложные селекторы.

Обработка ошибок:  Код содержит базовую обработку исключений для сетевых ошибок и ошибок парсинга.  В реальном проекте может потребоваться более детальная обработка, логирование ошибок и механизмы повторных попыток.

Форматирование контента: Метод .prettify() сохраняет HTML-форматирование. Если вам нужно другое форматирование (например, очистка от HTML-тегов и сохранение только текста), вам потребуется изменить логику извлечения и обработки контента.  Можно использовать get_text() вместо prettify(), но тогда все HTML-теги будут удалены.

Планирование задач:  Не рекомендуется запускать этот код непосредственно в Django views, так как парсинг может занять много времени и заблокировать основной процесс.  Используйте Celery, Django-Q, APScheduler или Cron для запуска парсинга в фоновом режиме.  main() - это просто пример для локального тестирования.

Robots.txt:  Всегда проверяйте файл robots.txt на целевом сайте, чтобы убедиться, что вам разрешено парсить его контент.  Соблюдайте правила парсинга и уважайте владельцев сайтов.

Задержки запросов:  Добавляйте задержки между запросами, чтобы не перегружать сервер целевого сайта.  Используйте time.sleep() для этого.

User-Agent: Укажите User-Agent в заголовке запроса, чтобы представляться обычным браузером.  Это может помочь избежать блокировки со стороны сервера.

Обработка динамического контента: Если сайт использует JavaScript для загрузки контента, вам может потребоваться использовать более продвинутые инструменты, такие как Selenium или Puppeteer, для рендеринга страницы перед парсингом.  Это значительно усложнит код.

Django settings: Убедитесь, что у вас правильно настроены Django settings (например, TIME_ZONE).

Этот код предоставляет отправную точку.  Вам, вероятно, потребуется внести значительные изменения в зависимости от структуры целевого сайта и ваших требований.  Тщательно тестируйте и адаптируйте код, чтобы он работал правильно и не нарушал правила парсинга.

Пока комментариев нет.

Оставьте коментарий