From 37fbc627cc97c41653a4207d9d95ba9dc4ed73ba Mon Sep 17 00:00:00 2001 From: Ilia Miheev Date: Thu, 29 May 2025 16:38:04 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D1=91=D0=BD=20=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D1=80=D1=8B=D0=B9=20=D1=84=D0=B0=D0=B9=D0=BB=20?= =?UTF-8?q?=D0=B3=D0=B4=D0=B5=20=D0=BD=D0=B0=D1=85=D0=BE=D0=B4=D0=B8=D0=BB?= =?UTF-8?q?=D0=B8=D1=81=D1=8C=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ipars/module.py | 222 ------------------------------------------------ 1 file changed, 222 deletions(-) delete mode 100644 ipars/module.py diff --git a/ipars/module.py b/ipars/module.py deleted file mode 100644 index 7dbd049..0000000 --- a/ipars/module.py +++ /dev/null @@ -1,222 +0,0 @@ -from selenium.webdriver.chrome.options import Options -from selenium import webdriver -from bs4 import BeautifulSoup -from pprint import pprint -from time import sleep -import requests -import json -import csv - - -class CsvManager: - '''Класс для работы с csv файлами во время парсинга''' - - def __init__(self, newline: str = '', encoding: str = 'utf8', delimiter: str = ';'): - '''Конструктор - - newline: новая строка в csv файле - encoding: кодировка открываемого файла - delimiter: разделитель данных в csv файле''' - self.newline = newline - self.encoding = encoding - self.delimiter = delimiter - - def pprint(self, data: any) -> None: - '''Выводим данные в удобочитаемом виде - - data: данные которые надо вывести''' - pprint(data) - - def writerow(self, filePath: str, mode: str, row: list) -> None: - '''Записываем строку в csv файл - - filePath: путь до csv файла - mode (w/a): метод открытия файла - row: список записываемых данных''' - with open(filePath, mode=mode, newline=self.newline, encoding=self.encoding) as file: - writer = csv.writer(file, delimiter=self.delimiter) - writer.writerow(row) - - def writerows(self, filePath: str, mode: str, row: list) -> None: - '''Записываем строки в csv файл - - filePath: путь до csv файла - mode (w/a): метод открытия файла - row: список записываемых данных''' - with open(filePath, mode=mode, newline=self.newline, encoding=self.encoding) as file: - writer = csv.writer(file, delimiter=self.delimiter) - writer.writerows(row) - - def getRows(self, filePath: str) -> list: - '''Возвращает строки файла - - filePath: путь до csv файла''' - userRows = [] - with open(filePath, mode='r', newline=self.newline, encoding=self.encoding) as csvfile: - csvReader = csv.reader(csvfile, delimiter=self.delimiter) - for row in csvReader: - userRows.append(row) - return userRows - - -class JsonManager: - '''Класс для работы с json файлами во время парсинга''' - - def __init__(self, encoding: str = 'utf8'): - '''Конструктор - - encoding: кодировка открываемого файла''' - self.encoding = encoding - - def pprint(self, data: any) -> None: - '''Выводим данные в удобочитаемом виде - - data: данные которые надо вывести''' - pprint(data) - - def load(self, pathToJsonFile: str) -> json: - '''Получаем данные из json файла - - pathToJsonFile: путь до json файла''' - with open(pathToJsonFile, encoding=self.encoding) as jsonFile: - src = json.load(jsonFile) - return src - - def dump(self, pathToJsonFile: str, data: any) -> None: - '''Записываем данные в json файл - - pathToJsonFile: путь до json файла - data: данные которые надо записать''' - with open(pathToJsonFile, 'w', encoding=self.encoding) as jsonFile: - json.dump(data, jsonFile, indent=4, ensure_ascii=0) - - -class Pars: - '''Модуль для работы с запросами и bs4''' - - def returnBs4Object(self, pathToFile: str, encoding: str = 'utf8', parser: str = 'lxml'): - '''Возвращаем объект beautifulsoup - - pathToFile: путь до html файла - encoding: кодировка открытия html файла - parser: парсер, который будет использоваться для работы''' - with open(pathToFile, encoding=encoding) as file: - src = file.read() - soup = BeautifulSoup(src, parser) - return soup - - def getTexts(self, arr: list, needFix: bool = 0) -> list: - '''Возвращаем текст из элементов bs4 - - arr: список объектов bs4 из которых будет извлекаться текст - needFix (0/1): если этот параметр установлен как True, то из текста будут удалены \\n, \\t и пробелы с концов''' - result = [] - for item in arr: - data = item.text - if needFix: - data = data.strip() - data = data.replace('\t', '') - data = data.replace('\n', '') - - if not data: - continue - result.append(data) - - if not result: - return None - return result - - def getAttributes(self, arr: list, att: str) -> list: - '''Возвращаем список значений атрибутов - - arr: список объектов bs4 из которых будет извлекаться атрибут - att: строка с названием атрибута по которому будет осуществляться поиск''' - result = [] - for item in arr: - data = item.get(att) - if data is not None: - result.append(item.get(att)) - - if not result: - return None - return result - - def pprint(self, data: any) -> None: - '''Выводим данные в удобочитаемом виде - - data: данные которые надо вывести''' - pprint(data) - - def getStaticPage(self, pathToSaveFile: str, url: str, writeMethod: str = 'w', headers: dict = None) -> int: - '''Получаем статическую страницу и возвращаем статус ответа от сервера - - pathToSaveFile: путь, куда сохранится полученный файл - url: ссылка на данные - writeMethod: метод записи данных в файл. "W" записывает текст, "WB" — байты - headers: заголовки запроса к серверу''' - - if headers is None: - headers = { - "Accept": "*/*", - "User-Agent": "Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1" - } - - try: - # Отправляем запрос - req = requests.get(url, headers=headers) - - # Записываем данные - if writeMethod == 'w': - src = req.text - with open(pathToSaveFile, 'w', encoding='utf-8') as file: - file.write(src) - - elif writeMethod == 'wb': - src = req.content - with open(pathToSaveFile, 'wb') as file: - file.write(src) - else: - raise ValueError(f"Неподдерживаемый метод записи: {writeMethod}") - - return req.status_code # Возвращаем статус ответа от сервера - - except requests.exceptions.HTTPError as httpErr: - raise RuntimeError(f"HTTP ошибка: {httpErr}") from http_err - except Exception as e: - raise RuntimeError(e) from e - - def getDinamicPage(self, pathToSaveFile: str, url: str, closeWindow: bool = 1, timeSleep: int = 2) -> None: - '''Получаем динамическую страницу - - pathToSaveFile: путь, куда сохранится полученный файл - url: ссылка на данные - closeWindow (0/1): если указана единица, то браузер открывается в фоновом режиме, 0 — открывается как обычное приложение - timeSleep: время ожидания браузера перед тем как скролить страницу дальше''' - - # Устанавливаем опции для Chrome WebDriver - options = Options() - if closeWindow: - options.add_argument('--headless') - - # открываем браузер - with webdriver.Chrome(options=options) as driver: - driver.get(url) - # Прокручиваем страницу до самого низа - lastHeight = driver.execute_script("return document.body.scrollHeight") - - while True: - # Прокручиваем до низа страницы - driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") - # Ждем загрузки страницы - sleep(timeSleep) - # Вычисляем новую высоту страницы - newHeight = driver.execute_script("return document.body.scrollHeight") - if newHeight == lastHeight: - break - lastHeight = newHeight - - # Получаем HTML-код страницы - htmlContent = driver.page_source - # Сохраняем HTML-код в файл - with open(pathToSaveFile, "w", encoding="utf-8") as file: - file.write(htmlContent)