parser_version8

Форк
0
/
test2.py 
183 строки · 7.8 Кб
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 load_links_and_keywords():
15
    try:
16
        with open('Links.txt', 'r', encoding='utf-8') as f:
17
            links = [line.strip() for line in f.readlines()]
18
        with open('keywords.txt', 'r', encoding='utf-8') as f:
19
            keywords = [line.strip() for line in f.readlines()]
20
        return links, keywords
21
    except Exception as e:
22
        print(f"Ошибка при загрузке ссылок или ключевых слов: {e}")
23
        return [], []
24

25
def parse_and_save(links, nazvanie, keywords, start_date):
26
    links, keywords = load_links_and_keywords()
27
    nazvanie = ["Бойлерная", "Кремлёвский безБашенник", "Силовики", "НЕЗЫГАРЬ", "ОПЕР Слил", "SHOT", "Mash", "Baza", "ВЧК-ОГПУ", "КОНТЕКСТ"]
28
    
29
    # Конфигурация подключения к базе данных MySQL
30
    config = {
31
        'user': 'root', 
32
        'password': 'Uz94deco!',
33
        'host': '127.0.0.1',
34
        'database': 'parser',
35
        'charset': 'utf8mb4'
36
    }
37

38
    try:
39
        # Подключение к базе данных
40
        conn = mysql.connector.connect(**config)
41
        cursor = conn.cursor()
42

43
        # Очистка таблицы перед добавлением новых данных
44
        cursor.execute("TRUNCATE TABLE posts")
45
        conn.commit()
46
        print("Таблица posts очищена и автоинкремент сброшен.")
47

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

52
    # Укажите путь к chromedriver.exe
53
    chrome = ""  # Замените на реальный путь к chromedriver
54
    service = Service(chrome)
55

56
    # Настройка ChromeOptions
57
    options = webdriver.ChromeOptions()
58
    options.page_load_strategy = 'normal'  # Установка стратегии загрузки страницы
59
    options.add_argument('--headless')  # Запуск в фоновом режиме
60
    driver = webdriver.Chrome(service=service, options=options)
61
    driver.set_page_load_timeout(30)
62

63
    try:
64
        driver.maximize_window()
65

66
        for i, url in enumerate(links):
67
            print(f"Открываем URL: {url}")
68
            driver.get(url=url)
69

70
            for query in keywords:
71
                try:
72
                    search_input = WebDriverWait(driver, 10).until(
73
                        EC.presence_of_element_located((By.CSS_SELECTOR, '.tgme_header_search_form_input'))
74
                    )
75
                    search_input.clear()
76

77
                    # Вводим запрос в поле поиска
78
                    search_input.send_keys(query)
79
                    search_input.send_keys(Keys.RETURN)
80

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

84
                    # Получаем HTML страницы
85
                    html = driver.page_source
86
                    soup = BeautifulSoup(html, "html.parser")
87

88
                    # Ищем все посты
89
                    posts = soup.find_all('div', class_='tgme_widget_message_wrap')
90

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

95
                    for post in posts:
96
                        text_element = post.find('div', class_='tgme_widget_message_text')
97
                        if text_element:
98
                            text = text_element.get_text(strip=True)
99

100
                        post_link = url
101

102
                        # Получаем дату поста
103
                        date_element = post.find('time')
104

105
                        if date_element and 'datetime' in date_element.attrs:
106
                            try:
107
                                post_date_str = date_element['datetime']
108
                                post_date = datetime.fromisoformat(post_date_str[:-6]).date()  # Преобразуем в date
109
                            except Exception as ex:
110
                                print(f"Ошибка при обработке даты для канала {nazvanie[i]}: {ex}")
111
                                post_date = date.today()
112

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

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

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

134
    finally:
135
        driver.close()
136
        driver.quit()
137

138
    cursor.close()
139
    conn.close()
140

141
# Извлечение данных из базы и запись в Excel
142
def export_to_excel():
143
    # Конфигурация подключения к базе данных MySQL
144
    config = {
145
        'user': 'root', 
146
        'password': 'Uz94deco!',
147
        'host': '127.0.0.1',
148
        'database': 'parser',
149
        'charset': 'utf8mb4'
150
    }
151

152
    try:
153
        conn = mysql.connector.connect(**config)
154
        cursor = conn.cursor(dictionary=True)
155
        cursor.execute("SELECT * FROM posts")
156
        results = cursor.fetchall()
157

158
        if not results:
159
            print("Данные не извлечены из базы данных.")
160
            return
161

162
        # Преобразуем результаты в DataFrame
163
        df = pd.DataFrame(results)
164

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

168
        # Создаем уникальное имя файла
169
        file_name = 'parsed_posts.xlsx'
170
        file_path = os.path.join(current_directory, file_name)
171

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

176
        return file_path
177

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

181
    finally:
182
        cursor.close()
183
        conn.close()
184

185

186

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

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

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

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