Очистить содержимое веб-страницы - PullRequest
14 голосов
/ 25 февраля 2009

Я занимаюсь разработкой проекта, для которого я хочу очистить содержимое веб-сайта в фоновом режиме и получить ограниченный контент с этого очищенного веб-сайта. Например, на моей странице есть поля «ИД пользователя» и «Пароль», с помощью которых я буду получать доступ к своей почте, очищать содержимое папки «Входящие» и отображать ее на своей странице.

Я сделал выше, используя только javascript. Но когда я нажимаю кнопку входа, URL-адрес моей страницы (http://localhost/web/Login.html) меняется на URL-адрес (http://mail.in.com/mails/inbox.php?nomail=....), который я выбрал). Но я удаляю детали, не меняя URL.

Ответы [ 4 ]

34 голосов
/ 27 февраля 2009

Обязательно используйте PHP Simple HTML DOM Parser . Это быстро, легко и супер гибко. Он в основном вставляет целую HTML-страницу в объект, после чего вы можете получить доступ к любому элементу из этого объекта.

Как и на примере официального сайта, чтобы получить все ссылки на главной странице Google:

// Create DOM from URL or file
$html = file_get_html('http://www.google.com/');

// Find all images 
foreach($html->find('img') as $element) 
       echo $element->src . '<br>';

// Find all links 
foreach($html->find('a') as $element) 
       echo $element->href . '<br>';
17 голосов
/ 25 февраля 2016

HTTP-запрос

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

Еореп

Самый простой способ отправить HTTP-запрос - использовать fopen. Основным преимуществом является то, что вы можете установить, сколько символов читается за раз, что может быть полезно при чтении очень больших файлов. Однако сделать это не так просто, и делать это не рекомендуется, если вы не читаете очень большие файлы и не боитесь проблем с памятью.

$fp = fopen("http://www.4wtech.com/csp/web/Employee/Login.csp", "rb");
if (FALSE === $fp) {
    exit("Failed to open stream to URL");
}

$result = '';

while (!feof($fp)) {
    $result .= fread($fp, 8192);
}
fclose($fp);
echo $result;

file_get_contents

Самый простой способ - просто использовать file_get_contents. Если делает более или менее то же самое, что fopen, но у вас есть меньше вариантов, которые вы можете выбрать. Основным преимуществом здесь является то, что он требует только одну строку кода.

$result = file_get_contents('http://www.4wtech.com/csp/web/Employee/Login.csp');
echo $result;

розетки

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

$fp = fsockopen("www.4wtech.com/csp/web/Employee/Login.csp", 80, $errno, $errstr, 30);
if (!$fp) {
    $result = "$errstr ($errno)<br />\n";
} else {
    $result = '';
    $out = "GET / HTTP/1.1\r\n";
    $out .= "Host: www.4wtech.com/csp/web/Employee/Login.csp\r\n";
    $out .= "Connection: Close\r\n\r\n";
    fwrite($fp, $out);
    while (!feof($fp)) {
        $result .= fgets($fp, 128);
    }
    fclose($fp);
}
echo $result;
* * 1 022 потоков * * 1 023

Кроме того, вы также можете использовать потоки. Потоки похожи на сокеты и могут использоваться в комбинации с fopen и file_get_contents.

$opts = array(
  'http'=>array(
    'method'=>"GET",
    'header'=>"Accept-language: en\r\n" .
              "Cookie: foo=bar\r\n"
  )
);

$context = stream_context_create($opts);

$result = file_get_contents('http://www.4wtech.com/csp/web/Employee/Login.csp', false, $context);
echo result;

Curl

Если ваш сервер поддерживает cURL (обычно это так), рекомендуется использовать cURL. Ключевое преимущество использования cURL заключается в том, что он опирается на популярную библиотеку C, обычно используемую в других языках программирования. Он также предоставляет удобный способ создания заголовков запросов и автоматического анализа заголовков ответов с простым интерфейсом в случае ошибок.

$defaults = array( 
    CURLOPT_URL, "http://www.4wtech.com/csp/web/Employee/Login.csp"
    CURLOPT_HEADER=> 0
);

$ch = curl_init(); 
curl_setopt_array($ch, ($options + $defaults)); 
if( ! $result = curl_exec($ch)) { 
    trigger_error(curl_error($ch)); 
} 
curl_close($ch); 
echo $result; 

Библиотека

Кроме того, вы можете использовать одну из многих библиотек PHP . Я бы не рекомендовал использовать библиотеку, так как это может быть излишним. В большинстве случаев вам лучше написать свой собственный класс HTTP с использованием cURL.


Разбор HTML

PHP имеет удобный способ загрузки любого HTML в DOMDocument.

$pagecontent = file_get_contents('http://www.4wtech.com/csp/web/Employee/Login.csp');
$doc = new DOMDocument();
$doc->loadHTML($pagecontent);
echo $doc->saveHTML();

К сожалению, поддержка PHP5 для HTML5 ограничена. Если вы столкнулись с ошибками при попытке проанализировать содержимое вашей страницы, подумайте об использовании сторонней библиотеки. Для этого я могу порекомендовать Masterminds / html5-php . Разбор HTML-файла с этой библиотекой очень похож на разбор HTML-файла с DOMDocument.

use Masterminds\HTML5;

$pagecontent = file_get_contents('http://www.4wtech.com/csp/web/Employee/Login.csp');
$html5 = new HTML5();
$dom = $html5->loadHTML($html);
echo $html5->saveHTML($dom);

В качестве альтернативы вы можете использовать, например. моя библиотека PHPPowertools / DOM-Query . Он использует настроенную версию Masterminds / html5-php под капотом, анализирующую строку HTML5 в DomDocument и symfony / DomCrawler для преобразования селекторов CSS в селекторы XPath. Он всегда использует один и тот же DomDocument, даже при передаче одного объекта другому, для обеспечения достойной производительности.

namespace PowerTools;

// Get file content
$pagecontent = file_get_contents( 'http://www.4wtech.com/csp/web/Employee/Login.csp' );

// Define your DOMCrawler based on file string
$H = new DOM_Query( $pagecontent );

// Define your DOMCrawler based on an existing DOM_Query instance
$H = new DOM_Query( $H->select('body') );

// Passing a string (CSS selector)
$s = $H->select( 'div.foo' );

// Passing an element object (DOM Element)
$s = $H->select( $documentBody );

// Passing a DOM Query object
$s = $H->select( $H->select('p + p') );

// Select the body tag
$body = $H->select('body');

// Combine different classes as one selector to get all site blocks
$siteblocks = $body->select('.site-header, .masthead, .site-body, .site-footer');

// Nest your methods just like you would with jQuery
$siteblocks->select('button')->add('span')->addClass('icon icon-printer');

// Use a lambda function to set the text of all site blocks
$siteblocks->text(function( $i, $val) {
    return $i . " - " . $val->attr('class');
});

// Append the following HTML to all site blocks
$siteblocks->append('<div class="site-center"></div>');

// Use a descendant selector to select the site's footer
$sitefooter = $body->select('.site-footer > .site-center');

// Set some attributes for the site's footer
$sitefooter->attr(array('id' => 'aweeesome', 'data-val' => 'see'));

// Use a lambda function to set the attributes of all site blocks
$siteblocks->attr('data-val', function( $i, $val) {
    return $i . " - " . $val->attr('class') . " - photo by Kelly Clark";
});

// Select the parent of the site's footer
$sitefooterparent = $sitefooter->parent();

// Remove the class of all i-tags within the site's footer's parent
$sitefooterparent->select('i')->removeAttr('class');

// Wrap the site's footer within two nex selectors
$sitefooter->wrap('<section><div class="footer-wrapper"></div></section>');
0 голосов
/ 06 марта 2011

Вы пробовали OutWit Hub? Это целая очищающая среда. Вы можете позволить ему попытаться угадать структуру или разработать свои собственные скребки. Я действительно предлагаю вам взглянуть на это. Это сделало мою жизнь намного проще. ZR

0 голосов
/ 25 февраля 2009

Вы можете использовать расширение PHP cURL для выполнения HTTP-запросов к другому веб-сайту из скрипта PHP-страницы. См. документацию здесь.

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

...