Как реализовать веб-скребок в PHP? [закрытый]

В дополнение к относительной стоимости исключений в Python и Java, имейте в виду, что есть разница в философии / отношении между ними. Java пытается быть очень строгим в отношении типов (и всего остального), требующих явных подробных объявлений сигнатур класса / метода. Предполагается, что в любой момент вы должны знать, какой тип объекта вы используете и что он способен делать. Напротив, «утиная печать» Python означает, что вы не знаете наверняка (и не должны заботиться) о том, что такое тип манифеста, вам нужно только заботиться о том, чтобы он обманывал вас, когда вы его просите. В такой разрешающей среде единственное разумное отношение - предполагать, что все будет работать, но будьте готовы справиться с последствиями, если они этого не сделают. Естественная ограниченность Java не подходит для такого случайного подхода. (Это не предназначено для унижения ни подхода, ни языка, а скорее сказать, что эти отношения являются частью идиомы каждого языка, а копирование идиом между разными языками может часто приводить к неловкости и плохой коммуникации ...)

61
задан Mark Biek 28 August 2008 в 20:11
поделиться

7 ответов

Очистка обычно охватывает 3 шага:

  • первый Вы ДОБИРАЕТЕСЬ или POST Ваш запрос к указанному URL
  • затем, Вы получаете HTML, который возвращается как ответ
  • наконец, Вы анализируете из того HTML текст, который требуется очистить.

Для выполнения шагов 1 и 2, ниже простой php класс, который использует Завихрение, чтобы выбрать веб-страницы с помощью или ДОБРАТЬСЯ или POST. После возвращения HTML Вы просто используете Регулярные выражения для выполнения шага 3 путем парсинга текста, который требуется очистить.

Для регулярных выражений, мой любимый учебный сайт следующий: Учебное руководство

по Регулярным выражениям Моя Любимая программа для работы с RegExs Regex Buddy . Я советовал бы Вам пробовать демонстрацию того продукта, даже если у Вас нет намерения купить его. Это - неоценимый инструмент и даже генерирует код для Вашего regexs, который Вы делаете на своем предпочтительном языке (включая php).

Использование:



$curl = new Curl(); $html = $curl->get("http://www.google.com");

// now, do your regex work against $html

Класс PHP:



<?php

class Curl
{       

    public $cookieJar = "";

    public function __construct($cookieJarFile = 'cookies.txt') {
        $this->cookieJar = $cookieJarFile;
    }

    function setup()
    {


        $header = array();
        $header[0] = "Accept: text/xml,application/xml,application/xhtml+xml,";
        $header[0] .= "text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
        $header[] =  "Cache-Control: max-age=0";
        $header[] =  "Connection: keep-alive";
        $header[] = "Keep-Alive: 300";
        $header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
        $header[] = "Accept-Language: en-us,en;q=0.5";
        $header[] = "Pragma: "; // browsers keep this blank.


        curl_setopt($this->curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7');
        curl_setopt($this->curl, CURLOPT_HTTPHEADER, $header);
        curl_setopt($this->curl,CURLOPT_COOKIEJAR, $this->cookieJar); 
        curl_setopt($this->curl,CURLOPT_COOKIEFILE, $this->cookieJar);
        curl_setopt($this->curl,CURLOPT_AUTOREFERER, true);
        curl_setopt($this->curl,CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($this->curl,CURLOPT_RETURNTRANSFER, true);  
    }


    function get($url)
    { 
        $this->curl = curl_init($url);
        $this->setup();

        return $this->request();
    }

    function getAll($reg,$str)
    {
        preg_match_all($reg,$str,$matches);
        return $matches[1];
    }

    function postForm($url, $fields, $referer='')
    {
        $this->curl = curl_init($url);
        $this->setup();
        curl_setopt($this->curl, CURLOPT_URL, $url);
        curl_setopt($this->curl, CURLOPT_POST, 1);
        curl_setopt($this->curl, CURLOPT_REFERER, $referer);
        curl_setopt($this->curl, CURLOPT_POSTFIELDS, $fields);
        return $this->request();
    }

    function getInfo($info)
    {
        $info = ($info == 'lasturl') ? curl_getinfo($this->curl, CURLINFO_EFFECTIVE_URL) : curl_getinfo($this->curl, $info);
        return $info;
    }

    function request()
    {
        return curl_exec($this->curl);
    }
}

?>

50
ответ дан Zevi Sternlicht 7 November 2019 в 13:49
поделиться

Если Вам нужно что-то, что легко поддержать, вместо того, чтобы быстро выполниться, это могло помочь использовать scriptable браузер, такой как SimpleTest .

2
ответ дан troelskn 7 November 2019 в 13:49
поделиться

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

-2
ответ дан Peter Stuifzand 7 November 2019 в 13:49
поделиться

file_get_contents() может взять удаленный URL и дать Вам источник. Можно тогда использовать регулярные выражения (с совместимыми с Perl функциями) для захвата то, в чем Вы нуждаетесь.

Из любопытства, что Вы пытаетесь очистить?

0
ответ дан Brian Warshaw 7 November 2019 в 13:49
поделиться

Я или использовал бы libcurl или LWP Perl (libwww для жемчуга). Существует ли libwww для php?

0
ответ дан dlamblin 7 November 2019 в 13:49
поделиться

Scraper class from my framework:

<?php

/*
    Example:

    $site = $this->load->cls('scraper', 'http://www.anysite.com');
    $excss = $site->getExternalCSS();
    $incss = $site->getInternalCSS();
    $ids = $site->getIds();
    $classes = $site->getClasses();
    $spans = $site->getSpans(); 

    print '<pre>';
    print_r($excss);
    print_r($incss);
    print_r($ids);
    print_r($classes);
    print_r($spans);        

*/

class scraper
{
    private $url = '';

    public function __construct($url)
    {
        $this->url = file_get_contents("$url");
    }

    public function getInternalCSS()
    {
        $tmp = preg_match_all('/(style=")(.*?)(")/is', $this->url, $patterns);
        $result = array();
        array_push($result, $patterns[2]);
        array_push($result, count($patterns[2]));
        return $result;
    }

    public function getExternalCSS()
    {
        $tmp = preg_match_all('/(href=")(\w.*\.css)"/i', $this->url, $patterns);
        $result = array();
        array_push($result, $patterns[2]);
        array_push($result, count($patterns[2]));
        return $result;
    }

    public function getIds()
    {
        $tmp = preg_match_all('/(id="(\w*)")/is', $this->url, $patterns);
        $result = array();
        array_push($result, $patterns[2]);
        array_push($result, count($patterns[2]));
        return $result;
    }

    public function getClasses()
    {
        $tmp = preg_match_all('/(class="(\w*)")/is', $this->url, $patterns);
        $result = array();
        array_push($result, $patterns[2]);
        array_push($result, count($patterns[2]));
        return $result;
    }

    public function getSpans(){
        $tmp = preg_match_all('/(<span>)(.*)(<\/span>)/', $this->url, $patterns);
        $result = array();
        array_push($result, $patterns[2]);
        array_push($result, count($patterns[2]));
        return $result;
    }

}
?>
0
ответ дан 24 November 2019 в 17:22
поделиться

вот еще один: простой PHP Scraper без Regex .

1
ответ дан 24 November 2019 в 17:22
поделиться
Другие вопросы по тегам:

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