Чи може Javascript прочитати джерело будь-якої веб-сторінки?


78

Я працюю над зішкрібненням екрану і хочу отримати вихідний код певної сторінки.

Як досягти цього за допомогою JavaScript? Будь ласка, допоможи мені.


Ось подібна сторінка, на яку ви можете отримати свою відповідь, оскільки вона вирішує мою проблему отримання джерела HTML-сторінки stackoverflow.com/questions/1367587/javascript-page-source-code
Asim Sajjad

7
@mikenvck Чому ти взагалі згадував PHP, коли питання стосувалось JavaScript? Відповіді нижче показують, як це зробити за допомогою JavaScript.
корграт

щоб отримати джерело посилання, можливо, вам доведеться використовувати $.ajaxдля зовнішніх посилань. ось рішення - stackoverflow.com/a/18447625/2657601
otaxige_aol

1
Жодна відповідь не була рідною Javascript, усі вони базувались на jquery.
ILikeTacos

1
jQuery - це власний JavaScript. Це просто JavaScript, який ви можете скопіювати з jquery.com, а не зі stackoverflow.com.
Квентін

Відповіді:


112

Простий спосіб почати, спробуйте 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);

і грати з ним.

Прекрасно , чи не так?


4
Блискуче, особливо для натякнення на рішення бідняка на yahoo, яке позбавляє потреби в проксі для отримання даних. Дякую!! Я взяв на себе свободу виправити останнє демо-посилання на query.yahooapis.com: у кодуванні URL-адреси не було знака%. Класно, що це все ще працює !!
GitaarLAB

Будь-яка ідея, як зішкребти зображення та метаопис з amazon.in/Xiaomi-Redmi-4A-Grey-16GB/dp/… ?

1
query.yahooapis скасовано станом на січень 2019 року. Виглядає дуже акуратно, дуже шкода, що ми зараз не можемо ним користуватися. Дивіться твіт тут: twitter.com/ydn/status/1079785891558653952?ref_src=twsrc%5Etfw
mindoverflow

32

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>

4
Чому потрібен проксі на основі домену?
Равіндранат Акіла

3
через
однакову

це справді цікаво. імовірно є якийсь код, який слід встановити на сервері, щоб це сталося?
S Meaden

@ejbytes: насправді я думаю, що node.js має деякі модулі. Я припускаю, що ОР хоче стерти веб.
S Meaden

Ви отримаєте, що 'з походження' null 'заблоковано політикою CORS: на запитуваному ресурсі немає заголовка' Access-Control-Allow-Origin '.' якщо ви перебуваєте не в одному домені
Gerrit B

7

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


3
На жаль, ви не отримаєте жодного сповіщення, воно просто заблокує запит
Алекс

5

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


3

Використання 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>

8
Ви не можете запросити сторінку за межами вашого домену таким чином, це потрібно зробити через проксі-сервер, наприклад $ .get (' mydomain.com/?url=www.google.com' )
karim79

2

Якщо вам абсолютно потрібно використовувати javascript, ви можете завантажити джерело сторінки із запитом ajax.

Зауважте, що за допомогою javascript ви можете отримувати лише сторінки, які знаходяться в одному домені зі сторінкою-запитом.


2

Я використовував 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();

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

ОНОВЛЕННЯ: Я створив нову, якою вони мені дозволили користуватися менше ніж за 48 годин, перш ніж вони сказали, що я повинен заплатити за послугу. Здається, вони досить швидко закрили ваш проект, якщо ви не платите. Я створив власну подібну службу з NodeJS та бібліотекою NightmareJS. Ви можете ознайомитись з їхнім посібником тут і створити власний інструмент вискоблювання веб-сторінок. Це порівняно просто. Я не намагався встановити його як API, до якого я можу надсилати запити, або щось інше.



1

jquery - це не спосіб робити щось. Зробити у purre javascript

var r = new XMLHttpRequest();
    r.open('GET', 'yahoo.comm', false);
    r.send(null); 
if (r.status == 200) { alert(r.responseText); }

0

Ви можете сформувати XmlHttpRequest і запитати сторінку, а потім використовувати getResponseText () для отримання вмісту.


0

Ви можете скористатися API FileReader, щоб отримати файл, і, вибираючи файл, помістіть 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")
    }
  }
}

0

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


0

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

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

Я тестував це лише в Safari на Mac.

Наступна демонстрація отримує сторінку в базовому тегу та переміщує її innerHTML у нове вікно. Мій сценарій додає теги html, але у більшості сучасних браузерів цього можна уникнути, використовуючи externalHTML.

<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>

Я використовую Safari 5.0.6 з виправленнями webkit, щоб оновити його до еквівалента новіших версій. Якою версією Safari ви користувались і що сталося?
Невілл Хіллієр

8.0.3. Нічого не трапилось, окрім деяких помилок (які я не запам'ятовував) з'явилися в консолі.
Квентін

Яке Safari ви використовуєте та в чому саме були помилки?
Neville Hillyer

Все ще 8.0.3, і якщо ви дійсно хочете, щоб я відтворив тест:TypeError: undefined is not an object (evaluating 'w.document')
Квентін

Найімовірніше пояснення того, що вам вдалося зробити, це те, що ви знайшли дірку в безпеці, яка існує завдяки деякій комбінації вашого позитивно старовинного браузера та неофіційних латок до нього. Це не є чимось практичним використанням у більшості випадків.
Квентін

0
<script>
    $.getJSON('http://www.whateverorigin.org/get?url=' + encodeURIComponent('hhttps://example.com/') + '&callback=?', function (data) {
        alert(data.contents);
    });

</script>

Включіть jQuery і використовуйте цей код, щоб отримати HTML іншого веб-сайту. Замініть example.com на ваш веб-сайт .

Цей метод передбачає отримання зовнішнім сервером HTML-кодів веб-сайтів та надсилання їх вам. :)


0
javascript:alert("Inspect Element On");
javascript:document.body.contentEditable = 'true';
document.designMode='on'; 
void 0;
javascript:alert(document.documentElement.innerHTML); 

Виділіть це та перетягніть його на панель закладок і клацніть на ньому, коли ви хочете редагувати та переглядати поточний вихідний код веб-сайтів.


0

На Linux

  1. завантажити slimerjs (slimerjs.org)

  2. завантажити Firefox версії 59

  3. додати цю змінну середовища: export SLIMERJSLAUNCHER = / home / en / Letöltések / firefox59 / firefox / firefox

  4. на сторінці завантаження slimerjs використовуйте цю програму .js (./slomerjs program.js):

     var page = require('webpage').create();
     page.open(
      'http://www.google.com/search?q=görény',
       function() 
       {
         page.render('goo2.pdf');
         phantom.exit();
       }
     );
    

Використовуйте pdftotext, щоб отримати текст на сторінці.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.