Как мне реализовать скребок экрана в PHP? - PullRequest
0 голосов
/ 10 февраля 2009

У меня есть идентификатор пользователя и пароль для входа на веб-сайт через мою программу. После входа URL изменится с http://localhost/Test/loginpage.html на http://www.4wtech.com/csp/web/Employee/Login.csp.

Как я могу "очистить" данные второго URL-адреса с помощью PHP?

Ответы [ 5 ]

4 голосов
/ 10 февраля 2009

Вы бы использовали Curl. Curl может войти на страницу, затем получить доступ к новой указанной странице и загрузить всю страницу.

Ознакомьтесь с руководством по php для curl , а также с этим уроком: Как выполнять скрининг с помощью PHP и Curl .

3 голосов
/ 10 февраля 2009

Я не совсем уверен, понял ли я ваш вопрос. Но если вы действительно хотите использовать скриншот в PHP, я рекомендую парсер simple_html_dom Это небольшая библиотека, которая позволит вам использовать CSS-селекторы в PHP. Для меня скриншот экрана никогда не было проще в PHP. Вот пример:

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

// Find all links
foreach($html->find('a') as $element) {
       echo $element->href . '<br>';
}
0 голосов
/ 10 июля 2015

Внимание!

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


Предполагая, что вам разрешено очищать страницу, выполните следующие действия.

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 под капотом для анализа HTML-файлов для анализа строки 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 голосов
/ 11 февраля 2009

В модуле модульного тестирования SimpleTest есть компонент браузера Scriptable , который можно использовать самостоятельно. Я обычно использую это для скриншотов / ботов, потому что он имеет возможность эмулировать браузер.

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

Извиняюсь за плагин, но я написал JS_Extractor для очистки экрана. На самом деле это просто очень простое расширение DOM с некоторыми вспомогательными методами, которые немного упрощают работу, но оно работает очень хорошо.

...