parser_version5
/
test2.py
160 строк · 7.2 Кб
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 parse_and_save(a, nazvanie, poisk, start_date):15nazvanie = ["Бойлерная", "Кремлёвский безБашенник", "Силовики", "НЕЗЫГАРЬ", "ОПЕР Слил", "SHOT", "Mash", "Baza", "ВЧК-ОГПУ", "КОНТЕКСТ"]16
17# Конфигурация подключения к базе данных MySQL18config = {19'user': 'root',20'password': 'Uz94deco!',21'host': '127.0.0.1',22'database': 'parser'23}24
25try:26# Подключение к базе данных27conn = mysql.connector.connect(**config)28cursor = conn.cursor()29
30# Очистка таблицы перед добавлением новых данных31cursor.execute("TRUNCATE TABLE posts")32conn.commit()33print("Таблица posts очищена и автоинкремент сброшен.")34
35except Exception as ex:36print(f"Ошибка при подключении к базе данных или очистке таблицы: {ex}")37return # Завершаем выполнение функции38
39# Укажите путь к chromedriver.exe40chrome = "" # Замените на реальный путь к chromedriver41service = Service(chrome)42
43# Настройка ChromeOptions44options = webdriver.ChromeOptions()45options.page_load_strategy = 'normal' # Установка стратегии загрузки страницы46options.add_argument('--headless') # Запуск в фоновом режиме47driver = webdriver.Chrome(service=service, options=options)48driver.set_page_load_timeout(30)49
50try:51driver.maximize_window()52
53# Проверка синхронизации длины списков54if len(nazvanie) < len(a):55nazvanie.extend(['Телеграмм'] * (len(a) - len(nazvanie))) # Заполняем пробелы для синхронизации56
57for i, url in enumerate(a):58print(f"Открываем URL: {url}")59driver.get(url=url)60
61for query in poisk:62try:63search_input = WebDriverWait(driver, 10).until(64EC.presence_of_element_located((By.CSS_SELECTOR, '.tgme_header_search_form_input'))65)66search_input.clear()67
68# Вводим запрос в поле поиска69search_input.send_keys(query)70search_input.send_keys(Keys.RETURN)71
72# Ждём загрузки результатов73time.sleep(3) # Увеличено время ожидания для полной загрузки результатов74
75# Получаем HTML страницы76html = driver.page_source77soup = BeautifulSoup(html, "html.parser")78
79# Ищем все посты80posts = soup.find_all('div', class_='tgme_widget_message_wrap')81
82if not posts:83print(f"По запросу '{query}' ничего не найдено на канале {nazvanie[i]}.")84continue85
86for post in posts:87text_element = post.find('div', class_='tgme_widget_message_text')88if text_element:89text = text_element.get_text(strip=True)90
91post_link = url92
93# Получаем дату поста94date_element = post.find('time')95
96if date_element and 'datetime' in date_element.attrs:97try:98post_date_str = date_element['datetime']99post_date = datetime.fromisoformat(post_date_str[:-6]).date() # Преобразуем в date100except Exception as ex:101print(f"Ошибка при обработке даты для канала {nazvanie[i]}: {ex}")102post_date = date.today()103
104# Фильтрация по дате105if post_date >= start_date:106try:107# Запись в базу данных (используем post_link для ссылки на пост или канал)108cursor.execute("""109INSERT INTO posts (channel_name, channel_link, post_text, time)
110VALUES (%s, %s, %s, %s)
111""", (nazvanie[i], post_link, text, post_date))112conn.commit()113print(f"Текст поста из канала {nazvanie[i]} добавлен в базу данных.")114except Exception as ex:115print(f"Ошибка при записи в базу данных: {ex}")116else:117print(f"Пропускаем пост из канала {nazvanie[i]}: пост устарел.")118
119except Exception as ex:120print(f"Ошибка при обработке запроса '{query}' на {url}: {ex}")121
122except Exception as ex:123print(f"Общая ошибка при работе с веб-драйвером: {ex}")124
125finally:126driver.close()127driver.quit()128
129# Извлечение данных из базы и запись в Excel130try:131cursor = conn.cursor(dictionary=True)132cursor.execute("SELECT * FROM posts")133results = cursor.fetchall()134
135if not results:136print("Данные не извлечены из базы данных.")137return138
139# Преобразуем результаты в DataFrame140df = pd.DataFrame(results)141
142# Определяем директорию, где находится сам скрипт143current_directory = os.path.dirname(os.path.abspath(__file__))144
145# Создаем уникальное имя файла146file_name = 'parsed_posts.xlsx'147file_path = os.path.join(current_directory, file_name)148
149# Сохраняем файл Excel в директории проекта150df.to_excel(file_path, index=False)151print(f"Данные успешно сохранены в файл: {file_path}")152
153return file_path154
155except Exception as ex:156print(f"Ошибка при извлечении или сохранении данных: {ex}")157
158finally:159cursor.close()160conn.close()161