Как получить данные с помощью JavaScript с другого сервера?

Как я могу делать запросы на другой сервер(ы) (т. е. получить страницу с любого желаемого сервера) с JavaScript в браузере пользователя? Существуют ограничения для предотвращения этого для таких методов, как XMLHttpRequest, есть ли способы обойти их или другие методы?

Это общий вопрос, в частности, я хочу проверить ряд случайных веб-сайтов и посмотреть, содержат ли они определенный элемент, поэтому мне нужен HTML-контент веб-сайта без загрузки каких-либо дополнительных файлов; все это в файле JavaScript,без какого-либо механизма пересылки или прокси на сервере.

(Примечание: один из способов - использование Greasemonkey и его GM_xmlhttpRequest.)

8 ответов


вы должны проверить jQuery. Он имеет богатую базу функциональность AJAX это может дать вам возможность сделать все это. Вы можете загрузить внешнюю страницу и проанализировать ее HTML-контент с помощью intuitive модели CSS-селекторов, как.

пример использования $.get ();

$.get("anotherPage.html", {}, function(results){
  alert(results); // will show the HTML from anotherPage.html
  alert($(results).find("div.scores").html()); // show "scores" div in results
});

для внешних доменов мне пришлось создать локальный PHP-скрипт, который будет действовать как посредник. jQuery вызовет локальный PHP-скрипт, передающий другой URL-адрес сервера в качестве аргумента локальный PHP-скрипт будет собирать данные, а jQuery будет считывать данные из локального PHP-скрипта.

$.get("middleman.php", {"site":"http://www.google.com"}, function(results){
  alert(results); // middleman gives Google's HTML to jQuery
});

давая посредников.php что-то вроде

<?php

  // Do not use as-is, this is only an example.
  // $_GET["site"] set by jQuery as "http://www.google.com"
  print file_get_contents($_GET["site"]);

?>

напишите прокси-скрипт, который пересылает http-запрос из вашего домена, это обойдет ограничения XMLHttpRequest.

Если вы используете PHP, просто используйте cURL для запроса и чтения страницы, а затем просто выплюните html, как если бы он был из вашего домена.


Это довольно легко... если вы знаете "секретный" трюк, почти никто не делится..

это называется Yahoo yql...

поэтому, чтобы вернуть "власть пользователю" (и вернуться к удобной мантре: "никогда не принимайте нет"), просто используйте http://query.yahooapis.com/ (вместо php? прокси - серверный скрипт).
jQuery не будет строго необходим.

Пример 1:
Использование SQL-подобной команды:

select * from html 
where url="http://stackoverflow.com" 
and xpath='//div/h3/a'

следующая ссылка будет царапать так для новейших вопросов (в обход междоменной безопасности bull$#!7):
http://query.yahooapis.com/v1/public/yql?q=select%20title%20from%20html%20where%20url%3D%22http%3A%2F%2Fstackoverflow.com%22%20and%0A%20%20%20%20%20%20xpath%3D%27%2F%2Fdiv%2Fh3%2Fa%27%0A%20%20%20%20&format=json&callback=cbfunc

Как вы можете видеть, это вернет массив JSON (можно также выбрать xml) и вызов callback-функция: cbfunc.

действительно, в качестве "бонуса" вы спасти котенка каждый раз, когда вам не нужно было regex данные из "tag-суп".

вы слышите, как ваш маленький сумасшедший ученый внутри себя начинает хихикать?

затем посмотреть ответ для получения дополнительной информации (и не забудьте, что это комментарии, примеры).

Удачи!


для этого вам нужно будет написать прокси-сервер на сервере. И все запросы будут на ваш сервер, а затем ваш сервер загрузит html и отправит его обратно клиенту. И нет хорошего способа реализовать это только через javascript.
jQuery содержит функциональность для загрузки данных JSON или внешних скриптов с помощью XmlHttpRequest, но эта функция не может использоваться для html-страниц. Также вы можете проверить этой теме из списка рассылки jQuery.


вы также можете использовать iframe для эмуляции запроса ajax. Это избавляет вас от необходимости кодировать бэкэнд-решение для проблемы интерфейса. Вот пример:

function setUploadEvent(typeComponet){
       var eventType = "";
       var iframe = document.getElementById("iframeId");
       try{
           /* for Mozilla / Opera9 */
           if (/(?!.*?compatible|.*?webkit)^mozilla|opera/i.test(navigator.userAgent)) {
                eventType = "onload";
           }else{
           /* IE  */
                eventType = "onreadystatechange";
           }

           iframe[eventType] = function(){
                var doc = iframe.contentDocument || iframe.contentWindow.document;
                var response = doc.body.innerHTML; /* or what ever content you are looking for */
             }
           }
       catch(e){
           alert("Error loading content")}
       } 

это должно сделать трюк. Обратите внимание, что линия обнаружения браузера не самая чистая, вы должны абсолютно использовать те, которые предоставляются во всех наиболее распространенных фреймворках JS (Prototype, JQuery и т. д.)


скрипт>

вы добавляете данные в hello.js в виде массива, JSON или аналогичного. Образец: var daysInMonth = новый массив(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

получение JavaScript с другого сервера не намного проще.. :-)


$.get (); можно получить данные изjsbin.com но я не знаю, почему он не может получить данные с другого сайта, как google.com

$.получить('http://jsbin.com/ufotu5", {}, функция (результаты){ alert(results); });

демо:http://jsfiddle.net/Xj234/ протестировано с firefox, chrome и safari.


большое спасибо, это действительно хороший трюк. Я сделал так: