parser_version4

Форк
0
/
test2.py 
159 строк · 7.1 Кб
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
    driver = webdriver.Chrome(service=service, options=options)
47
    driver.set_page_load_timeout(30)
48

49
    try:
50
        driver.maximize_window()
51

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

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

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

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

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

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

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

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

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

90
                        post_link = url
91

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

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

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

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

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

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

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

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

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

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

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

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

152
        return file_path
153

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

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

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

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

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

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