parser_version8
/
test2.py
183 строки · 7.8 Кб
1import mysql.connector2import pandas as pd3from selenium import webdriver4from selenium.webdriver.chrome.service import Service5from selenium.webdriver.common.by import By6from selenium.webdriver.common.keys import Keys7from selenium.webdriver.support.ui import WebDriverWait8from selenium.webdriver.support import expected_conditions as EC9from bs4 import BeautifulSoup10from datetime import datetime, date, timedelta11import time12import os13
14def load_links_and_keywords():15try:16with open('Links.txt', 'r', encoding='utf-8') as f:17links = [line.strip() for line in f.readlines()]18with open('keywords.txt', 'r', encoding='utf-8') as f:19keywords = [line.strip() for line in f.readlines()]20return links, keywords21except Exception as e:22print(f"Ошибка при загрузке ссылок или ключевых слов: {e}")23return [], []24
25def parse_and_save(links, nazvanie, keywords, start_date):26links, keywords = load_links_and_keywords()27nazvanie = ["Бойлерная", "Кремлёвский безБашенник", "Силовики", "НЕЗЫГАРЬ", "ОПЕР Слил", "SHOT", "Mash", "Baza", "ВЧК-ОГПУ", "КОНТЕКСТ"]28
29# Конфигурация подключения к базе данных MySQL30config = {31'user': 'root',32'password': 'Uz94deco!',33'host': '127.0.0.1',34'database': 'parser',35'charset': 'utf8mb4'36}37
38try:39# Подключение к базе данных40conn = mysql.connector.connect(**config)41cursor = conn.cursor()42
43# Очистка таблицы перед добавлением новых данных44cursor.execute("TRUNCATE TABLE posts")45conn.commit()46print("Таблица posts очищена и автоинкремент сброшен.")47
48except Exception as ex:49print(f"Ошибка при подключении к базе данных или очистке таблицы: {ex}")50return # Завершаем выполнение функции51
52# Укажите путь к chromedriver.exe53chrome = "" # Замените на реальный путь к chromedriver54service = Service(chrome)55
56# Настройка ChromeOptions57options = webdriver.ChromeOptions()58options.page_load_strategy = 'normal' # Установка стратегии загрузки страницы59options.add_argument('--headless') # Запуск в фоновом режиме60driver = webdriver.Chrome(service=service, options=options)61driver.set_page_load_timeout(30)62
63try:64driver.maximize_window()65
66for i, url in enumerate(links):67print(f"Открываем URL: {url}")68driver.get(url=url)69
70for query in keywords:71try:72search_input = WebDriverWait(driver, 10).until(73EC.presence_of_element_located((By.CSS_SELECTOR, '.tgme_header_search_form_input'))74)75search_input.clear()76
77# Вводим запрос в поле поиска78search_input.send_keys(query)79search_input.send_keys(Keys.RETURN)80
81# Ждём загрузки результатов82time.sleep(3) # Увеличено время ожидания для полной загрузки результатов83
84# Получаем HTML страницы85html = driver.page_source86soup = BeautifulSoup(html, "html.parser")87
88# Ищем все посты89posts = soup.find_all('div', class_='tgme_widget_message_wrap')90
91if not posts:92print(f"По запросу '{query}' ничего не найдено на канале {nazvanie[i]}.")93continue94
95for post in posts:96text_element = post.find('div', class_='tgme_widget_message_text')97if text_element:98text = text_element.get_text(strip=True)99
100post_link = url101
102# Получаем дату поста103date_element = post.find('time')104
105if date_element and 'datetime' in date_element.attrs:106try:107post_date_str = date_element['datetime']108post_date = datetime.fromisoformat(post_date_str[:-6]).date() # Преобразуем в date109except Exception as ex:110print(f"Ошибка при обработке даты для канала {nazvanie[i]}: {ex}")111post_date = date.today()112
113# Фильтрация по дате114if post_date >= start_date:115try:116# Запись в базу данных (используем post_link для ссылки на пост или канал)117cursor.execute("""118INSERT INTO posts (channel_name, channel_link, post_text, time)
119VALUES (%s, %s, %s, %s)
120""", (nazvanie[i], post_link, text, post_date))121conn.commit()122print(f"Текст поста из канала {nazvanie[i]} добавлен в базу данных.")123except Exception as ex:124print(f"Ошибка при записи в базу данных: {ex}")125else:126print(f"Пропускаем пост из канала {nazvanie[i]}: пост устарел.")127
128except Exception as ex:129print(f"Ошибка при обработке запроса '{query}' на {url}: {ex}")130
131except Exception as ex:132print(f"Общая ошибка при работе с веб-драйвером: {ex}")133
134finally:135driver.close()136driver.quit()137
138cursor.close()139conn.close()140
141# Извлечение данных из базы и запись в Excel
142def export_to_excel():143# Конфигурация подключения к базе данных MySQL144config = {145'user': 'root',146'password': 'Uz94deco!',147'host': '127.0.0.1',148'database': 'parser',149'charset': 'utf8mb4'150}151
152try:153conn = mysql.connector.connect(**config)154cursor = conn.cursor(dictionary=True)155cursor.execute("SELECT * FROM posts")156results = cursor.fetchall()157
158if not results:159print("Данные не извлечены из базы данных.")160return161
162# Преобразуем результаты в DataFrame163df = pd.DataFrame(results)164
165# Определяем директорию, где находится сам скрипт166current_directory = os.path.dirname(os.path.abspath(__file__))167
168# Создаем уникальное имя файла169file_name = 'parsed_posts.xlsx'170file_path = os.path.join(current_directory, file_name)171
172# Сохраняем файл Excel в директории проекта173df.to_excel(file_path, index=False)174print(f"Данные успешно сохранены в файл: {file_path}")175
176return file_path177
178except Exception as ex:179print(f"Ошибка при извлечении или сохранении данных: {ex}")180
181finally:182cursor.close()183conn.close()184
185
186