Intereting Posts
Удалите пустые элементы массива с помощью array_filter с функцией обратного вызова Как я могу вызвать Validator из пространства имен с уже существующим классом Validator "Диапазон не в порядке в классе символов" в PHP регулярное выражение? Почему «эхо» 2? print (2) + 3 "print 521? используя wp_authenticate () для перенаправления определенных пользователей при входе в систему Инкапсулировать все приложение в транзакции базы данных php cookie не работает в первый раз при чтении Лучшая практика для включения JS (с PHP) в файл функций WordPress Строгая стандартная ошибка Есть ли у PHP функция обнаружения ОС, на которой она работает? Как отслеживать по номеру отслеживания уникальный идентификатор? Объект класса Database не может быть преобразован в строку Передача массива PHP в SOAP-вызове Как получить предложения от Solr Server в переменной PHP Как единый вход (SSO) работает с PHP + Apache в Active Directory для прозрачной проверки подлинности?

Обход веб-сайта, получение ссылок, сканирование ссылок с помощью PHP и XPATH

Я хочу, чтобы сканировать весь сайт, я прочитал несколько потоков, но мне не удается получить данные на 2-м уровне.

То есть, я могу вернуть ссылки со стартовой страницы, но тогда я не могу найти способ разобрать ссылки и получить содержание каждой ссылки …

Код, который я использую:

<?php // SELECT STARTING PAGE $url = 'http://mydomain.com/'; $html= file_get_contents($url); // GET ALL THE LINKS OF EACH PAGE // create a dom object $dom = new DOMDocument(); @$dom->loadHTML($html); // run xpath for the dom $xPath = new DOMXPath($dom); // get links from starting page $elements = $xPath->query("//a/@href"); foreach ($elements as $e) { echo $e->nodeValue. "<br />"; } // Parse each page using the extracted links? ?> 

Может ли кто-нибудь помочь мне на последней части с примером?

Я буду очень благодарен!


Ну, спасибо за ваши ответы! Я пробовал кое-что, но у меня не было никаких результатов для получения результатов – я новичок в программировании.

Ниже вы можете найти 2 из моих попыток – первый пытается разобрать ссылки, а во втором пытается заменить содержимое file_get на Curl:

  1) <?php // GET STARTING PAGE $url = 'http://www.capoeira.com.gr/'; $html= file_get_contents($url); //GET ALL THE LINKS FROM STARTING PAGE // create a dom object $dom = new DOMDocument(); @$dom->loadHTML($html); // run xpath for the dom $xPath = new DOMXPath($dom); // get specific elements from the sites $elements = $xPath->query("//a/@href"); //PARSE EACH LINK foreach($elements as $e) { $URLS= file_get_contents($e); $dom = new DOMDocument(); @$dom->loadHTML($html); $xPath = new DOMXPath($dom); $output = $xPath->query("//div[@class='content-entry clearfix']"); echo $output ->nodeValue; } ?> 

Для вышеприведенного кода я получаю предупреждение: file_get_contents () ожидает, что параметр 1 будет строкой, объект указан в ../example.php в строке 26

2)

  <?php $curl = curl_init(); curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_URL, "http://capoeira.com.gr"); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $content= curl_exec($curl); curl_close($curl); $dom = new DOMDocument(); @$dom->loadHTML($content); $xPath = new DOMXPath($dom); $elements = $xPath->query("//a/@href"); foreach ($elements as $e) { echo $e->nodeValue. "<br />"; } ?> 

Я не получаю никаких результатов. Я попытался отобразить $ content, а затем получаю:

У вас нет разрешения на доступ к этому серверу.

Кроме того, при попытке использовать ErrorDocument для обработки запроса возникла ошибка 413 Request Entity Too Large.

Любые идеи, пожалуйста? 🙂

