Задать вопрос

Как спарсить больше 90 страниц на Simple HTML DOM?

При установке значение на 30 или 60 , все парсит, но больше 90 страниц ставишь выдает ошибку
Fatal error: Call to a member function find() on boolean in E:\srv\OpenServer\domains\parser\index.php on line 51
<form method="POST">
    <input name="url" type="text" value="<?=isset($_REQUEST['url'])?$_REQUEST['url']:'http://citymarket.ua/';?>"/><input type="submit" value="Пошел">
</form>
<?php

include 'simple_html_dom.php';

function request($url,$post = 0){
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url ); // отправляем на 
    curl_setopt($ch, CURLOPT_HEADER, 0); // пустые заголовки
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // возвратить то что вернул сервер
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // следовать за редиректами
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);// таймаут4
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_COOKIEJAR, dirname(__FILE__).'/cookie.txt'); // сохранять куки в файл 
    curl_setopt($ch, CURLOPT_COOKIEFILE,  dirname(__FILE__).'/cookie.txt');
    curl_setopt($ch, CURLOPT_POST, $post!==0 ); // использовать данные в post
    if($post)
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
    $data = curl_exec($ch);
    curl_close($ch);
    return $data;
}

class parser{
    var $cacheurl = array();
    var $result = array();
    var $_allcount = 60;
    function __construct(){
        if(isset($_POST['url'])){
            $this->parse($_POST['url']);
        }
    }
    function parse($url){
        $url = $this->readUrl($url);

        if( !$url or $this->cacheurl[$url] or $this->cacheurl[preg_replace('#/$#','',$url)] )
            return false;

        $this->_allcount--;

        if( $this->_allcount<=0 )
            return false;

        $this->cacheurl[$url] = true;
        $item = array();

        $data = str_get_html(request($url));
        $item['url'] = $url;
        $item['title'] = count($data->find('title'))?$data->find('title')->plaintext:'';
        $item['text'] = count($data->find('img.item-image'))?$data->find('img.item-image')->src:'';
        $this->result[] = $item;

        if(count($data->find('a'))){
            foreach($data->find('a') as $a){
                $this->parse($a->href);
            }
        }
        $data->clear();
        unset($data);

    }
    function printresult(){
        foreach($this->result as $item){
            echo '<h2>'.$item['title'].' - <small>'.$item['url'].'</small></h2>';
            echo '<p style="margin:20px 0px;background:#eee; padding:20px;">'.'<img src="'.$item['text'].'"/>'.'</p>';
        };
        exit();
    }
    var $protocol = '';
    var $host = '';
    var $path = '';
    function readUrl($url){
        $urldata = parse_url($url);
        if( isset($urldata['host']) ){
            if($this->host and $this->host!=$urldata['host'])
                return false;

            $this->protocol = $urldata['scheme'];
            $this->host = $urldata['host'];
            $this->path = $urldata['path'];
            return $url;
        }

        if( preg_match('#^/#',$url) ){
            $this->path = $urldata['path'];
            return $this->protocol.'://'.$this->host.$url;
        }else{
            if(preg_match('#/$#',$this->path))
                return $this->protocol.'://'.$this->host.$this->path.$url;
            else{
                if( strrpos($this->path,'/')!==false ){
                    return $this->protocol.'://'.$this->host.substr($this->path,0,strrpos($this->path,'/')+1).$url;
                }else
                    return $this->protocol.'://'.$this->host.'/'.$url;
            }
        }
    }
}
$pr = new Parser();
$pr->printresult();
  • Вопрос задан
  • 1867 просмотров
Подписаться 3 Оценить 1 комментарий
Решения вопроса 3
e_svirsky
@e_svirsky
Web Developer
Есть отличная либа для парсинга страниц. Просто и удобно.
php.net/manual/en/httprequest.send.php
Это для запросов.
Для парсинга страниц можно использовать phpQuery.
Или использовать Crawler от Symfony2: symfony.com/doc/current/components/dom_crawler.html
Ответ написан
Комментировать
Есть у simple HTML DOM такая болезнь, надо все вхождения find оборачивать в
if (method_exists($html, "find")){
    if($html->find('нужный нам селектор')){
        код парсинга
    }
}


Я из-за таких вот косяков и перешёл на phpQuery
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Я до сих пор поражаюсь народом,
$data->clear(); // чистим - молодцы
 unset($data);


а где возврат?
return $item;

12 знаков в данном примере дают понять кто и по какой причине переходит куда то.

Ведь дело на самом деле в кривых руках или прокисшем сером веществе. Вообще - то нужно курить мануалы для начала, чем показывать свою безграмотность в вопросе и тем более давать какие либо советы.

Простите за флуд, но вопрос очень распространенный и не решенный по сути. Этот пример использования библиотеки мне неоднократно попадался и в первоисточнике этого примера также присутствует эта ошибка.
Ответ написан
Комментировать
@CORRECTOR86
У меня была схожая проблема, но с 1 страницей. Вопрос решился увеличением значения константы "define('MAX_FILE_SIZE', 600000)" в файле "simple_html_dom.php". Например: 60000000. Мне это помогло. В моем случае размер файла был больше указанного ограничения и его загрузка прерывалась на 600000. Удачи. Эксперементируйте.

Решение нашел здесь:
https://www.canbike.org/information-technology/php...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы