Реплицируйте JavaScript для отправки запросов / аргументов на удаленный сервер, используя PHP - PullRequest
0 голосов
/ 22 апреля 2011

Я создаю приложение, которое получает HTML-источник с различных сайтов.Используя xpath или простой html dom, я могу довольно легко разобрать этот html и передать его в базу данных и т. Д.

К сожалению, этот подход не работает для одного конкретного сайта.Это связано с тем, что сайт загружает свое содержимое с помощью JavaScript, и поэтому большая часть его содержимого не отображается в источнике html.

Снова и снова гуглив это, прочитайте множество потоков, охватывающих эту тему здесь, в Stackoverflow.Я до сих пор не знаю, как решить эту проблему.

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

<script type="text/javascript" src="/jquery-1.3.2.min.js"></script>
<script>
    var example = {

        getServiceCall:function(url) {

     {
        var srtPos=url.indexOf('Filter');
        var endPos=url.indexOf('/',srtPos);
        var filter = $.getUrlVar("Filter");

        var filterInServiceUrl=url.slice(srtPos,endPos).split(":");

        url = (filter) 
            ? url.slice(0,srtPos) + filter + url.slice(endPos,url.length)
            : url.slice(0,srtPos) + filterInServiceUrl[1] + url.slice(endPos,url.length);
     }

      document.writeln('<scri'+'pt src="'+url+'" type="text/javascript"> </sc' + 'ript>');
    },

};

$.extend({
  getUrlVars: function(){
    var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
  },
  getUrlVar: function(name){

  }
});

</script>
<div id="content">
<script language="javascript" type="text/javascript">
function doPerItem(html){ $("#content").html(html.toString()); }
example.getServiceCall('http://www.example.com/?callback=doPerItem');
</script>
</div>

Использование Inspect Element вGoogle Chrome Я вижу, что есть файл, содержащий html-источник, который мне нужен.

Как я могу использовать php, чтобы сделать тот же запрос / аргументы для удаленной подачи, а затем сохранить ответ в файл?

Тогда я смогу разобрать его с помощью xpath или простого html dom, как и другие сайты.

Ваша помощь будет высоко оценена.

1 Ответ

0 голосов
/ 23 апреля 2011

Я не знаю ни одного инструмента удаленного доступа на основе PHP (включая cURL), который интерпретирует JavaScript.Selenium (обычно используемый для тестирования) мог бы сделать это, но Selenium-RC вообще не работал с PHP и имел ошибки в IDE.

Практически нельзя использовать Ajax, потому что это также не разрешает JavaScript(возможно, вы можете решить это каким-либо образом с помощью eval(), что имеет свои проблемы с безопасностью), и JSONP будет работать только в том случае, если удаленный сервер намеренно предлагает API для получения своих данных (вы можете написать свой собственный прокси-сервер и затем передать данные в виде JSONPно тогда у вас все еще будет проблема с разрешением JavaScript).

Что вы можете сделать (хотя имеет реальные риски безопасности для вашего сайта):

  1. Напишите файл на PHP, который просто получает содержимое удаленного сайта, используя file_get_contents (), а затем выводит его (т. Е. Создает прокси).
  2. Динамически вставляет скрытый iframe через JavaScript, чтобы загрузить страницу прокси, а затемдождитесь события загрузки iframe.
  3. Получите полученный HTML-код скрытого iframe от родителя и отправьте результат обратно всервер.

К сожалению, вы не можете избежать шага 1, потому что вы не можете прослушать iframe, если он не находится в том же домене, что и ваш.

Обратите внимание, что еслисайт, который вы посещаете, создает свой JavaScript определенным образом, он может получить доступ к вашему содержащему HTML и делать такие вещи, как захват файлов cookie вашего пользователя, чтобы украсть пароли, выяснить ваш домен или то, что отображается на вашей странице и т. д.

Там могут быть лучшие решения, но я не знаю ни одного.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...