parser_version7
/
test2.py
181 строка · 7.8 Кб
1import mysql.connector
2import pandas as pd
3from selenium import webdriver
4from selenium.webdriver.chrome.service import Service
5from selenium.webdriver.common.by import By
6from selenium.webdriver.common.keys import Keys
7from selenium.webdriver.support.ui import WebDriverWait
8from selenium.webdriver.support import expected_conditions as EC
9from bs4 import BeautifulSoup
10from datetime import datetime, date, timedelta
11import time
12import os
13
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, keywords
21except 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# Конфигурация подключения к базе данных MySQL
30config = {
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.exe
52chrome = "" # Замените на реальный путь к chromedriver
53service = Service(chrome)
54
55# Настройка ChromeOptions
56options = 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_source
85soup = 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]}.")
92continue
93
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 = url
100
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() # Преобразуем в date
108except 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# Конфигурация подключения к базе данных MySQL
143config = {
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("Данные не извлечены из базы данных.")
158return
159
160# Преобразуем результаты в DataFrame
161df = 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_path
175
176except Exception as ex:
177print(f"Ошибка при извлечении или сохранении данных: {ex}")
178
179finally:
180cursor.close()
181conn.close()
182
183
184