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

Какие встроенные функции PHP полезны для веб-скрепок? Каковы некоторые хорошие ресурсы (веб-или печать) для ускорения работы веб-скрепок с PHP?

Ответ 2

Скребок обычно охватывает 3 этапа:

  • сначала вы получите или отправьте запрос к указанному URL
  • далее вы получаете   html, который возвращается как   ответ
  • наконец, вы разобрались   что html текст, который вы хотите   скоблить.

Для выполнения шагов 1 и 2 ниже приведен простой класс php, который использует Curl для извлечения веб-страниц с использованием GET или POST. После того, как вы вернете HTML, вы просто используете регулярные выражения для выполнения шага 3, разыгрывая текст, который вы хотите очистить.

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

Моя любимая программа для работы с RegExs - Regex Buddy. Я бы посоветовал вам попробовать демонстрацию этого продукта, даже если у вас нет намерения его покупать. Это бесценный инструмент и даже генерирует код для ваших регулярных выражений, которые вы делаете на выбранном вами языке (включая 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);
    }
}

?>

Ответ 3

Я хотел бы рекомендовать этот класс, с которым я недавно столкнулся. Простой HTML DOM Parser

Ответ 4

Я рекомендую Goutte, простой веб-скребок PHP.

Пример использования: -

Создайте экземпляр клиента Goutte (который расширяет Symfony\Component\BrowserKit\Client):

use Goutte\Client;

$client = new Client();

Выполнять запросы с помощью метода request():

$crawler = $client->request('GET', 'http://www.symfony-project.org/');

Метод request возвращает объект Crawler (Symfony\Component\DomCrawler\Crawler).

Нажмите на ссылки:

$link = $crawler->selectLink('Plugins')->link();
$crawler = $client->click($link);

Отправить формы:

$form = $crawler->selectButton('sign in')->form();
$crawler = $client->submit($form, array('signin[username]' => 'fabien', 'signin[password]' => 'xxxxxx'));

Извлечение данных:

$nodes = $crawler->filter('.error_list');

if ($nodes->count())
{
  die(sprintf("Authentification error: %s\n", $nodes->text()));
}

printf("Nb tasks: %d\n", $crawler->filter('#nb_tasks')->text());

Ответ 5

ScraperWiki - довольно интересный проект. Помогает вам создавать скребки в Интернете на Python, Ruby или PHP - я смог получить простую попытку за несколько минут.

Ответ 6

Здесь учебник OK (ссылка удалена, см. ниже) на веб-скребке с помощью cURL и file_get_contents. Представьте также следующие несколько частей.

(прямая гиперссылка удалена из-за предупреждений о вредоносном ПО)

http://www.oooff.com/php-scripts/basic-php-scraped-data-parsing/basic-php-data-parsing.php

Ответ 7

Я действительно ищу, чтобы очистить BibleGateway.com, поскольку они не предоставляют API для доступа к стихам для веб-приложения, которое я ищу для создания.

Похоже, вы можете пытаться "hotlink", а не царапать, т.е. обновлять в реальном времени на основе контента своего сайта?

Этот урок неплохой:

http://www.merchantos.com/makebeta/php/scraping-links-with-php/

Вы также можете посмотреть Prowser.

Ответ 8

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

Ответ 10

Скребок может быть довольно сложным, в зависимости от того, что вы хотите сделать. Прочитайте эту серию учебников по Основы написания скребка в PHP и посмотрите, можете ли вы справиться с ней.

Вы можете использовать аналогичные методы для автоматизации регистрации форм, входа в систему, даже поддельного нажатия на объявления! Основные ограничения использования CURL - это то, что он не поддерживает использование javascript, поэтому, если вы пытаетесь очистить сайт, который использует AJAX для разбивки на страницы, например, он может стать немного сложным... но опять же есть способы обойти это!

Ответ 11

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

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

Ответ 12

Я бы использовал libcurl или Perl LWP (libwww для perl). Есть ли libwww для php?

Ответ 13

Скребок класса из моей рамки:

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

}
?>

Ответ 15

Библиотека curl позволяет загружать веб-страницы. Вы должны искать регулярные выражения для выполнения скребков.