parser_version6
/
test2.py
181 строка · 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}36
37try:38# Подключение к базе данных39conn = mysql.connector.connect(**config)40cursor = conn.cursor()41
42# Очистка таблицы перед добавлением новых данных43cursor.execute("TRUNCATE TABLE posts")44conn.commit()45print("Таблица posts очищена и автоинкремент сброшен.")46
47except Exception as ex:48print(f"Ошибка при подключении к базе данных или очистке таблицы: {ex}")49return # Завершаем выполнение функции50
51# Укажите путь к chromedriver.exe52chrome = "" # Замените на реальный путь к chromedriver53service = Service(chrome)54
55# Настройка ChromeOptions56options = webdriver.ChromeOptions()57options.page_load_strategy = 'normal' # Установка стратегии загрузки страницы58options.add_argument('--headless') # Запуск в фоновом режиме59driver = webdriver.Chrome(service=service, options=options)60driver.set_page_load_timeout(30)61
62try:63driver.maximize_window()64
65for i, url in enumerate(links):66print(f"Открываем URL: {url}")67driver.get(url=url)68
69for query in keywords:70try:71search_input = WebDriverWait(driver, 10).until(72EC.presence_of_element_located((By.CSS_SELECTOR, '.tgme_header_search_form_input'))73)74search_input.clear()75
76# Вводим запрос в поле поиска77search_input.send_keys(query)78search_input.send_keys(Keys.RETURN)79
80# Ждём загрузки результатов81time.sleep(3) # Увеличено время ожидания для полной загрузки результатов82
83# Получаем HTML страницы84html = driver.page_source85soup = BeautifulSoup(html, "html.parser")86
87# Ищем все посты88posts = soup.find_all('div', class_='tgme_widget_message_wrap')89
90if not posts:91print(f"По запросу '{query}' ничего не найдено на канале {nazvanie[i]}.")92continue93
94for post in posts:95text_element = post.find('div', class_='tgme_widget_message_text')96if text_element:97text = text_element.get_text(strip=True)98
99post_link = url100
101# Получаем дату поста102date_element = post.find('time')103
104if date_element and 'datetime' in date_element.attrs:105try:106post_date_str = date_element['datetime']107post_date = datetime.fromisoformat(post_date_str[:-6]).date() # Преобразуем в date108except Exception as ex:109print(f"Ошибка при обработке даты для канала {nazvanie[i]}: {ex}")110post_date = date.today()111
112# Фильтрация по дате113if post_date >= start_date:114try:115# Запись в базу данных (используем post_link для ссылки на пост или канал)116cursor.execute("""117INSERT INTO posts (channel_name, channel_link, post_text, time)
118VALUES (%s, %s, %s, %s)
119""", (nazvanie[i], post_link, text, post_date))120conn.commit()121print(f"Текст поста из канала {nazvanie[i]} добавлен в базу данных.")122except Exception as ex:123print(f"Ошибка при записи в базу данных: {ex}")124else:125print(f"Пропускаем пост из канала {nazvanie[i]}: пост устарел.")126
127except Exception as ex:128print(f"Ошибка при обработке запроса '{query}' на {url}: {ex}")129
130except Exception as ex:131print(f"Общая ошибка при работе с веб-драйвером: {ex}")132
133finally:134driver.close()135driver.quit()136
137cursor.close()138conn.close()139
140# Извлечение данных из базы и запись в Excel
141def export_to_excel():142# Конфигурация подключения к базе данных MySQL143config = {144'user': 'root',145'password': 'Uz94deco!',146'host': '127.0.0.1',147'database': 'parser'148}149
150try:151conn = mysql.connector.connect(**config)152cursor = conn.cursor(dictionary=True)153cursor.execute("SELECT * FROM posts")154results = cursor.fetchall()155
156if not results:157print("Данные не извлечены из базы данных.")158return159
160# Преобразуем результаты в DataFrame161df = pd.DataFrame(results)162
163# Определяем директорию, где находится сам скрипт164current_directory = os.path.dirname(os.path.abspath(__file__))165
166# Создаем уникальное имя файла167file_name = 'parsed_posts.xlsx'168file_path = os.path.join(current_directory, file_name)169
170# Сохраняем файл Excel в директории проекта171df.to_excel(file_path, index=False)172print(f"Данные успешно сохранены в файл: {file_path}")173
174return file_path175
176except Exception as ex:177print(f"Ошибка при извлечении или сохранении данных: {ex}")178
179finally:180cursor.close()181conn.close()182
183
184