Очистить содержимое веб-страницы

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

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

Ответ 1

Определенно перейти с 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>';

Ответ 2

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;

потоки

Кроме того, вы также можете использовать потоки. Потоки похожи на сокеты и могут использоваться в сочетании с 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();

К сожалению, поддержка PHP для 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 footer
$sitefooter = $body->select('.site-footer > .site-center');

// Set some attributes for the site 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 footer
$sitefooterparent = $sitefooter->parent();

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

// Wrap the site footer within two nex selectors
$sitefooter->wrap('<section><div class="footer-wrapper"></div></section>');

Ответ 3

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

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

Ответ 4

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