parser_version5

Форк
0
/
test2.py 
160 строк · 7.2 Кб
1
import mysql.connector
2
import pandas as pd
3
from selenium import webdriver
4
from selenium.webdriver.chrome.service import Service
5
from selenium.webdriver.common.by import By
6
from selenium.webdriver.common.keys import Keys
7
from selenium.webdriver.support.ui import WebDriverWait
8
from selenium.webdriver.support import expected_conditions as EC
9
from bs4 import BeautifulSoup
10
from datetime import datetime, date, timedelta
11
import time
12
import os
13

14
def parse_and_save(a, nazvanie, poisk, start_date):
15
    nazvanie = ["Бойлерная", "Кремлёвский безБашенник", "Силовики", "НЕЗЫГАРЬ", "ОПЕР Слил", "SHOT", "Mash", "Baza", "ВЧК-ОГПУ", "КОНТЕКСТ"]
16
    
17
    # Конфигурация подключения к базе данных MySQL
18
    config = {
19
        'user': 'root', 
20
        'password': 'Uz94deco!',
21
        'host': '127.0.0.1',
22
        'database': 'parser'
23
    }
24

25
    try:
26
        # Подключение к базе данных
27
        conn = mysql.connector.connect(**config)
28
        cursor = conn.cursor()
29

30
        # Очистка таблицы перед добавлением новых данных
31
        cursor.execute("TRUNCATE TABLE posts")
32
        conn.commit()
33
        print("Таблица posts очищена и автоинкремент сброшен.")
34

35
    except Exception as ex:
36
        print(f"Ошибка при подключении к базе данных или очистке таблицы: {ex}")
37
        return  # Завершаем выполнение функции
38

39
    # Укажите путь к chromedriver.exe
40
    chrome = ""  # Замените на реальный путь к chromedriver
41
    service = Service(chrome)
42

43
    # Настройка ChromeOptions
44
    options = webdriver.ChromeOptions()
45
    options.page_load_strategy = 'normal'  # Установка стратегии загрузки страницы
46
    options.add_argument('--headless')  # Запуск в фоновом режиме
47
    driver = webdriver.Chrome(service=service, options=options)
48
    driver.set_page_load_timeout(30)
49

50
    try:
51
        driver.maximize_window()
52

53
        # Проверка синхронизации длины списков
54
        if len(nazvanie) < len(a):
55
            nazvanie.extend(['Телеграмм'] * (len(a) - len(nazvanie)))  # Заполняем пробелы для синхронизации
56

57
        for i, url in enumerate(a):
58
            print(f"Открываем URL: {url}")
59
            driver.get(url=url)
60

61
            for query in poisk:
62
                try:
63
                    search_input = WebDriverWait(driver, 10).until(
64
                        EC.presence_of_element_located((By.CSS_SELECTOR, '.tgme_header_search_form_input'))
65
                    )
66
                    search_input.clear()
67

68
                    # Вводим запрос в поле поиска
69
                    search_input.send_keys(query)
70
                    search_input.send_keys(Keys.RETURN)
71

72
                    # Ждём загрузки результатов
73
                    time.sleep(3)  # Увеличено время ожидания для полной загрузки результатов
74

75
                    # Получаем HTML страницы
76
                    html = driver.page_source
77
                    soup = BeautifulSoup(html, "html.parser")
78

79
                    # Ищем все посты
80
                    posts = soup.find_all('div', class_='tgme_widget_message_wrap')
81

82
                    if not posts:
83
                        print(f"По запросу '{query}' ничего не найдено на канале {nazvanie[i]}.")
84
                        continue
85

86
                    for post in posts:
87
                        text_element = post.find('div', class_='tgme_widget_message_text')
88
                        if text_element:
89
                            text = text_element.get_text(strip=True)
90

91
                        post_link = url
92

93
                        # Получаем дату поста
94
                        date_element = post.find('time')
95

96
                        if date_element and 'datetime' in date_element.attrs:
97
                            try:
98
                                post_date_str = date_element['datetime']
99
                                post_date = datetime.fromisoformat(post_date_str[:-6]).date()  # Преобразуем в date
100
                            except Exception as ex:
101
                                print(f"Ошибка при обработке даты для канала {nazvanie[i]}: {ex}")
102
                                post_date = date.today()
103

104
                        # Фильтрация по дате
105
                        if post_date >= start_date:
106
                            try:
107
                                # Запись в базу данных (используем post_link для ссылки на пост или канал)
108
                                cursor.execute(""" 
109
                                    INSERT INTO posts (channel_name, channel_link, post_text, time) 
110
                                    VALUES (%s, %s, %s, %s) 
111
                                """, (nazvanie[i], post_link, text, post_date))
112
                                conn.commit()
113
                                print(f"Текст поста из канала {nazvanie[i]} добавлен в базу данных.")
114
                            except Exception as ex:
115
                                print(f"Ошибка при записи в базу данных: {ex}")
116
                        else:
117
                            print(f"Пропускаем пост из канала {nazvanie[i]}: пост устарел.")
118

119
                except Exception as ex:
120
                    print(f"Ошибка при обработке запроса '{query}' на {url}: {ex}")
121

122
    except Exception as ex:
123
        print(f"Общая ошибка при работе с веб-драйвером: {ex}")
124

125
    finally:
126
        driver.close()
127
        driver.quit()
128

129
    # Извлечение данных из базы и запись в Excel
130
    try:
131
        cursor = conn.cursor(dictionary=True)
132
        cursor.execute("SELECT * FROM posts")
133
        results = cursor.fetchall()
134

135
        if not results:
136
            print("Данные не извлечены из базы данных.")
137
            return
138

139
        # Преобразуем результаты в DataFrame
140
        df = pd.DataFrame(results)
141

142
        # Определяем директорию, где находится сам скрипт
143
        current_directory = os.path.dirname(os.path.abspath(__file__))
144

145
        # Создаем уникальное имя файла
146
        file_name = 'parsed_posts.xlsx'
147
        file_path = os.path.join(current_directory, file_name)
148

149
        # Сохраняем файл Excel в директории проекта
150
        df.to_excel(file_path, index=False)
151
        print(f"Данные успешно сохранены в файл: {file_path}")
152

153
        return file_path
154

155
    except Exception as ex:
156
        print(f"Ошибка при извлечении или сохранении данных: {ex}")
157

158
    finally:
159
        cursor.close()
160
        conn.close()
161

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.