parser_version2
/
test2.py
125 строк · 4.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 bs4 import BeautifulSoup8import time9
10def parse_and_save(a, nazvanie, poisk):11# Конфигурация подключения к базе данных MySQL12config = {13'user': 'root',14'password': 'Uz94deco!',15'host': '127.0.0.1',16'database': 'parser'17}18
19# Подключение к базе данных20conn = mysql.connector.connect(**config)21cursor = conn.cursor()22
23# Очистка таблицы перед добавлением новых данных24try:25cursor.execute("TRUNCATE TABLE posts")26conn.commit()27print("Таблица posts очищена и автоинкремент сброшен.")28except Exception as ex:29print(f"Ошибка при очистке таблицы: {ex}")30conn.rollback()31
32# Укажите путь к chromedriver.exe33chrome = "" # Убедитесь, что указали правильный путь34service = Service(chrome)35
36# Настройка ChromeOptions37options = webdriver.ChromeOptions()38options.add_argument('--headless') # Запуск в фоновом режиме39options.page_load_strategy = 'normal' # Установка стратегии загрузки страницы40driver = webdriver.Chrome(service=service, options=options)41
42# Увеличьте время ожидания до 30 секунд43driver.set_page_load_timeout(30)44
45try:46driver.maximize_window()47
48# Проверка синхронизации длины списков49if len(nazvanie) < len(a):50nazvanie.extend(['Телеграмм'] * (len(a) - len(nazvanie))) # Заполняем пробелы для синхронизации51
52for i, url in enumerate(a):53print(f"Открываем URL: {url}")54driver.get(url=url)55
56for query in poisk:57try:58search_input = driver.find_element(By.CSS_SELECTOR, '.tgme_header_search_form_input')59search_input.clear()60
61# Вводим запрос в поле поиска62search_input.send_keys(query)63search_input.send_keys(Keys.RETURN)64
65# Ждём загрузки результатов66time.sleep(2) # Увеличьте время ожидания при необходимости67
68# Получаем HTML страницы69html = driver.page_source70soup = BeautifulSoup(html, "html.parser")71
72# Ищем текст всех постов73posts = soup.find_all('div', class_='tgme_widget_message_text')74
75if not posts:76print(f"По запросу '{query}' ничего не найдено на канале {nazvanie[i]}.")77continue78
79for post in posts:80text = post.get_text(strip=True)81
82# Запись в базу данных83cursor.execute("""84INSERT INTO posts (channel_name, channel_link, post_text)
85VALUES (%s, %s, %s)
86""", (nazvanie[i], url, text))87conn.commit()88
89print(f"Текст поста из канала {nazvanie[i]} добавлен в базу данных.")90except Exception as ex:91print(f"Ошибка при обработке запроса '{query}' на {url}: {ex}")92
93except Exception as ex:94print(f"Общая ошибка: {ex}")95
96finally:97driver.close()98driver.quit()99cursor.close()100conn.close()101
102# Извлечение данных из базы и запись в Excel103try:104conn = mysql.connector.connect(**config)105cursor = conn.cursor(dictionary=True)106
107cursor.execute("SELECT * FROM posts")108results = cursor.fetchall()109
110# Преобразуем результаты в DataFrame111df = pd.DataFrame(results)112
113# Сохраняем в Excel114file_path = 'parsed_posts.xlsx'115df.to_excel(file_path, index=False)116print(f"Данные успешно сохранены в {file_path}")117
118return file_path119
120except Exception as ex:121print(f"Ошибка при сохранении данных: {ex}")122
123finally:124cursor.close()125conn.close()126