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

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

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

PHP-Architect охватил его в хорошо написанной статье в выпуске за декабрь 2007 года Мэтью Турланд

Скребок обычно включает в себя 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 ");

// теперь, ваше регулярное выражение работает против $ 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); } } ?>
<?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/'); 

Метод 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()); 

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

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

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

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

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

Похоже, вы можете пытаться «hotlink», а не царапать, т. Е. Обновлять в реальном времени на основе содержимого своего сайта?

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

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

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

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

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

Скребок может быть довольно сложным, в зависимости от того, что вы хотите сделать. Прочитайте эту серию руководств по основам написания скребка на 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 веб-скребок ebook здесь:

https://leanpub.com/web-scraping

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