Here is two different, simple ways to get content from URL:
1) the first method
Enable Allow_url_include from your hosting (php.ini or somewhere)
<?php
$variableee = readfile("http://example.com/");
echo $variableee;
?>
or
2)the second method
Enable php_curl, php_imap and php_openssl
<?php
// you can add anoother curl options too
// see here - http://php.net/manual/en/function.curl-setopt.php
function get_dataa($url) {
$ch = curl_init();
$timeout = 5;
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
$variableee = get_dataa('http://example.com');
echo $variableee;
?>
Improve Article
Save Article
Like Article
Improve Article
Save Article
Like Article
Given a webpage, for which we need to find its source code using PHP. For this, we are going to use the PHP htmlspecialchars() function which converts any predefined characters to their subsequent HTML entities.
Example 1: Suppose we take a sample website that looks like the below image, let us see what output would the code produce for the same.
HTML code:
HTML
<!DOCTYPE html>
<
html
>
<
head
>
<
meta
charset
=
"utf-8"
>
<
title
>SAMPLE WEBSITE</
title
>
</
head
>
<
body
style
=
"color: green;"
>
<
h1
>This is a Sample website</
h1
>
<
p
>
In this article we will learn
how to extract a web page's
source code through PHP
</
p
>
</
body
>
</
html
>
Output:
Output as source code contents:
Now let us suppose the above website is hosted on a localhost, the code would fail to load the source code in such a case. The output produced would be something similar to this.
Output:
Warning: file(file:///D:/Html%20website/gfg%20sample%20website/index.html): Failed to open stream: No such file or directory in C:xampphtdocsprogramssource code.php on line 2
Warning: foreach() argument must be of type array|object, bool given in C:xampphtdocsprogramssource code.php on line 3
Example 2:
Approach:
- Store its elements into an array.
- Traverse the array using a PHP programming loop.
- Convert and print each character into its subsequent HTML entity.
PHP code: Below is the implementation of the above approach.
PHP
<?php
foreach
(
$source_code
as
$line_number
=>
$last_line
) {
echo
nl2br
(htmlspecialchars(
$last_line
) .
"n"
);
}
?>
Output:
Last Updated :
08 Feb, 2021
Like Article
Save Article
Время на прочтение
3 мин
Количество просмотров 144K
Добрый день, уважаемые хабровчане. В данном посте речь пойдет о совместном проекте S. C. Chen и John Schlick под названием PHP Simple HTML DOM Parser (ссылки на sourceforge).
Идея проекта — создать инструмент позволяющий работать с html кодом используя jQuery подобные селекторы. Оригинальная идея принадлежит Jose Solorzano’s и реализована для php четвертой версии. Данный же проект является более усовершенствованной версией базирующейся на php5+.
В обзоре будут представлены краткие выдержки из официального мануала, а также пример реализации парсера для twitter. Справедливости ради, следует указать, что похожий пост уже присутствует на habrahabr, но на мой взгляд, содержит слишком малое количество информации. Кого заинтересовала данная тема, добро пожаловать под кат.
Получение html кода страницы
$html = file_get_html('http://habrahabr.ru/'); //работает и с https://
Товарищ Fedcomp дал полезный комментарий насчет file_get_contents и 404 ответа. Оригинальный скрипт при запросе к 404 странице не возвращает ничего. Чтобы исправить ситуацию, я добавил проверку на get_headers. Доработанный скрипт можно взять тут.
Поиск элемента по имени тега
foreach($html->find('img') as $element) { //выборка всех тегов img на странице
echo $element->src . '<br>'; // построчный вывод содержания всех найденных атрибутов src
}
Модификация html элементов
$html = str_get_html('<div id="hello">Hello</div><div id="world">World</div>'); // читаем html код из строки (file_get_html() - из файла)
$html->find('div', 1)->class = 'bar'; // присвоить элементу div с порядковым номером 1 класс "bar"
$html->find('div[id=hello]', 0)->innertext = 'foo'; // записать в элемент div с id="hello" текст foo
echo $html; // выведет <div id="hello">foo</div><div id="world" class="bar">World</div>
Получение текстового содержания элемента (plaintext)
echo file_get_html('http://habrahabr.ru/')->plaintext;
Целью статьи не является предоставить исчерпывающую документацию по данному скрипту, подробное описание всех возможностей вы можете найти в официальном мануале, если у сообщества возникнет желание, я с удовольствием переведу весь мануал на русский язык, пока же приведу обещанный в начале статьи пример парсера для twitter.
Пример парсера сообщений из twitter
require_once 'simple_html_dom.php'; // библиотека для парсинга
$username = 'habrahabr'; // Имя в twitter
$maxpost = '5'; // к-во постов
$html = file_get_html('https://twitter.com/' . $username);
$i = '0';
foreach ($html->find('li.expanding-stream-item') as $article) { //выбираем все li сообщений
$item['text'] = $article->find('p.js-tweet-text', 0)->innertext; // парсим текст сообщения в html формате
$item['time'] = $article->find('small.time', 0)->innertext; // парсим время в html формате
$articles[] = $item; // пишем в массив
$i++;
if ($i == $maxpost) break; // прерывание цикла
}
Вывод сообщений
for ($j = 0; $j < $maxpost; $j++) {
echo '<div class="twitter_message">';
echo '<p class="twitter_text">' . $articles[$j]['text'] . '</p>';
echo '<p class="twitter_time">' . $articles[$j]['time'] . '</p>';
echo '</div>';
}
Благодарю за внимание. Надеюсь, получилось не очень тяжеловесно и легко для восприятия.
Похожие библиотеки
htmlSQL — спасибо Chesnovich
Zend_Dom_Query — спасибо majesty
phpQuery — спасибо theRavel
QueryPath — спасибо ZonD80
The DomCrawler(Symfony) — спасибо choor
CDom — спасибо автору samally
Небезызвестный XPath — спасибо за напоминание KAndy
P.S.
Хаброжитель Groove подсказал что подобные материалы уже были
P.P.S.
Постараюсь в свободное время собрать все библиотеки и составить сводные данные по производительности и приятности использования.
- Получение контента с помощью библиотеки SimpleHTMLDOM
- Получение контента с помощью cURL
- Продвинутый скрипт получения контента на PHP
Парсер контента на языке PHP – это важный инструмент для веб-разработчиков, которые работают с различными источниками данных. Он позволяет извлекать нужную информацию из HTML-страниц, XML-файлов и других форматов, а также обрабатывать ее в соответствии с заданными правилами.
Одним из основных преимуществ парсера контента является возможность автоматизировать процесс получения и обработки данных, что позволяет сократить время выполнения задач и уменьшить вероятность ошибок.
Для получения контента определённой страницы сайта есть простое решение с помощью собственной функции php — file_get_contents. Всё, что требуется это передать в функцию URL нужной страницы.
Получение контента с помощью библиотеки SimpleHTMLDOM
Для более качественной работы функции лучше воспользоваться подключаемой библиотекой SimpleHTMLDOM. В simplehtmldom есть методы для удаленной загрузки страниц. После подключения файла библиотеки, нам доступны 2 функции для обработки HTML строк:
str_get_html(str) и file_get_html(url)
Они делают одно и тоже, преобразуют HTML текст в DOM дерево, различаются лишь источники.
str_get_htm – на вход получает обычную строку, т.е. если вы получили HTML прибегнув к curl, или file_get_contents то вы просто передаете полученный текст этой функции.
$html = str_get_html('html код');
file_get_html – сама умеет загружать данные с удаленного URL или из локального файла
$html = file_get_html('http://www.yandex.ru/');
или
$html = file_get_html('data/test.htm');
К сожалению, file_get_html загружает страницы обычным file_get_contents. Это значит если хостер, выставил в php.ini allow_url_fopen = false (т.е. запретил удаленно открывать файлы), то загрузить что-то удаленно, не получится. Да и серьезные веб сайты таким способом парсить не стоит, лучше использовать CURL с поддержкой proxy и ssl.
$html = file_get_html('http://www.yandex.ru/');
в результате, в переменной $html будет объект типа simple_html_dom.
При больших объемах данных, в библиотеке происходит утечка памяти. Поэтому после окончания одного цикла надо ее чистить.
Делает это метод clear.
К примеру грузим 5 раз сайт www.yandex.ru с разными поисковыми запросами
PHP
include 'simple_html_dom.php'; $k = 5; while($k>0){ $html = file_get_html('http://yandex.ru/yandsearch?text=hi'.$k.'&lr=11114'); // загружаем данные // как-то их обрабатываем $html->clear(); // подчищаем за собой unset($html); $k--; }
Ниже приведен ещё один пример использования библиотеки Simple HTML DOM Parser для парсинга HTML-страницы и извлечения заголовков новостей:
PHP
// Подключаем библиотеку require_once('simple_html_dom.php'); // Получаем содержимое страницы $html = file_get_html('http://example.com/news.html'); // Ищем все заголовки новостей foreach($html->find('h2.news-title') as $title) { // Выводим текст заголовка echo $title->plaintext; }
В этом примере мы используем библиотеку Simple HTML DOM Parser, которая предоставляет простой и удобный API для работы с HTML-документами. Сначала мы получаем содержимое страницы с помощью функции file_get_html(), затем находим все элементы с тегом h2 и классом news-title с помощью метода find(). Наконец, мы выводим текст каждого заголовка с помощью свойства plaintext.
Получение контента с помощью cURL
Неоспоримыми преимуществами в функционале пользуется библиотека или можно сказать модуль PHP — cURL. Для полноценного контролируемого получения контента здесь есть множество разных доплнений. Это и практически полноценный эмулятор браузерного обращения к сайту, работа скрипта через proxy с приватной идентификацией и многое другое. Ниже показана функция получения контента с помощью cURL.
PHP
function curl($url, $postdata='', $cookie='', $proxy=''){ $uagent = "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.205 Safari/534.16"; $ch = curl_init( $url ); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // возвращает веб-страницу curl_setopt($ch, CURLOPT_HEADER, 0); // возвращает заголовки @curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // переходит по редиректам curl_setopt($ch, CURLOPT_ENCODING, ""); // обрабатывает все кодировки curl_setopt($ch, CURLOPT_USERAGENT, $uagent); // useragent curl_setopt($ch, CURLOPT_TIMEOUT, 10); // таймаут ответа //curl_setopt($ch, CURLOPT_MAXREDIRS, 10); // останавливаться после 10-ого редиректа if($proxy !=''){$mass_proxy= explode(':', $proxy, 4); curl_setopt($ch, CURLOPT_PROXY, $mass_proxy[0].':'.$mass_proxy[1]);} if($mass_proxy[2]!="" and $mass_proxy[3]!=""){ curl_setopt($ch, CURLOPT_PROXYUSERPWD,$mass_proxy[2].':'.$mass_proxy[3]);}// если необходимо предоставить имя пользователя и пароль 'user:pass' if(!empty($postdata)) { curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata); } if(!empty($cookie)) { //curl_setopt($ch, CURLOPT_COOKIEJAR, $_SERVER['DOCUMENT_ROOT'].'/2.txt'); //curl_setopt($ch, CURLOPT_COOKIEFILE,$_SERVER['DOCUMENT_ROOT'].'/2.txt'); } $content = curl_exec( $ch ); $err = curl_errno( $ch ); $errmsg = curl_error( $ch ); $header = curl_getinfo( $ch ); curl_close( $ch ); $header['errno'] = $err; $header['errmsg'] = $errmsg; $header['content'] = $content; return $header['content']; }
Продвинутый скрипт получения контента на PHP
Ещё один способ получения контента встроенными функциями php я нашёл на просторах интернета. Пока не использовал, но привожу здесь для полноты картины, так как это решение тоже заслуживает достойного внимания. Далее, как в ©Источнике:
Полезными качествами, в данном контексте, будут возможность получения множества атрибутов запрашиваемого контента, а также возможность получения заголовка ответа сервера и времени выполнения запроса. Данная функция использует встроенные в PHP функции для работы с сокетами, которые предназначены для соединения клиента с сервером.
PHP
<?php function abi_get_url_object($url, $user_agent=null) { define('ABI_URL_STATUS_UNSUPPORTED', 100); define('ABI_URL_STATUS_OK', 200); define('ABI_URL_STATUS_REDIRECT_301', 301); define('ABI_URL_STATUS_REDIRECT_302', 302); define('ABI_URL_STATUS_NOT_FOUND', 404); define('MAX_REDIRECTS_NUM', 4); $TIME_START = explode(' ', microtime()); $TRY_ID = 0; $URL_RESULT = false; do { //--- parse URL --- $URL_PARTS = @parse_url($url); if( !is_array($URL_PARTS)) { break; }; $URL_SCHEME = ( isset($URL_PARTS['scheme']))?$URL_PARTS['scheme']:'http'; $URL_HOST = ( isset($URL_PARTS['host']))?$URL_PARTS['host']:''; $URL_PATH = ( isset($URL_PARTS['path']))?$URL_PARTS['path']:'/'; $URL_PORT = ( isset($URL_PARTS['port']))?intval($URL_PARTS['port']):80; if( isset($URL_PARTS['query']) && $URL_PARTS['query']!='' ) { $URL_PATH .= '?'.$URL_PARTS['query']; }; $URL_PORT_REQUEST = ( $URL_PORT == 80 )?'':":$URL_PORT"; //--- build GET request --- $USER_AGENT = ( $user_agent == null )?'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)':strval($user_agent); $GET_REQUEST = "GET $URL_PATH HTTP/1.0 " ."Host: $URL_HOST$URL_PORT_REQUEST " ."Accept: text/plain " ."Accept-Encoding: identity " ."User-Agent: $USER_AGENT "; //--- open socket --- $SOCKET_TIME_OUT = 30; $SOCKET = @fsockopen($URL_HOST, $URL_PORT, $ERROR_NO, $ERROR_STR, $SOCKET_TIME_OUT); if( $SOCKET ) { if( fputs($SOCKET, $GET_REQUEST)) { socket_set_timeout($SOCKET, $SOCKET_TIME_OUT); //--- read header --- $header = ''; $SOCKET_STATUS = socket_get_status($SOCKET); while( !feof($SOCKET) && !$SOCKET_STATUS['timed_out'] ) { $temp = fgets($SOCKET, 128); if( trim($temp) == '' ) break; $header .= $temp; $SOCKET_STATUS = socket_get_status($SOCKET); }; //--- get server code --- if( preg_match('~HTTP/(d+.d+)s+(d+)s+(.*)s* ~si', $header, $res)) $SERVER_CODE = $res[2]; else break; if( $SERVER_CODE == ABI_URL_STATUS_OK ) { //--- read content --- $content = ''; $SOCKET_STATUS = socket_get_status($SOCKET); while( !feof($SOCKET) && !$SOCKET_STATUS['timed_out'] ) { $content .= fgets($SOCKET, 1024*8); $SOCKET_STATUS = socket_get_status($SOCKET); }; //--- time results --- $TIME_END = explode(' ', microtime()); $TIME_TOTAL = ($TIME_END[0]+$TIME_END[1])-($TIME_START[0]+$TIME_START[1]); //--- output --- $URL_RESULT['header'] = $header; $URL_RESULT['content'] = $content; $URL_RESULT['time'] = $TIME_TOTAL; $URL_RESULT['description'] = ''; $URL_RESULT['keywords'] = ''; //--- title --- $URL_RESULT['title'] =( preg_match('~<title>(.*)</title>~U', $content, $res))?strval($res[1]):''; //--- meta tags --- if( preg_match_all('~<metas+names*=s*["']?([^"']+)["']?s+contents*=["']?([^"']+)["']?[^>]+>~', $content, $res, PREG_SET_ORDER) > 0 ) { foreach($res as $meta) $URL_RESULT[strtolower($meta[1])] = $meta[2]; }; } elseif( $SERVER_CODE == ABI_URL_STATUS_REDIRECT_301 || $SERVER_CODE == ABI_URL_STATUS_REDIRECT_302 ) { if( preg_match('~location:s*(.*?) ~si', $header, $res)) { $REDIRECT_URL = rtrim($res[1]); $URL_PARTS = @parse_url($REDIRECT_URL); if( isset($URL_PARTS['scheme'])&& isset($URL_PARTS['host'])) $url = $REDIRECT_URL; else $url = $URL_SCHEME.'://'.$URL_HOST.'/'.ltrim($REDIRECT_URL, '/'); } else { break; }; }; };// GET request is OK fclose($SOCKET); }// socket open is OK else { break; }; $TRY_ID++; } while( $TRY_ID <= MAX_REDIRECTS_NUM && $URL_RESULT === false ); return $URL_RESULT; }; ?>
Итак, входящими параметрами являются: $url — строка, содержащая URL http-протокола, $user_agent — строка с любым юзер-агентом (если пропустить параметр или установить его в null — user_agent будет как в IE). Константа MAX_REDIRECTS_NUM устанавливает количество разрешенных редиректов (поддерживаются 301 и 302 редиректы).
Теперь перейдем к примерам практического использования этой функции:
PHP
<?php $url = 'http://www.yahoo.com'; $user_agent = 'MySuperBot 1.02'; $URL_OBJ = abi_get_url_object($url, $user_agent); if( $URL_OBJ ) { $CONTENT = $URL_OBJ['content']; $HEADER = $URL_OBJ['header']; $TITLE = $URL_OBJ['title']; $DESCRIPTION = $URL_OBJ['description']; $KEYWORDS = $URL_OBJ['keywords']; $TIME_REQUEST = $URL_OBJ['time']; } else print 'Запрашиваемая страница недоступна.'; ?>
Как видно из вышеприведенного примера, мы можем получить всю информацию по запрошенному URL. Кроме того, можно получить значения любого мета-тега. Для этого можно воспользоваться следующим кодом:
PHP
<?php preg_match ("/charset=(.*?)"/is", $CONTENT, $char); $charset=$char[1]; ?>
Заключение:
Парсер контента на языке PHP – это важный инструмент для получения и обработки данных из различных источников. Благодаря мощным библиотекам и инструментам, разработчики могут легко и удобно извлекать нужную информацию из HTML-страниц, XML-файлов и других форматов.
Дата публикации: 2019-04-26
ТОП 10 случайных публикаций
Я хочу получить HTML-код ссылки (веб-страницы) в PHP. Например, если ссылка
то я хочу, чтобы HTML-код страницы был подан. Я хочу получить этот код HTML и сохранить его в переменной PHP.
Если ваш PHP-сервер разрешает обертку url fopen, тогда самый простой способ:
$html = file_get_contents('http://stackoverflow.com/questions/ask');
Если вам нужно больше контроля, вы должны посмотреть на функции cURL :
$c = curl_init('http://stackoverflow.com/questions/ask'); curl_setopt($c, CURLOPT_RETURNTRANSFER, true); //curl_setopt(... other options you want...) $html = curl_exec($c); if (curl_error($c)) die(curl_error($c)); // Get the status code $status = curl_getinfo($c, CURLINFO_HTTP_CODE); curl_close($c);
Кроме того, если вы хотите каким-либо образом манипулировать извлеченной страницей, вам может понадобиться попробовать парсер php DOM. Я нахожу PHP Simple HTML DOM Parser очень простым в использовании.
Простой способ: используйте file_get_contents()
:
$page = file_get_contents('http://stackoverflow.com/questions/ask');
Обратите внимание, что allow_url_fopen
должен быть true
в php.ini
чтобы иметь возможность использовать обертки fopen с поддержкой URL.
Более продвинутый способ. Если вы не можете изменить свою конфигурацию PHP, allow_url_fopen
по умолчанию false
, и если ext / curl установлен, используйте библиотеку cURL
для подключения к желаемой странице.
вы можете использовать file_get_contents, если вы хотите сохранить источник как переменную, однако завиток лучше.
$url = file_get_contents('http://example.com'); echo $url;
это решение отобразит веб-страницу на вашем сайте. Однако завиток – лучший вариант.
Вот два разных простых способа получить контент из URL :
1) первый метод
Включите Allow_url_include с вашего хостинга (php.ini или где-нибудь)
<?php $variableee = readfile("http://example.com/"); echo $variableee; ?>
или
2) второй метод
Включить php_curl, php_imap и php_openssl
<?php // you can add anoother curl options too // see here - http://php.net/manual/en/function.curl-setopt.php function get_dataa($url) { $ch = curl_init(); $timeout = 5; curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,false); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false); curl_setopt($ch, CURLOPT_MAXREDIRS, 10); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); $data = curl_exec($ch); curl_close($ch); return $data; } $variableee = get_dataa('http://example.com'); echo $variableee; ?>