Вы можете попробовать следующее. См. Эту тему для получения более подробной информации

 <?php //set_time_limit (0); function crawl_page($url, $depth = 5){ $seen = array(); if(($depth == 0) or (in_array($url, $seen))){ return; } $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_TIMEOUT, 30); curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); $result = curl_exec ($ch); curl_close ($ch); if( $result ){ $stripped_file = strip_tags($result, "<a>"); preg_match_all("/<a[\s]+[^>]*?href[\s]?=[\s\"\']+"."(.*?)[\"\']+.*?>"."([^<]+|.*?)?<\/a>/", $stripped_file, $matches, PREG_SET_ORDER ); foreach($matches as $match){ $href = $match[1]; if (0 !== strpos($href, 'http')) { $path = '/' . ltrim($href, '/'); if (extension_loaded('http')) { $href = http_build_url($href , array('path' => $path)); } else { $parts = parse_url($href); $href = $parts['scheme'] . '://'; if (isset($parts['user']) && isset($parts['pass'])) { $href .= $parts['user'] . ':' . $parts['pass'] . '@'; } $href .= $parts['host']; if (isset($parts['port'])) { $href .= ':' . $parts['port']; } $href .= $path; } } crawl_page($href, $depth - 1); } } echo "Crawled {$href}"; } crawl_page("http://www.sitename.com/",3); ?> 
 $doc = new DOMDocument; $doc->load('file.htm'); $items = $doc->getElementsByTagName('a'); foreach($items as $value) { echo $value->nodeValue . "\n"; $attrs = $value->attributes; echo $attrs->getNamedItem('href')->nodeValue . "\n"; }; 

Пожалуйста, проверьте приведенный ниже код, надейтесь, что он вам поможет.

 <?php $html = new DOMDocument(); @$html->loadHtmlFile('http://www.yourdomain.com'); $xpath = new DOMXPath( $html ); $nodelist = $xpath->query( "//div[@class='A-CLASS-Name']/h3/a/@href" ); foreach ($nodelist as $n){ echo $n->nodeValue."\n<br>"; } ?> 

Спасибо, Роджер

найти ссылку с сайта рекурсивно с глубиной

 <?php $depth = 1; print_r(getList($depth)); function getList($depth) { $lists = getDepth($depth); return $lists; } function getUrl($request_url) { $countValid = 0; $brokenCount =0; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $request_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // We want to get the respone $result = curl_exec($ch); $regex = '|<a.*?href="(.*?)"|'; preg_match_all($regex, $result, $parts); $links = $parts[1]; $lists = array(); foreach ($links as $link) { $url = htmlentities($link); $result =getFlag($url); if($result == true) { $UrlLists["clean"][$countValid] =$url; $countValid++; } else { $UrlLists["broken"][$brokenCount]= "broken->".$url; $brokenCount++; } } curl_close($ch); return $UrlLists; } function ZeroDepth($list) { $request_url = $list; $listss["0"]["0"] = getUrl($request_url); $lists["0"]["0"]["clean"] = array_unique($listss["0"]["0"]["clean"]); $lists["0"]["0"]["broken"] = array_unique($listss["0"]["0"]["broken"]); return $lists; } function getDepth($depth) { // $list =OW_URL_HOME; $list = "https://example.com";//enter the url of website $lists =ZeroDepth($list); for($i=1;$i<=$depth;$i++) { $l= $i; $l= $l-1; $depthArray=1; foreach($lists[$l][$l]["clean"] as $depthUrl) { $request_url = $depthUrl; $lists[$i][$depthArray]["requst_url"]=$request_url; $lists[$i][$depthArray] = getUrl($request_url); } } return $lists; } function getFlag($url) { $url_response = array(); $curl = curl_init(); $curl_options = array(); $curl_options[CURLOPT_RETURNTRANSFER] = true; $curl_options[CURLOPT_URL] = $url; $curl_options[CURLOPT_NOBODY] = true; $curl_options[CURLOPT_TIMEOUT] = 60; curl_setopt_array($curl, $curl_options); curl_exec($curl); $status = curl_getinfo($curl, CURLINFO_HTTP_CODE); if ($status == 200) { return true; } else { return false; } curl_close($curl); } ?>` 
 <?php $path='http://www.hscripts.com/'; $html = file_get_contents($path); $dom = new DOMDocument(); @$dom->loadHTML($html); // grab all the on the page $xpath = new DOMXPath($dom); $hrefs = $xpath->evaluate("/html/body//a"); for ($i = 0; $i < $hrefs->length; $i++ ) { $href = $hrefs->item($i); $url = $href->getAttribute('href'); echo $url.'<br />'; } ?> 

вы можете использовать вышеприведенный код, чтобы получить все возможные ссылки