Парсинг web-страниц на php

В этом нелегком деле нам поможет PHP Simple HTML DOM Parser.

Самая последняя версия доступна на sourceforge.net.

На сегодняшний день последней является версия 1.5. Её и будем скачивать:

wget -O simplehtmldom_1_5.zip http://downloads.sourceforge.net/project/simplehtmldom/simplehtmldom/1.5/simplehtmldom_1_5.zip?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fsimplehtmldom%2Ffiles%2Fsimplehtmldom%2F1.5%2F\&ts=1433252429\&use_mirror=softlayer-ams

Скачали, распаковываем в папку, которая доступна по вэбу, допустим /var/www/html/webparser:

mkdir /var/www/html/webparser  
mv simplehtmldom_1_5.zip /var/www/html/webparser/  
cd /var/www/html/webparser  
unzip simplehtmldom_1_5.zip

Исходя из примера на странице парсера при вызове файла со следующим содержанием будут выведены все объекты img на главной странице mysite.com

<?php
include('simple_html_dom.php');
$html = file_get_html('http://www.mysite.com/');

foreach($html->find('img') as $element)
  echo $element->src . '<br>';
?>

При вызове файла со следующим содержанием будут выведены все сслыки с главной страницы сайта mysite.com

<?php
include('simple_html_dom.php');

$html = file_get_html('http://www.mysite.com/');

foreach($html->find('a') as $element)
   echo $element->href . '<br>';
?>

Даже не пробуйте делать var_dump($element), поскольку это приведет в зависанию вашего компьютера и/или сервера, на котором Вы развернули парсер.

Вооружившись тестовыми данными я решил попарсить песочницу хабра. Следующий код выведет первые десять постов:

<?php
include('simple_html_dom.php');

$html = file_get_html('http://habrahabr.ru/sandbox/');

$cnt = 10;
foreach($html->find('.post') as $post) {
  foreach($post->find('h1') as $header) {
    echo str_replace('a href="','a href="http://habrahabr.ru',$header->find('a')[0]) . '<br>';
    $cnt--;
  }
  if ($cnt <= 0){
    break;
  }
}
?>

Обработка ссылок с тэгом h2 на примере tecmint.com:

<?php
include('simple_html_dom.php');

$html = file_get_html('http://www.tecmint.com/');

foreach($html->find('h2') as $post)
  echo $post->find('a')[0] . '<br>';
?>

Categories:

Updated: