Может ли Javascript читать источник любой веб-страницы?

Я работаю над очисткой экрана и хочу получить исходный код на определенной странице.

Как это можно сделать с помощью javascript? Пожалуйста, помогите мне.

Ответ 1

Простой способ начать, попробуйте jQuery

$("#links").load("/Main_Page #jq-p-Getting-Started li");

Подробнее в jQuery Docs

Другой способ сделать скриншоты экрана гораздо более структурированным способом - использовать YQL или язык запросов Yahoo. Он вернет очищенные данные, структурированные как JSON или xml.
например
Пусть scrape stackoverflow.com

select * from html where url="http://stackoverflow.com"

предоставит вам массив JSON (я выбрал эту опцию), как этот

 "results": {
   "body": {
    "noscript": [
     {
      "div": {
       "id": "noscript-padding"
      }
     },
     {
      "div": {
       "id": "noscript-warning",
       "p": "Qaru works best with JavaScript enabled"
      }
     }
    ],
    "div": [
     {
      "id": "notify-container"
     },
     {
      "div": [
       {
        "id": "header",
        "div": [
         {
          "id": "hlogo",
          "a": {
           "href": "/",
           "img": {
            "alt": "logo homepage",
            "height": "70",
            "src": "http://i.stackoverflow.com/Content/Img/stackoverflow-logo-250.png",
            "width": "250"
           }
……..

Красота заключается в том, что вы можете делать прогнозы и где, что в конечном итоге дает вам очищенные данные, структурированные и только данные, в которых вы нуждаетесь (гораздо меньше пропускной способности по всему кабелю)
например,

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

получит вас

 "results": {
   "a": [
    {
     "href": "/questions/414690/iphone-simulator-port-for-windows-closed",
     "title": "Duplicate: Is any Windows simulator available to test iPhone application? as a hobbyist who cannot afford a mac, i set up a toolchain kit locally on cygwin to compile objecti … ",
     "content": "iphone\n                simulator port for windows [closed]"
    },
    {
     "href": "/questions/680867/how-to-redirect-the-web-page-in-flex-application",
     "title": "I have a button control ....i need another web page to be redirected while clicking that button .... how to do that ? Thanks ",
     "content": "How\n                to redirect the web page in flex application ?"
    },
…..

Теперь, чтобы получить только те вопросы, которые мы делаем,

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

Обратите внимание на заголовок в проекциях

 "results": {
   "a": [
    {
     "title": "I don't want the function to be entered simultaneously by multiple threads, neither do I want it to be entered again when it has not returned yet. Is there any approach to achieve … "
    },
    {
     "title": "I'm certain I'm doing something really obviously stupid, but I've been trying to figure it out for a few hours now and nothing is jumping out at me. I'm using a ModelForm so I can … "
    },
    {
     "title": "when i am going through my project in IE only its showing errors A runtime error has occurred Do you wish to debug? Line 768 Error:Expected')' Is this is regarding any script er … "
    },
    {
     "title": "I have a java batch file consisting of 4 execution steps written for analyzing any Java application. In one of the steps, I'm adding few libs in classpath that are needed for my co … "
    },
    {
……

Как только вы напишете свой запрос, он генерирует URL-адрес для вас

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 '% 2F% 2Fdiv% 2Fh3% 2fa' % 0A %20 %20 %20 %20 & формат = & JSON амп; обратный вызов = cbfunc

в нашем случае.

Итак, в конечном итоге вы в конечном итоге делаете что-то вроде этого

var titleList = $.getJSON(theAboveUrl);

и играйте с ним.

Красивая, не так ли?

Ответ 2

Javascript может использоваться, пока вы захватываете любую страницу, которую вы используете через прокси-сервер в вашем домене:

<html>
<head>
<script src="/js/jquery-1.3.2.js"></script>
</head>
<body>
<script>
$.get("www.mydomain.com/?url=www.google.com", function(response) { 
    alert(response) 
});
</script>
</body>

Ответ 3

Вы можете просто использовать XmlHttp (AJAX), чтобы набрать нужный URL-адрес, и ответ HTML из URL-адреса будет доступен в свойстве responseText. Если это не тот же домен, ваши пользователи получат предупреждение обозревателя, говорящее что-то вроде "Эта страница пытается получить доступ к другому домену. Вы хотите разрешить это?"

Ответ 4

В качестве меры безопасности Javascript не может читать файлы из разных доменов. Хотя для этого может быть какое-то странное решение, я бы рассмотрел другой язык для этой задачи.

Ответ 5

Использование jquery

<html>
<head>
<script src="http://jqueryjs.googlecode.com/files/jquery-1.3.2.js" ></script>
</head>
<body>
<script>
$.get("www.google.com", function(response) { alert(response) });
</script>
</body>

Ответ 6

Я использовал ImportIO. Они позволяют вам запрашивать HTML-код с любого веб-сайта, если вы создали учетную запись с ними (что бесплатно). Они позволяют вам составлять до 50 тыс. Запросов в год. Я не нашел времени найти альтернативу, но я уверен, что есть некоторые.

В вашем Javascript вы просто просто сделаете запрос GET следующим образом:

var request = new XMLHttpRequest();

request.onreadystatechange = function() {
  jsontext = request.responseText;

  alert(jsontext);
}

request.open("GET", "https://extraction.import.io/query/extractor/THE_PUBLIC_LINK_THEY_GIVE_YOU?_apikey=YOUR_KEY&url=YOUR_URL", true);

request.send();

Ответ 7

Если вам абсолютно необходимо использовать javascript, вы можете загрузить источник страницы с помощью запроса ajax.

Обратите внимание, что с помощью javascript вы можете получать только страницы, расположенные в том же домене, с запрашивающей страницей.

Ответ 8

Вы можете создать XmlHttpRequest и запросить страницу, а затем использовать getResponseText() для получения содержимого.

Ответ 9

Вы можете использовать FileReader API, чтобы получить файл, и при выборе файла поместите URL-адрес вашей веб-страницы в поле выбора, Используйте этот код:

function readFile() {
    var f = document.getElementById("yourfileinput").files[0]; 
    if (f) {
      var r = new FileReader();
      r.onload = function(e) { 
        alert(r.result);
      }
      r.readAsText(f);
    } else { 
      alert("file could not be found")
    }
  }
}

Ответ 10

Вы можете обойти политику одинакового происхождения путем создания расширения браузера или даже сохранения файла как .hta в Windows (приложение HTML).

Ответ 11

Несмотря на множество замечаний об обратном, я считаю, что с одним JavaScript можно преодолеть одно и то же требование происхождения.

Я не утверждаю, что следующее оригинально, потому что я считаю, что некоторое время назад я видел нечто подобное в другом месте.

Я тестировал это только с Safari на Mac.

Следующая демонстрация выводит страницу в базовый тег и перемещает ее innerHTML в новое окно. Мой script добавляет теги html, но с большинством современных браузеров этого можно избежать, используя outerHTML.

<html>
<head>
<base href='http://apod.nasa.gov/apod/'>
<title>test</title>
<style>
body { margin: 0 }
textarea { outline: none; padding: 2em; width: 100%; height: 100% }
</style>
</head>
<body onload="w=window.open('#'); x=document.getElementById('t'); a='<html>\n'; b='\n</html>'; setTimeout('x.innerHTML=a+w.document.documentElement.innerHTML+b; w.close()',2000)">
<textarea id=t></textarea>
</body>
</html>