From 04374fef405f1c37d616077f807dddf3371f26cd Mon Sep 17 00:00:00 2001 From: Alexander Date: Wed, 4 Sep 2024 16:12:03 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=B0=D1=87=D0=B0=D0=BB=D0=BE=20=D0=BE?= =?UTF-8?q?=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=B8=20=D0=BF=D0=BE?= =?UTF-8?q?=20=D1=81=D1=81=D1=8B=D0=BB=D0=BA=D0=B0=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ContingentParser/Color.php | 29 ++ ContingentParser/Database/Database.php | 48 +- ContingentParser/Database/DatabaseFacade.php | 4 +- ContingentParser/Facade.php | 21 +- ContingentParser/Http/CurlHelper.php | 10 +- ContingentParser/Http/HttpClientFacade.php | 42 +- ContingentParser/Parser/ContingentFacade.php | 10 + ContingentParser/Parser/ContingentParser.php | 58 ++- ContingentParser/Printer.php | 26 + test.php | 488 ++++++++++++++++++- 10 files changed, 633 insertions(+), 103 deletions(-) create mode 100644 ContingentParser/Color.php create mode 100644 ContingentParser/Printer.php diff --git a/ContingentParser/Color.php b/ContingentParser/Color.php new file mode 100644 index 0000000..458c1d9 --- /dev/null +++ b/ContingentParser/Color.php @@ -0,0 +1,29 @@ +value; + } +} \ No newline at end of file diff --git a/ContingentParser/Database/Database.php b/ContingentParser/Database/Database.php index 152a734..9b61ef7 100644 --- a/ContingentParser/Database/Database.php +++ b/ContingentParser/Database/Database.php @@ -8,10 +8,10 @@ use PDO; final class Database { - private PDO $_pdo; - private static $_logFile = 'log/database.log'; - private DatabaseConfig $_databaseConfig; - private DatabaseLogger $_logger; + private PDO $pdo; + private static $logfile = 'log/database.log'; + private DatabaseConfig $databaseConfig; + private DatabaseLogger $logger; /** * Конструктор * @param \ContingentParser\Database\DatabaseConfig $config @@ -19,23 +19,23 @@ final class Database */ public function __construct(DatabaseConfig $config) { - $this->_logger = new DatabaseLogger(self::$_logFile); - $this->_databaseConfig = $config; + $this->logger = new DatabaseLogger(self::$logfile); + $this->databaseConfig = $config; try { - $dsn = $this->_databaseConfig->getDsn(); - $username = $this->_databaseConfig->getUsername(); - $password = $this->_databaseConfig->getPassword(); - $this->_pdo = new PDO( + $dsn = $this->databaseConfig->getDsn(); + $username = $this->databaseConfig->getUsername(); + $password = $this->databaseConfig->getPassword(); + $this->pdo = new PDO( $dsn, $username, $password, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION] ); - $message = "Подключение к {$this->_databaseConfig->getDBName()} успешно!"; - $this->_logger->log($message); + $message = "Подключение к {$this->databaseConfig->getDBName()} успешно!"; + $this->logger->log($message); } catch (PDOException $e) { - $message = "Ошибка подключения к {$this->_databaseConfig->getDBName()}: {$e->getMessage()}"; - $this->_logger->log($message); + $message = "Ошибка подключения к {$this->databaseConfig->getDBName()}: {$e->getMessage()}"; + $this->logger->log($message); } } /** @@ -43,8 +43,8 @@ final class Database */ public function __destruct() { - $message = "Подключение к {$this->_databaseConfig->getDBName()} прервано!"; - $this->_logger->log($message); + $message = "Подключение к {$this->databaseConfig->getDBName()} прервано!"; + $this->logger->log($message); } /** * Выборка данных из базы @@ -57,7 +57,7 @@ final class Database public function select(string $sql, array $params = []) : array { try { - $stmt = $this->_pdo->prepare($sql); + $stmt = $this->pdo->prepare($sql); if (!empty($params)) { for ($i = 0; $i < count($params); $i++) { $stmt->bindParam(":v".($i+1), $params[$i]); @@ -67,7 +67,7 @@ final class Database $array = $stmt->fetchAll(PDO::FETCH_ASSOC); } catch (PDOException $e) { $message = "Ошибка запроса: " . $e->getMessage(); - $this->_logger->log($message); + $this->logger->log($message); } finally { return $array; } @@ -83,7 +83,7 @@ final class Database public function insert(string $sql, array $params) { try { - $stmt = $this->_pdo->prepare($sql); + $stmt = $this->pdo->prepare($sql); $count = 1; $size = count($params[0]); foreach ($params as $param) { @@ -95,10 +95,10 @@ final class Database $size += count($param); } $stmt->execute(); - $this->_logger->log("Запрос выполнен успешно!"); + $this->logger->log("Запрос выполнен успешно!"); } catch (PDOException $e) { $message = "Ошибка запроса:" . $e->getMessage(); - $this->_logger->log($message); + $this->logger->log($message); // При ошибке запроса сохраняем валидные данные в yaml-файл if ($e->getCode() === "HY000") { $yaml = Yaml::dump($params); @@ -117,16 +117,16 @@ final class Database public function update(string $sql, array $params) { try { - $stmt = $this->_pdo->prepare($sql); + $stmt = $this->pdo->prepare($sql); $count = count($params); for ($i = 0; $i < $count; $i++) { $stmt->bindParam(":v".($i+1), $params[$i]); } // $stmt->execute(); - $this->_logger->log("Запрос выполнен успешно!"); + $this->logger->log("Запрос выполнен успешно!"); } catch (PDOException $e) { $message = "Ошибка запроса:" . $e->getMessage(); - $this->_logger->log($message); + $this->logger->log($message); } } } \ No newline at end of file diff --git a/ContingentParser/Database/DatabaseFacade.php b/ContingentParser/Database/DatabaseFacade.php index 705350c..d3b4a82 100644 --- a/ContingentParser/Database/DatabaseFacade.php +++ b/ContingentParser/Database/DatabaseFacade.php @@ -118,7 +118,7 @@ class DatabaseFacade */ public function specialties() : array { - return $this->specialties ? $this->universities : []; + return $this->specialties ? $this->specialties : []; } /** * Публичное получение id вузов, занесенных в базу opendata @@ -126,7 +126,7 @@ class DatabaseFacade */ public function universities() : array { - return $this->universities ? $this->specialties : []; + return $this->universities ? $this->universities : []; } /** * Извлечение кодов специальности из базы данных niimko diff --git a/ContingentParser/Facade.php b/ContingentParser/Facade.php index 3caf8fd..6eca3c9 100644 --- a/ContingentParser/Facade.php +++ b/ContingentParser/Facade.php @@ -59,7 +59,7 @@ class Facade return; } $url = $this->urlBuilder->build($url); - print(implode(' ', $site). "\033[0m" . PHP_EOL); + Printer::println(implode(' ', $site), 'green'); $html = $this->httpClientFacade->processEducationContingentSites( $url, $site @@ -71,22 +71,23 @@ class Facade $orgId ); - if (empty($contingent)) { - print("\033[91mNo result\033[0m\n"); - $this->htmlLogger->log("$orgId $url"); + if ($contingent) { + // $contingent = $this->contingentFacade->getContingentFromLink($html); + // if ($contingent) { + Printer::println("No result", 'red'); + $this->htmlLogger->log("$orgId $url"); + // } } else { if ($this->contingentFacade->isValidContingent($contingent)) { // Заносим в базу - print_r($contingent); - // $this->databaseFacade->insertContingent($contingent); + Printer::print_r($contingent, 'blue'); + $this->databaseFacade->insertContingent($contingent); } else { $this->htmlLogger->log("$orgId $url"); - print("\033[91mNo result\033[0m\n"); + Printer::println("No result", 'red'); } } - - unset($contingent); - print(PHP_EOL); + Printer::println(); } public function getExclusionSites(string $path) : array diff --git a/ContingentParser/Http/CurlHelper.php b/ContingentParser/Http/CurlHelper.php index 32c3403..1b30035 100644 --- a/ContingentParser/Http/CurlHelper.php +++ b/ContingentParser/Http/CurlHelper.php @@ -2,6 +2,7 @@ namespace ContingentParser\Http; use ContingentParser\Logger\HttpLogger; +use ContingentParser\Printer; use CurlHandle; /** * Summary of CurlHelper @@ -38,7 +39,7 @@ final class CurlHelper curl_setopt($this->curl, CURLOPT_CONNECTTIMEOUT, 90); } /** - * Прекратить сессии + * Прекратить сессию */ public function __destruct() { @@ -55,7 +56,6 @@ final class CurlHelper if ($this->checkLocation($this->url, $html)) { $html = $this->getContent(); } - $this->reportError(); return $html; } /** @@ -77,14 +77,14 @@ final class CurlHelper * Сообщить об ошибке * @return void */ - private function reportError() : void + public function reportError() : void { $httpLogger = new HttpLogger('log/http-curl.log'); $httpCode = curl_getinfo($this->curl, CURLINFO_HTTP_CODE); if ($httpCode != 200 && $httpCode != 0) { - print("\033[91mHTTP-code: $httpCode\033[0m\n"); + Printer::println("HTTP-code: $httpCode", 'red'); $message = implode(' ', $this->site) . ' HTTP-code(' . $httpCode.')'; $httpLogger->log($message, $httpCode); } else if ($httpCode == 0) { @@ -93,7 +93,7 @@ final class CurlHelper $message .= " cURL error ({$errno}): ".curl_strerror($errno); $httpLogger->log($message); } else { - print("\033[94mHTTP-code: $httpCode\033[0m\n"); + Printer::println("HTTP-code: $httpCode", 'blue'); } } } \ No newline at end of file diff --git a/ContingentParser/Http/HttpClientFacade.php b/ContingentParser/Http/HttpClientFacade.php index 5f0b359..59dda9c 100644 --- a/ContingentParser/Http/HttpClientFacade.php +++ b/ContingentParser/Http/HttpClientFacade.php @@ -1,12 +1,8 @@ getEffectiveUri(); } ]); - - print("Redirect $url -> $redirectUrl" . PHP_EOL); + Printer::println("Redirect $url -> $redirectUrl"); $url .= substr($url, -1) == '/' ? '':'/'; - $url .= "sveden/education/"; - print("Parsing for $url" . PHP_EOL); + $url .= "sveden/education/study"; + Printer::println("Parsing for $url"); $response = $client->get($url); $httpCode = $response->getStatusCode(); - print("\033[94mHTTP-code: $httpCode\033[0m\n"); + Printer::println("HTTP-code: $httpCode", 'blue'); $html = $response->getBody()->getContents(); - } catch (ClientException - | RequestException - | ConnectException - | ServerException - | MalformedUriException $e + } catch (\Exception $e ) { - print("\033[91mHTTP-code: ". $e->getCode(). "\033[0m\n"); + Printer::println("HTTP-code: ".$e->getCode(), 'red'); $html = $this->handleException($url, $site); } finally { return $html; @@ -60,23 +49,24 @@ final class HttpClientFacade } /** * Обработка исключения - * Повторная попытка спомощью CurlHelper - * @param string $url - * URL сайта + * Повторная попытка с помощью CurlHelper + * @param string $url URL сайта * @param array $site * @return string */ - private function handleException(string $url, array $site) : string + private function handleException(string $url, array $site): string { $curlHelper = new CurlHelper($url, $site); - return $curlHelper->getContent(); + $html = $curlHelper->getContent(); + $curlHelper->reportError(); + return $html; } /** * Создать клиента с базовым URL * @param string $url * @return \GuzzleHttp\Client */ - private function createClient(string $url) : Client + private function createClient(string $url): Client { $this->config = $this->config() + ["base_uri" => $url]; return new Client($this->config); diff --git a/ContingentParser/Parser/ContingentFacade.php b/ContingentParser/Parser/ContingentFacade.php index be58451..e004331 100644 --- a/ContingentParser/Parser/ContingentFacade.php +++ b/ContingentParser/Parser/ContingentFacade.php @@ -68,4 +68,14 @@ class ContingentFacade $con['org_id'] = $orgId; } } + /** + * Summary of getContingentFromLink + * @param string $html + * @return array + */ + // public function getContingentFromLink(string $html): array + // { + // $parser = new ContingentParser($html); + // $ + // } } \ No newline at end of file diff --git a/ContingentParser/Parser/ContingentParser.php b/ContingentParser/Parser/ContingentParser.php index 3fdad89..a58ac86 100644 --- a/ContingentParser/Parser/ContingentParser.php +++ b/ContingentParser/Parser/ContingentParser.php @@ -7,6 +7,7 @@ use DOMXPath; class ContingentParser { private ?DOMXPath $xpath; + private DOMDocument $dom; private const TEMPLATE = '//tr[@itemprop="eduChislen"]//'; private const ENCODING = "UTF-8"; private const FIELDS = [ @@ -20,15 +21,15 @@ class ContingentParser public function __construct(string $html) { libxml_use_internal_errors(true); - $dom = new DOMDocument( + $this->dom = new DOMDocument( encoding: self::ENCODING ); if (empty($html)) { $this->xpath = null; } else { $this->setEncoding($html); - $dom->loadHTML($html); - $this->xpath = new DOMXPath($dom); + $this->dom->loadHTML($html); + $this->xpath = new DOMXPath($this->dom); } } @@ -45,32 +46,11 @@ class ContingentParser } $html = mb_convert_encoding($html,'HTML-ENTITIES','UTF-8'); } - private function parse() : array - { - $data = []; - foreach (self::FIELDS as $field => $tag) { - if (!is_array($tag)) { - $data[$field] = $this->xpath->query( - self::TEMPLATE . $tag . "[@itemprop=\"$field\"]" - ); - } else { - $th = $this->xpath->query( - self::TEMPLATE . $tag[0] . "[@itemprop=\"$field\"]" - ); - $td = $this->xpath->query( - self::TEMPLATE . $tag[1] . "[@itemprop=\"$field\"]" - ); - $data[$field] = $th->length > $td->length ? $th : $td; - } - } - return $data; - } - public function getDataTable() : array { if (empty($this->xpath)) return []; - $data = $this->parse(); + $data = $this->parseContingent(); $records = []; if ($data == null) return []; @@ -96,4 +76,32 @@ class ContingentParser } return $records; } + + private function parseContingent() : array + { + $data = []; + foreach (self::FIELDS as $field => $tag) { + if (!is_array($tag)) { + $data[$field] = $this->xpath->query( + self::TEMPLATE . $tag . "[@itemprop=\"$field\"]" + ); + } else { + $th = $this->xpath->query( + self::TEMPLATE . $tag[0] . "[@itemprop=\"$field\"]" + ); + $td = $this->xpath->query( + self::TEMPLATE . $tag[1] . "[@itemprop=\"$field\"]" + ); + $data[$field] = $th->length > $td->length ? $th : $td; + } + } + return $data; + } + + public function getLink(): string + { + $data = $this->dom->getElementsByTagName('a'); + var_dump($data->item(0)->getAttribute('href')); + return ''; + } } \ No newline at end of file diff --git a/ContingentParser/Printer.php b/ContingentParser/Printer.php new file mode 100644 index 0000000..8051275 --- /dev/null +++ b/ContingentParser/Printer.php @@ -0,0 +1,26 @@ +tostring().$text.Color::WHITE->tostring()); + } + + public static function println(string $text = '', string $color = '') : void + { + $color = Color::create($color); + print($color->tostring().$text.Color::WHITE->tostring()); + print(PHP_EOL); + } + + public static function print_r(mixed $value, string $color = '') : void + { + $color = Color::create($color); + print($color->tostring()); + print_r($value); + print(Color::WHITE->tostring()); + } +} \ No newline at end of file diff --git a/test.php b/test.php index 829e9b0..9ceab4f 100644 --- a/test.php +++ b/test.php @@ -1,15 +1,481 @@ updateSitesOpendata($data); + + + + + + + + + + + + Образование. ДОНСКОЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ + + + + +
+ +
+
+ + К содержанию + +
    +
  • + Размер шрифта: +
      +
    • + A +
    • +
    • + A +
    • +
    • + A +
    • +
    +
  • +
  • + Цвета сайта: +
      +
    • + Ц +
    • +
    • + Ц +
    • +
    • + Ц +
    • +
    +
  • +
