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

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

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

Ответов (4)

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

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

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

HTTP-запрос

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

fopen

Самый простой способ отправить 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 . If делает более или менее то же самое, что и 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();

К сожалению, поддержка HTML5 в PHP ограничена. Если вы столкнетесь с ошибками при попытке проанализировать содержимое страницы, рассмотрите возможность использования сторонней библиотеки. Для этого я могу порекомендовать 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 на a 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>');

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