|
Копирование блоков страницы(или целиком)
У меня возникла задача копирования всей страницы, или отдельных блоков ее.
Т.е. мне нужно сохранить(через скрипт страницу) и отправить ее на файл php для обработки ( по идее в переменную ее занести не получится). А скрипт в свою очередь, сохранит ее в файл... Т.е. получится, как бы копирование страницы и сохранение в определенной папке. У меня есть встраиваемый скрипт, который берет со страницы ее юрл и титл. (на JS написаны). А вот как быть со страницей не знаю. Как это можно реализовать? Может, конечно, неправильно выбрал тему. Но я если честно, даже не знаю с чего начать. |
Странно, что это требуется именно на клиенте брать вывод. 0_о
Не очень тривиальная задача. На ум приходит только брать "document.body.innerHTML", а из шапки брать и генерировать на основе свойств document... Потом ajax'ом отправлять это всё через POST на php скрипт... |
Не обязательно на клиенте. Мой php скрипт хранит юрл данной страницы. Если можно подобное реализовать, используя PHP, то так даже лучше. Но, насколько я знаю, то страницы защищены от инклуда(если не с данного сайта он происходит).
|
Нет, с этим нету проблем, если на сервере разрешено сокетное подключение.
На всех платных хостингах оно разрешено. Делается это примерно так: $fp = fsockopen("www.site.ru", 80, $errno, $errstr, 30); if ($fp) { // Генерируем шапку запроса к странице: $out = "GET /path_to_page.php HTTP/1.1\r\n" ."Host: www.site.ru\r\n" ."Connection: Close\r\n" ."\r\n"; // Посылаем запрос на сайт: fwrite($fp, $out); // Получаем ответ: while (!feof($fp)) { $result = fgets($fp, 128); } fclose($fp); // Результатом будет ответ сервера: шапка http + тело ответа, // оно будет разделено двумя переносами "\r\n" так что нужно // будет найти первое вхождение "\r\n\r\n" и отрезать шапку от тела. echo $result; } Подробнее об этом можно почитать тут. Кроме того, тебе понадобятся базовые знания протокола http. |
В принципе можно не заморачиваться с сокетами и просто использовать функцию file_get_contents.
А через JavaScript все равно исходный код страницы не восстановить, т.к. каждый браузер приводит html-код к своему виду. Если у вас установлен плагин к файерфоксу Web Developer Toolbar, то сравните "View source" и "View generated source". В частности, firefox удаляет все xhtml-ные закрытия тегов, а-ля <img />. ИЕ еще больше мудрит: у некоторых значений аттрибутов удаляет кавычки, у некоторых нет. |
Ну да, можно в принципе и через file_get_contents(). Но всё-таки везде есть fsockopen, но кое-где нету fopen wrappers, так что использовать fsockopen тут более рационально. Тем более, для расширения (+cookie, +POST, ...) да и для общего развития полезно использовать fsockopen. Это ИМХО, конечно... :)
|
маленькое замечание: file_get_contents (если параметр - url) внутри себя использует сокетное соединение, так что - без разницы =)
|
Ну да, по сути любое соединение, использующее URL fopen wrappers является сокетным соединением, т.е fopen, file_get_contents, include (раньше) если им передать url в качестве пути, откроют сокетное подключение, т.к это вообще механизм коммуникации между клиентом и сервером.
Всё таки по мне, лучше использовать сделанную именно для таких задач функцию fsockopen, чем функции работы с локальными файлами с параметром url. Да и если приложение нужно будет расширить, например получить страницу, сгенерированную POST запросом, или с определёнными куками, или получить через https, то тут уже легче самому запрос генерировать, чем писать неудобный (имхо) контекст для file_get_contents. В любом случае, решать автору :) |
Цитата:
Вот, подправил немного код. Исправил ошибку, и сделал более универсальным: function par_str($str,$start,$end){ $res = substr($str,strpos($str,$start)+strlen($start),strlen($str)); if ($end!=null) $res = substr($res,0,strpos($res,$end)); echo($res); return $res; } function get_contents($url){ $url_host = par_str($url,"http://","/"); $url_get = par_str($url,$url_host,null); $fp = fsockopen($url_host, 80, $errno, $errstr, 30); if ($fp) { $out = "GET ".$url_get." HTTP/1.1\r\n" ."Host: ".$url_host."\r\n" ."Connection: Close\r\n" ."\r\n"; fwrite($fp, $out); $result=""; while (!feof($fp)) { $result .= fgets($fp, 128); } $result=substr($result,strpos($result,"\r\n\r\n")+4,strlen($result)); $result=substr($result,strpos($result,"\r\n")+2,strlen($result)); fclose($fp); return $result; } } а ошибка была у тебя, точку надо поставить, что бы объединить все: while (!feof($fp)) { $result .= fgets($fp, 128); } |
Возникла проблема с кодировкой... При отображении в браузере, все нормально. если я пытаюсь отправить эту страницу на мыло. То некоторые приходят нормально, а некоторые в непонятной кодировке...
Пример: "µРїРѕСЃС‚СЊ - Главная страница". Как этого можно избежать? и перекодировать(или другие способы) что бы на мыло приходил нормальный текст. |
Часовой пояс GMT +3, время: 09:22. |
|