Я разрабатываю проект, для которого я хочу очистить содержимое веб-сайта в фоновом режиме и получить ограниченный контент с этого очищенного веб-сайта. Например, на моей странице у меня есть поля «userid» и «password», с помощью которых я получаю доступ к моей почте и очищаю содержимое входящих сообщений и отображаю ее на своей странице. Пожалуйста, помогите мне решить проблему, спасибо заранее.
Я сделал это, используя только javascript. Но когда я нажимаю кнопку входа, URL моей страницы ( http: //localhost/web/Login.html ) изменяется на URL ( http://mail.in.com/mails/inbox.php?nomail= ….), которые я очищаю. Но я обрываю детали, не меняя свой url. Пожалуйста, помогите мне найти решение проблемы, спасибо заранее.
Определенно пойдите с 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>';
Во-первых, вы делаете 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
. Если вы используете более или менее то же, что и 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 является то, что он опирается на популярную библиотеку 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 под капотом.
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'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>');
Вы можете использовать расширение cURL для PHP, чтобы выполнять HTTP-запросы на другой веб-сайт из вашего PHP-скрипта. См. Документацию здесь.
Конечно, недостатком здесь является то, что ваш сайт будет реагировать медленно, потому что вам придется очистить внешний веб-сайт, прежде чем вы сможете представить полную страницу / вывод своему пользователю.
Вы пробовали OutWit Hub? Это целая среда для съёмки. Вы можете позволить ему угадать структуру или разработать собственные скребки. Я действительно предлагаю вам взглянуть на него. Это сделало мою жизнь намного проще. ZR
Я использую PHP Simple HTML DOM parser и его хорошее. Я использовал это для своего плагина фаворитов stackoverflow.
PHP Простой парсер DOM имеет много ошибок и больше не обновляется. Я использую расширение PHP DOM для перезаписи PHP Simple DOM parser, и я поддерживаю его, вы можете проверить его здесь.
Вы также должны заглянуть в Apache Nutch, согласно их веб-сайту, это «Высоко расширяемый, масштабируемый веб-гусеничный»,