+ + + + +
+
    +
  • + Изображения: +
      +
    • + Включить +
    • +
    • + Выключить +
    • +
    +
  • +
  • + Ганитура: +
      +
    • + Без засечек +
    • +
    • + С засечками +
    • +
    +
  • +
  • + Кернинг: +
      +
    • + +
    • +
    • + a б +
    • +
    • + a  б +
    • +
    +
  • +
  • + Интервал: +
      +
    • + Одинарный +
    • +
    • + Полуторный +
    • +
    • + Двойной +
    • +
    +
  • +
+ + +
+
+
+ Для озвучки текста - выделите необходимый текст и нажмите кнопку "Озвучить" +
+
+ +
+ +
+
+
+
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
+
ДОНСКОЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
+
+
+
+
+ + +
+
+
+ + +
+ + + +

Образование

+
+
+ + Информация о реализуемых образовательных программах, включая адаптированные образовательные программы (при наличии), + с указанием учебных предметов, курсов, дисциплин (модулей), практики, предусмотренных соответствующей образовательной программой + (за исключением образовательных программ дошкольного образования), с указанием для каждой из них следующей информации: +
    +
  • + об уровне общего или профессионального образования, о наименовании образовательной программы + (для общеобразовательных программ); +
  • +
  • + о форме обучения (за исключением образовательных программ дошкольного образования); +
  • +
  • + нормативном сроке обучения, коде и наименовании профессии, специальности (специальностей), + направления (направлений) подготовки или укрупненной группе профессий, + специальностей и направлений подготовки (для образовательных программ высшего образования + по программам бакалавриата, программам специалитета, программам магистратуры, программам ординатуры + и программам ассистентуры-стажировки); +
  • +
  • + о шифре и наименовании области науки, группы научных специальностей, научной специальности + (для образовательных программ высшего образования по программам подготовки научных и + научно-педагогических кадров в аспирантуре (адъюнктуре); +
  • +
  • + о наличии или об отсутствии государственной аккредитации образовательной деятельности по реализуемым образовательным программам, + за исключением образовательных программ дошкольного образования, программ подготовки научных и научно-педагогических + кадров в аспирантуре (адъюнктуре), образовательных программ, реализуемых в соответствии с федеральным государственным + образовательным стандартом образования обучающихся с нарушением интеллекта, и основных программ профессионального обучения + (выписка из государственной информационной системы "Реестр организаций, осуществляющих образовательную деятельность + по имеющим государственную аккредитацию образовательным программам"); +
  • +
  • + об использовании при реализации образовательной программы электронного обучения + и дистанционных образовательных технологий. +
  • +
+
+
+
+ + Информация о реализуемых образовательных программах, включая адаптированные образовательные программы (при наличии), + представляемую в виде образовательной программы в форме электронного документа или в виде активных ссылок, + непосредственный переход по которым позволяет получить доступ к страницам Сайта, + содержащим отдельные компоненты образовательной программы, в том числе: +
    +
  • + об учебном плане с приложением его в виде электронного документа; +
  • +
  • + о календарном учебном графике с приложением его в виде электронного документа; +
  • +
  • + о рабочих программ учебных предметов, курсов, дисциплин (модулей); +
  • +
  • + о иных компонентах, оценочных и методических материалах, + а также в предусмотренных Федеральным законом от 29.12.2012 № 273-ФЗ «Об образовании в Российской Федерации» + случаях в виде рабочей программы воспитания, календарного плана воспитательной работы, форм аттестации + в виде электронного документа. +
  • +
+
+
+ + +
+

+ Информация о языках образования (в форме электронного документа) +

+ +
+ + + + + +
+
+
+
+ + + +
+
+
+ + + + +
+ + + + + + + + + + + + +HTML; +$parser = new ContingentParser($html); +$str = $parser->getLink(); \ No newline at end of file