parser_version6

Форк
0
/
test2.py 
181 строка · 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
    }
36

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

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

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

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

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

62
    try:
63
        driver.maximize_window()
64

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

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

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

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

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

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

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

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

99
                        post_link = url
100

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

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

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

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

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

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

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

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

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

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

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

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

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

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

174
        return file_path
175

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

179
    finally:
180
        cursor.close()
181
        conn.close()
182

183

184

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

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

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

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