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


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

15 59

15 ответов:

есть книга "Вебботы, пауки и скребки экрана: руководство по разработке интернет-агентов с PHP / CURL" по этой теме-смотрите обзор здесь

PHP-архитектор покрыл его в хорошо написанной статье в Выпуск За Декабрь 2007 Года Мэтью Turland

выскабливание обычно включает в себя 3 шага:

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

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

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

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

?>

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

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

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

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

use Goutte\Client;

$client = new Client();

сделать запросы с request() способ:

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

The request метод возвращает a 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());

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

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

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

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

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

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

этот учебник довольно хорош:

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

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

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

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

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

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

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

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

класс скребка из моего фреймворка:

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

}
?>

хороший PHP Web scraping ebook здесь:

https://leanpub.com/web-scraping

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