2013-11-27 1 views
0

간단한 작업이 있습니다. 페이지에서 모든 기사를 가져오고 각 기사의 모든 그림을 가져옵니다. 내가 사진없이 기사 만 얻을하려고합니다PHP 간단한 HTML DOM 파서 : 모든 게시물 얻기

<?php 

include("simple_html_dom.php"); 

$sitesToCheck = array(
    array(
     'url' => 'http://googleblog.blogspot.ru/', 
     'search_element' => 'h2.title a', 
     'get_element' => 'div.post-content' 
    ), 
    array(
     // 'url' => '',   // Site address with a list of of articles 
     // 'search_element' => '', // Link of Article on the site 
     // 'get_element' => ''  // desired content 
    ) 
); 

$s = microtime(true); 

foreach($sitesToCheck as $site) 
{ 
    $html = file_get_html($site['url']); 

    foreach($html->find($site['search_element']) as $link) 
    { 
     $content = ''; 
     $savePath = 'cachedPages/'.md5($site['url']).'/'; 
     $fileName = md5($link->href); 

     if (! file_exists($savePath.$fileName)) 
     { 
      $post_for_scan = file_get_html($link->href); 

      foreach($post_for_scan->find($site["get_element"]) as $element) 
      { 
       $content .= $element->plaintext . PHP_EOL; 
      } 

      if (! file_exists($savePath) && ! mkdir($savePath, 0, true)) 
      { 
       die('Unable to create directory ...'); 
      } 

      file_put_contents($savePath.$fileName, $content); 
     } 
    } 
} 

$e = microtime(true); 

echo $e-$s; 

:

오늘은 내가 예를 들어 PHP Simple HTML DOM Parse

을 사용하기로 결정, 나는 다음과 같은 코드를 사용했다. 하지만 서버

의 응답이

"120 초 최대 실행 시간 초과"얻는다.

는 특정 주소에 대한 각 기사의 모든 기사와 사진을 모두 얻을 수있는 다른 방법이 말해 ... 내가 잘못 무엇을 나에게 설명해주십시오?

+1

그래서 많이 참조하십시오. :) 진지하게, 내가 그것을 점검했던 지난 번 (단지 몇 달 전에), simple_html_dom는 아직도 김을 내뿜고 있었다. DOMDocument + DOMXPath는 공간과 시간의 1/5을 사용했습니다. 말 그대로. 필자는 메모리 사용량을 줄이고 실행 시간을 80 % 줄였습니다. – cHao

+0

너무 많이 의존해서는 안되지만, 프로세스가 오랜 시간이 걸릴 것이라는 것을 미리 안다면'set_time_limit (0)'을 시도해보십시오. 그러나 모든 곳에서 사용하는 것은 좋지 않습니다. 그건 최대 실행 시간 (당신의 경우 120 초)을 초과하면 PHP가 프로세스를 죽이는 것을 막을 것이고, 끝날 때까지 실행될 것입니다. 문제는 ... 프로그램에서 실수로 프로그램을 실행하면 프로그램이 서버 동작 리소스에 앉아 수동 작업이 수행 될 때까지 계속됩니다. – ILikeTacos

+1

그냥 내가 열광적 인 히터처럼 들리지는 않는다. simple_html_dom이 좋을 수도있다. HTML이 너무 심하게 엉망이되어 더 이상 HTML처럼 보이지 않으면 DOMDocument가 제대로 처리하지 못할 수 있습니다. simple_html_dom *과 같은 lib는 엉뚱한 마크 업과 함께 작동하도록 설계 되었기 때문에 그러한 쓰레기로 더 잘할 수도 있습니다. 그러나 DOMDocument가 처리 할 수없는 끔찍한 찢어진 문서를 파싱해야하는 것은 드뭅니다. 적어도 나는 그것을 다루지 않아도된다. – cHao

답변

1

나는 lib와 비슷한 문제가있었습니다. 대신 PHP의있는 DOMDocument를 사용

$doc = new DOMDocument; 
$doc->loadHTML($html); 
$links = $doc->getElementsByTagName('a'); 
foreach ($links as $link) { 
    doSomethingWith($link->getAttribute('href'), $link->nodeValue); 
} 

어의 "간단한"부분 http://www.php.net/manual/en/domdocument.getelementsbytagname.php

+0

감사합니다. 이제는'div.post-content','table.wrapper td.content' 또는'div p a' 등과 같은 쿼리를 사용하여 항목을 얻는 방법을 이해해야합니다. – klay