/** * Предварительная обработка HTML-документа */ public function load(nc_search_indexer_crawler_response $response) { libxml_clear_errors(); // такое преобразование позволяет избавиться от некорректных для UTF-8 // последовательностей, из-за которых могут возникать неожиданные проблемы: $html = mb_convert_encoding($response->get_body(), 'UTF-8', 'UTF-8'); // это позволит различать предложения, не оканчивающиеся на точку, // после того, как будут убраны тэги (в макетах NetCat немало таких мест): $html = str_ireplace(array("<div", "</div>", "<p", "</p>", "<ul", "<ol", "<li", "</li>", "<tr", "<td", "<br", "</a><a", "<option", "</option>", "</h1>", "</h2>", "</h3>", "</h4>", "</h5>"), array("\n\n<div", " \n\n</div>", "\n\n<p", " \n\n</p>", "\n\n<ul", "\n\n<ol", "\n\n<li", "\n</li>", "\n<tr", "\n<td", "\n<br", "</a> <a", "\n<option", "\n</option>", "\n\n</h1>", "\n\n</h2>", "\n\n</h3>", "\n\n</h4>", "\n\n</h5>"), $html); // уберем тег script $html = preg_replace("#<script(.*?)>(.*?)</script>#siu", '', $html); $this->parts = array('document' => new nc_search_document_parser_html_fragment($html)); }
protected function request($method, $url) { try { $this->http_client->{$method}($url); $response = $this->http_client->currentResponse(); } catch (nc_search_indexer_crawler_exception $e) { // слушателю не понравились заголовки $response = $e->get_response(); } $response["url"] = $url; $response = new nc_search_indexer_crawler_response($response); // if (nc_search::will_log(nc_search::LOG_CRAWLER_REQUEST)) { $len = $response->get_content_length(); nc_search::log(nc_search::LOG_CRAWLER_REQUEST, strtoupper($method) . " {$url}\n" . "Response: {$response->get_code()}\n" . ($response->get_code() < 400 ? "Content-Type: " . $response->get_content_type() . "\n" . "Content-Length: " . (is_null($len) ? "no" : $len) . ", received: " . $response->get_body_length() . " bytes" : '')); // } return $response; }
/** * Обработать ответ пользователя (crawler) * @param nc_search_indexer_crawler_response $response * @param nc_search_indexer_link $link * @return bool */ protected function process_response(nc_search_indexer_crawler_response $response, nc_search_indexer_link $link) { $content_type = $response->get_content_type(); $parser = $this->get_parser($content_type); $parser->load($response); // пусть парсер скажет, будем ли мы обрабатывать этот документ? // (например, не будем, если есть meta robots=noindex) if (!$parser->should_index()) { return false; } // получить ссылки $page_hrefs = $this->filter_links($parser->extract_links()); $page_url = $response->get_url(); // добавить ссылки в очередь (где-то там разберутся, чтобы ссылки // не повторялись и были абсолютными): $page_link_ids = $this->task->add_links($page_hrefs, $page_url); // распарсить контент $document = $parser->get_document(); $document->set_values(array('url' => $page_url, 'path' => nc_search_util::get_url_path($page_url), 'content_type' => $content_type, 'to_delete' => false, 'last_modified' => $response->get_last_modified())); $this->apply_hierarchy_options($document); if (nc_search::will_log(nc_search::LOG_PARSER_DOCUMENT_BRIEF)) { nc_search::log(nc_search::LOG_PARSER_DOCUMENT_BRIEF, "Parsed document from '{$page_url}'. Indexed content: " . strlen($document->get('intact_content')) . " bytes"); } if (nc_search::will_log(nc_search::LOG_PARSER_DOCUMENT_VERBOSE)) { nc_search::log(nc_search::LOG_PARSER_DOCUMENT_VERBOSE, $document->dump()); } // добавить в индекс $this->index->process_document($document); // сохранить информацию о том, кто куда ссылается // (referrer_link_id сохраняется из-за неясностей/неточностей в ТЗ, которое // подразумевает, что сбор ссылок может производиться на страницах, // которые не сохраняются в индексе) $referrer_link_id = (int) $link->get_id(); // might be null $doc_id = (int) $document->get_id(); foreach ($page_link_ids as $page_link_id) { if (!$page_link_id) { continue; } $this->referrer_cache[] = "(" . $doc_id . "," . $referrer_link_id . "," . (int) $page_link_id . ")"; } return true; }