2014-01-31 3 views
0

У меня есть скрипт, который содержит список URL-адресов, и я получаю информацию из этих URL, как имя, город, ДЕПАРТАМЕНТ и т.д.PHP - Очистка веб-страниц - Как кэшировать с помощью cURL?

Вот некоторые из моих функций:

function getCity($url) 
    { 
    $url = curl_get_contents($url); 
    $html_object = str_get_html($url); 
    return $ret = $html_object->find('td', 86)->plaintext; 
    } 

function getDepartment($url) 
    { 
    $url = curl_get_contents($url); 
    $html_object = str_get_html($url); 
    return $ret = $html_object->find('td', 90)->plaintext; 
    } 

function getSalary($url) 
    { 
    $url = curl_get_contents($url); 
    $html_object = str_get_html($url); 
    $ret = $html_object->find('td', 94)->plaintext; 
    return trim($ret); 
    } 

и это мой Curl код:

function curl_get_contents($url) 
{ 
    $curl_moteur = curl_init(); 
    curl_setopt($curl_moteur, CURLOPT_URL, $url); 
    curl_setopt($curl_moteur, CURLOPT_RETURNTRANSFER, 1); 

    curl_setopt($curl_moteur,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13'); 

    curl_setopt($curl_moteur, CURLOPT_FOLLOWLOCATION, 1); 
    $web = curl_exec($curl_moteur); 
    curl_close($curl_moteur); 
    return $web; 
} 

Как вы можете видеть, что я делаю запрос для каждого поля, что очень неэффективно. Я хотел бы реализовать кеш, чтобы извлекать все информационные поля, запрашивающие каждый URL-адрес, всего один раз.

Заранее благодарен.

+0

просто сохранить $ веб возвращение в файл и открыть его в нужное время. – Kei

ответ

0

Вы можете создать класс из ваших функций следующим образом:

class Scrapper 
{ 
    public $page_content; 

    public $html_object; 

    public function __construct($url) 
    { 
     $this->page_content = $this->curl_get_contents($url); //in case you want to keep for something scrapped url content 
     $this->html_object = $this->str_get_html($this->page_content); //create object from html, probably simpleXML 
    } 

    public function getCity() 
    { 
     return $this->html_object->find('td', 86)->plaintext; 
    } 

    public function getDepartment() 
    { 
     return $this->html_object->find('td', 90)->plaintext; 
    } 

    public function getSalary() 
    { 

     $ret = $this->html_object->find('td', 94)->plaintext; 
     return trim($ret); 
    } 

    public function curl_get_contents($url) 
    { 
     $curl_moteur = curl_init(); 
     curl_setopt($curl_moteur, CURLOPT_URL, $url); 
     curl_setopt($curl_moteur, CURLOPT_RETURNTRANSFER, 1); 

     curl_setopt($curl_moteur,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13'); 

     curl_setopt($curl_moteur, CURLOPT_FOLLOWLOCATION, 1); 
     $web = curl_exec($curl_moteur); 
     curl_close($curl_moteur); 
     return $web; 
    } 

    public function str_get_html() 
    { 
     //unkown function content 
     $this->html_object = $some_object; // $some_object = str_get_html($url) from your code; 
    } 
} 

$scrapper = new Scrapper($your_url); 

echo $scrapper->getCity(); 
echo $scrapper->getDepartment(); 

Обратите внимание, что код не тестировался.

Таким образом, вы запрашиваете URL-адрес один раз при создании экземпляра класса.

или если вы не хотите использовать объекты легко исправить будет использовать static переменную:

function curl_get_contents($url) 
{ 
    static $web = null; 
    if (!is_null($web)) { 
    return $web; 
    } 

    $curl_moteur = curl_init(); 
    curl_setopt($curl_moteur, CURLOPT_URL, $url); 
    curl_setopt($curl_moteur, CURLOPT_RETURNTRANSFER, 1); 

    curl_setopt($curl_moteur,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13'); 

    curl_setopt($curl_moteur, CURLOPT_FOLLOWLOCATION, 1); 
    $web = curl_exec($curl_moteur); 
    curl_close($curl_moteur); 
    return $web; 
} 
Смежные вопросы