parser_version2

Форк
0
/
test2.py 
125 строк · 4.8 Кб
1
import mysql.connector
2
import pandas as pd
3
from selenium import webdriver
4
from selenium.webdriver.chrome.service import Service
5
from selenium.webdriver.common.by import By
6
from selenium.webdriver.common.keys import Keys
7
from bs4 import BeautifulSoup
8
import time
9

10
def parse_and_save(a, nazvanie, poisk):
11
    # Конфигурация подключения к базе данных MySQL
12
    config = {
13
        'user': 'root',
14
        'password': 'Uz94deco!',
15
        'host': '127.0.0.1',
16
        'database': 'parser'
17
    }
18

19
    # Подключение к базе данных
20
    conn = mysql.connector.connect(**config)
21
    cursor = conn.cursor()
22

23
    # Очистка таблицы перед добавлением новых данных
24
    try:
25
        cursor.execute("TRUNCATE TABLE posts")
26
        conn.commit()
27
        print("Таблица posts очищена и автоинкремент сброшен.")
28
    except Exception as ex:
29
        print(f"Ошибка при очистке таблицы: {ex}")
30
        conn.rollback()
31

32
    # Укажите путь к chromedriver.exe
33
    chrome = ""  # Убедитесь, что указали правильный путь
34
    service = Service(chrome)
35

36
    # Настройка ChromeOptions
37
    options = webdriver.ChromeOptions()
38
    options.add_argument('--headless')  # Запуск в фоновом режиме
39
    options.page_load_strategy = 'normal'  # Установка стратегии загрузки страницы
40
    driver = webdriver.Chrome(service=service, options=options)
41

42
    # Увеличьте время ожидания до 30 секунд
43
    driver.set_page_load_timeout(30)
44

45
    try:
46
        driver.maximize_window()
47

48
        # Проверка синхронизации длины списков
49
        if len(nazvanie) < len(a):
50
            nazvanie.extend(['Телеграмм'] * (len(a) - len(nazvanie)))  # Заполняем пробелы для синхронизации
51

52
        for i, url in enumerate(a):
53
            print(f"Открываем URL: {url}")
54
            driver.get(url=url)
55

56
            for query in poisk:
57
                try:
58
                    search_input = driver.find_element(By.CSS_SELECTOR, '.tgme_header_search_form_input')
59
                    search_input.clear()
60

61
                    # Вводим запрос в поле поиска
62
                    search_input.send_keys(query)
63
                    search_input.send_keys(Keys.RETURN)
64

65
                    # Ждём загрузки результатов
66
                    time.sleep(2)  # Увеличьте время ожидания при необходимости
67

68
                    # Получаем HTML страницы
69
                    html = driver.page_source
70
                    soup = BeautifulSoup(html, "html.parser")
71

72
                    # Ищем текст всех постов
73
                    posts = soup.find_all('div', class_='tgme_widget_message_text')
74

75
                    if not posts:
76
                        print(f"По запросу '{query}' ничего не найдено на канале {nazvanie[i]}.")
77
                        continue
78

79
                    for post in posts:
80
                        text = post.get_text(strip=True)
81

82
                        # Запись в базу данных
83
                        cursor.execute(""" 
84
                            INSERT INTO posts (channel_name, channel_link, post_text) 
85
                            VALUES (%s, %s, %s) 
86
                        """, (nazvanie[i], url, text))
87
                        conn.commit()
88

89
                        print(f"Текст поста из канала {nazvanie[i]} добавлен в базу данных.")
90
                except Exception as ex:
91
                    print(f"Ошибка при обработке запроса '{query}' на {url}: {ex}")
92

93
    except Exception as ex:
94
        print(f"Общая ошибка: {ex}")
95

96
    finally:
97
        driver.close()
98
        driver.quit()
99
        cursor.close()
100
        conn.close()
101

102
    # Извлечение данных из базы и запись в Excel
103
    try:
104
        conn = mysql.connector.connect(**config)
105
        cursor = conn.cursor(dictionary=True)
106

107
        cursor.execute("SELECT * FROM posts")
108
        results = cursor.fetchall()
109

110
        # Преобразуем результаты в DataFrame
111
        df = pd.DataFrame(results)
112

113
        # Сохраняем в Excel
114
        file_path = 'parsed_posts.xlsx'
115
        df.to_excel(file_path, index=False)
116
        print(f"Данные успешно сохранены в {file_path}")
117
        
118
        return file_path
119

120
    except Exception as ex:
121
        print(f"Ошибка при сохранении данных: {ex}")
122

123
    finally:
124
        cursor.close()
125
        conn.close()
126

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.