parser_version4
/
test2.py
159 строк · 7.1 Кб
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' # Установка стратегии загрузки страницы46driver = webdriver.Chrome(service=service, options=options)47driver.set_page_load_timeout(30)48
49try:50driver.maximize_window()51
52# Проверка синхронизации длины списков53if len(nazvanie) < len(a):54nazvanie.extend(['Телеграмм'] * (len(a) - len(nazvanie))) # Заполняем пробелы для синхронизации55
56for i, url in enumerate(a):57print(f"Открываем URL: {url}")58driver.get(url=url)59
60for query in poisk:61try:62search_input = WebDriverWait(driver, 10).until(63EC.presence_of_element_located((By.CSS_SELECTOR, '.tgme_header_search_form_input'))64)65search_input.clear()66
67# Вводим запрос в поле поиска68search_input.send_keys(query)69search_input.send_keys(Keys.RETURN)70
71# Ждём загрузки результатов72time.sleep(3) # Увеличено время ожидания для полной загрузки результатов73
74# Получаем HTML страницы75html = driver.page_source76soup = BeautifulSoup(html, "html.parser")77
78# Ищем все посты79posts = soup.find_all('div', class_='tgme_widget_message_wrap')80
81if not posts:82print(f"По запросу '{query}' ничего не найдено на канале {nazvanie[i]}.")83continue84
85for post in posts:86text_element = post.find('div', class_='tgme_widget_message_text')87if text_element:88text = text_element.get_text(strip=True)89
90post_link = url91
92# Получаем дату поста93date_element = post.find('time')94
95if date_element and 'datetime' in date_element.attrs:96try:97post_date_str = date_element['datetime']98post_date = datetime.fromisoformat(post_date_str[:-6]).date() # Преобразуем в date99except Exception as ex:100print(f"Ошибка при обработке даты для канала {nazvanie[i]}: {ex}")101post_date = date.today()102
103# Фильтрация по дате104if post_date >= start_date:105try:106# Запись в базу данных (используем post_link для ссылки на пост или канал)107cursor.execute("""108INSERT INTO posts (channel_name, channel_link, post_text, time)
109VALUES (%s, %s, %s, %s)
110""", (nazvanie[i], post_link, text, post_date))111conn.commit()112print(f"Текст поста из канала {nazvanie[i]} добавлен в базу данных.")113except Exception as ex:114print(f"Ошибка при записи в базу данных: {ex}")115else:116print(f"Пропускаем пост из канала {nazvanie[i]}: пост устарел.")117
118except Exception as ex:119print(f"Ошибка при обработке запроса '{query}' на {url}: {ex}")120
121except Exception as ex:122print(f"Общая ошибка при работе с веб-драйвером: {ex}")123
124finally:125driver.close()126driver.quit()127
128# Извлечение данных из базы и запись в Excel129try:130cursor = conn.cursor(dictionary=True)131cursor.execute("SELECT * FROM posts")132results = cursor.fetchall()133
134if not results:135print("Данные не извлечены из базы данных.")136return137
138# Преобразуем результаты в DataFrame139df = pd.DataFrame(results)140
141# Определяем директорию, где находится сам скрипт142current_directory = os.path.dirname(os.path.abspath(__file__))143
144# Создаем уникальное имя файла145file_name = 'parsed_posts.xlsx'146file_path = os.path.join(current_directory, file_name)147
148# Сохраняем файл Excel в директории проекта149df.to_excel(file_path, index=False)150print(f"Данные успешно сохранены в файл: {file_path}")151
152return file_path153
154except Exception as ex:155print(f"Ошибка при извлечении или сохранении данных: {ex}")156
157finally:158cursor.close()159conn.close()160