Может ли Javascript прочитать источник любой веб-страницы? - PullRequest
70 голосов
/ 25 марта 2009

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

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

Ответы [ 12 ]

108 голосов
/ 25 марта 2009

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

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

Больше на jQuery Docs

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

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

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

 "results": {
   "body": {
    "noscript": [
     {
      "div": {
       "id": "noscript-padding"
      }
     },
     {
      "div": {
       "id": "noscript-warning",
       "p": "Stack Overflow 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&format=json&callback=cbfunc

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

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

var titleList = $.getJSON(theAboveUrl);

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

Прекрасно , не правда ли?

30 голосов
/ 25 марта 2009

Можно использовать 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>
7 голосов
/ 25 марта 2009

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

6 голосов
/ 25 марта 2009

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

3 голосов
/ 25 марта 2009

Использование 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>
2 голосов
/ 21 августа 2016

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

В вашем 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();

Sidenote: Я нашел этот вопрос, когда исследовал то, что я чувствовал, был тот же вопрос, так что другие могут найти мое решение полезным.

ОБНОВЛЕНИЕ: я создал новый, который мне разрешили использовать менее чем за 48 часов до того, как мне сказали, что я должен заплатить за услугу. Похоже, они довольно быстро закрыли ваш проект, если вы не платите. Я сделал свой собственный аналогичный сервис с NodeJS и библиотекой под названием NightmareJS. Вы можете посмотреть их учебник здесь и создать свой собственный инструмент для просмотра веб-страниц. Это относительно легко. Я не пытался настроить его как API, к которому я мог бы обращаться с запросами или что-то подобное.

2 голосов
/ 25 марта 2009

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

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

0 голосов
/ 11 июня 2018

JQuery не способ делать вещи. Сделать в мурлыкань javascript

var r = new XMLHttpRequest();
    r.open('GET', 'yahoo.comm', false);
    r.send(null); 
if (r.status == 200) { alert(r.responseText); }
0 голосов
/ 06 марта 2015

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

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

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

Следующая демонстрация выбирает страницу в базовом теге и перемещает ее innerHTML в новое окно. Мой скрипт добавляет теги 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>
0 голосов
/ 26 октября 2014

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

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