7

Web サイト全体をクロールしたいのですが、いくつかのスレッドを読みましたが、第 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 つの試行を示します。1 回目はリンクを解析しようとし、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 が文字列であると想定しています。26 行目の ../example.php で指定されたオブジェクト

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 エラーが発生しました...

何かアイデアをください?? :)

4

5 に答える 5

3

以下を試すことができます。詳細については、このスレッドを参照してください

<?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);
?>
于 2012-08-30T08:58:35.477 に答える
2

深さのある再帰的にウェブサイトからリンクを見つける

<?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);
}
?>` 
于 2016-02-19T11:39:51.367 に答える
1

以下のコードを確認してください。お役に立てば幸いです。

<?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>";
}
?>

ありがとう、ロジャー

于 2012-06-21T08:02:08.147 に答える
0
<?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 />';
}
?>

上記のコードを使用して、可能なすべてのリンクを取得できます

于 2015-03-18T12:40:49.003 に答える