Javascript có thể đọc nguồn của bất kỳ trang web nào không?


78

Tôi đang làm việc trên màn hình và muốn truy xuất mã nguồn của một trang cụ thể.

Làm thế nào để đạt được điều này với javascript? Làm ơn giúp tôi.


Đây là trang tương tự, bạn có thể nhận được câu trả lời của mình vì nó giải quyết vấn đề của tôi trong việc lấy nguồn của Trang HTML stackoverflow.com/questions/1367587/javascript-page-source-code
Asim Sajjad

7
@mikenvck Tại sao bạn lại đề cập đến PHP khi câu hỏi là về JavaScript? Các câu trả lời dưới đây cho biết cách thực hiện điều này với JavaScript.
corgrath vào

để lấy nguồn của một liên kết, bạn có thể cần sử dụng $.ajaxcho các liên kết bên ngoài. đây là giải pháp - stackoverflow.com/a/18447625/2657601
otaxige_aol

1
Không một câu trả lời nào là Javascript gốc, tất cả chúng đều dựa trên jquery.
ILikeTacos

1
jQuery là JavaScript gốc. Nó chỉ là JavaScript mà bạn có thể sao chép từ jquery.com thay vì từ stackoverflow.com.
Quentin

Câu trả lời:


112

Cách đơn giản để bắt đầu, hãy thử jQuery

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

Thêm tại jQuery Docs

Một cách khác để quét màn hình theo cách có cấu trúc hơn nhiều là sử dụng YQL hoặc Ngôn ngữ truy vấn Yahoo. Nó sẽ trả về dữ liệu đã được cạo có cấu trúc là JSON hoặc xml.
ví dụ:
Hãy cạo stackoverflow.com

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

sẽ cung cấp cho bạn một mảng JSON (tôi đã chọn tùy chọn đó) như thế này

 "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"
           }
……..

Cái hay của điều này là bạn có thể thực hiện các phép chiếu và các mệnh đề cuối cùng giúp bạn có được cấu trúc dữ liệu cóp nhặt và chỉ dữ liệu mà bạn cần (cuối cùng là băng thông ít hơn nhiều)
ví dụ:

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

sẽ có em

 "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 ?"
    },
…..

Bây giờ để chỉ nhận được các câu hỏi, chúng tôi làm

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

Lưu ý tiêu đề trong các phép chiếu

 "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 … "
    },
    {
……

Sau khi bạn viết truy vấn của mình, nó sẽ tạo một url cho bạn

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

trong trường hợp của chúng ta.

Vì vậy, cuối cùng bạn sẽ làm một cái gì đó như thế này

var titleList = $.getJSON(theAboveUrl);

và chơi với nó.

Đẹp phải không?


4
Tuyệt vời, đặc biệt là gợi ý cho giải pháp của người nghèo tại yahoo giúp loại bỏ sự cần thiết của proxy để tìm nạp dữ liệu. Cảm ơn bạn!! Tôi đã tự ý sửa liên kết demo cuối cùng tới query.yahooapis.com: nó thiếu dấu% trong mã hóa url. Tuyệt rằng điều này vẫn hoạt động !!
GitaarLAB,

Bất kỳ ý tưởng nào về cách trích xuất hình ảnh và mô tả meta từ amazon.in/Xiaomi-Redmi-4A-Grey-16GB/dp/… ?

1
query.yahooapis đã ngừng hoạt động kể từ tháng 1 năm 2019. Trông thực sự gọn gàng, quá tệ, chúng tôi không thể sử dụng nó bây giờ. Xem tweet tại đây: twitter.com/ydn/status/1079785891558653952?ref_src=twsrc%5Etfw
mindoverflow

32

Javascript có thể được sử dụng, miễn là bạn lấy bất kỳ trang nào bạn đang truy cập thông qua proxy trên miền của bạn:

<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
Tại sao cần có proxy dựa trên miền?
Ravindranath Akila

3
vì Policy xứ Same
Ferdi265

điều đó thực sự thú vị. có lẽ có một số mã để cài đặt trên máy chủ để làm cho điều đó xảy ra?
S Meaden

@ejbytes: thực ra tôi nghĩ rằng node.js có một số mô-đun. Tôi cho rằng OP muốn duyệt web.
S Meaden

Bạn sẽ nhận được một 'từ nguồn gốc' null 'đã bị chặn bởi chính sách CORS: Không có tiêu đề' Truy cập-Kiểm soát-Cho phép-Nguồn gốc 'có trên tài nguyên được yêu cầu.' nếu bạn không ở trên cùng một miền
Gerrit B,

7

Bạn chỉ cần sử dụng XmlHttp(AJAX) để truy cập URL được yêu cầu và phản hồi HTML từ URL sẽ có sẵn trong thuộc responseTexttính. Nếu đó không phải là cùng một tên miền, người dùng của bạn sẽ nhận được cảnh báo của trình duyệt nói rằng đại loại như "Trang này đang cố gắng truy cập một tên miền khác. Bạn có muốn cho phép điều này không?"


3
Thật không may, bạn sẽ không nhận được bất kỳ thông báo nào, nó sẽ chỉ chặn yêu cầu
Alex

5

Như một biện pháp bảo mật, Javascript không thể đọc các tệp từ các miền khác nhau. Mặc dù có thể có một số cách giải quyết kỳ lạ cho nó, tôi sẽ xem xét một ngôn ngữ khác cho nhiệm vụ này.


3

Sử dụng 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
Bạn không thể yêu cầu một trang bên ngoài miền của mình theo cách này, bạn phải thực hiện việc đó qua proxy, ví dụ: $ .get (' mydomain.com/?url=www.google.com' )
karim79

2

Nếu bạn thực sự cần sử dụng javascript, bạn có thể tải nguồn trang bằng một yêu cầu ajax.

Lưu ý rằng với javascript, bạn chỉ có thể truy xuất các trang nằm trong cùng một miền với trang yêu cầu.


2

Tôi đã sử dụng ImportIO . Họ cho phép bạn yêu cầu HTML từ bất kỳ trang web nào nếu bạn thiết lập tài khoản với họ (miễn phí). Họ cho phép bạn thực hiện tới 50k yêu cầu mỗi năm. Tôi đã không mất thời gian cho họ để tìm một giải pháp thay thế, nhưng tôi chắc chắn rằng có một số.

Trong Javascript của bạn, về cơ bản bạn sẽ chỉ thực hiện một yêu cầu GET như sau:

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();

Ghi chú bên lề: Tôi đã tìm thấy câu hỏi này trong khi nghiên cứu xem tôi cảm thấy giống với câu hỏi tương tự, vì vậy những người khác có thể thấy giải pháp của tôi hữu ích.

CẬP NHẬT: Tôi đã tạo một cái mới mà họ chỉ cho phép tôi sử dụng chưa đầy 48 giờ trước khi họ nói rằng tôi phải trả tiền cho dịch vụ. Có vẻ như họ đóng dự án của bạn khá nhanh ngay bây giờ nếu bạn không trả tiền. Tôi đã tạo dịch vụ tương tự của riêng mình với NodeJS và một thư viện có tên là NightmareJS. Bạn có thể xem hướng dẫn của họ ở đây và tạo công cụ cạo trang web của riêng bạn. Nó tương đối dễ dàng. Tôi chưa cố gắng thiết lập nó như một API mà tôi có thể đưa ra yêu cầu hoặc bất cứ điều gì.


2

Bạn có thể sử dụng tìm nạp :

const URL = 'https://www.sap.com/belgique/index.html';
fetch(URL)
.then(res => res.text())
.then(text => {
    console.log(text);
})
.catch(err => console.log(err));


1

jquery không phải là cách hoạt động. Làm trong javascript purre

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

0

Bạn có thể tạo XmlHttpRequest và yêu cầu trang, sau đó sử dụng getResponseText () để lấy nội dung.


0

Bạn có thể sử dụng FileReader API để lấy tệp và khi chọn tệp, hãy đặt url của trang web của bạn vào hộp chọn. Sử dụng mã này:

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

Bạn có thể bỏ qua cùng-origin-policy bằng cách tạo tiện ích mở rộng trình duyệt hoặc thậm chí lưu tệp dưới dạng .hta trong Windows (Ứng dụng HTML).


0

Mặc dù có nhiều ý kiến ​​trái chiều, tôi tin rằng có thể vượt qua yêu cầu về nguồn gốc tương tự với JavaScript đơn giản.

Tôi không khẳng định rằng thông tin sau là nguyên bản bởi vì tôi tin rằng tôi đã nhìn thấy điều gì đó tương tự ở nơi khác cách đây không lâu.

Tôi chỉ thử nghiệm điều này với Safari trên máy Mac.

Trình diễn sau đây tìm nạp trang trong thẻ cơ sở và di chuyển InternalHTML của nó sang một cửa sổ mới. Tập lệnh của tôi thêm các thẻ html nhưng với hầu hết các trình duyệt hiện đại, điều này có thể tránh được bằng cách sử dụng 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>

Tôi sử dụng Safari 5.0.6 với các bản vá webkit để cập nhật nó lên tương đương với các phiên bản mới hơn. Bạn đã sử dụng phiên bản Safari nào và điều gì đã xảy ra?
Neville Hillyer

8.0.3. Không có gì xảy ra ngoài một số lỗi (mà tôi không ghi nhớ) xuất hiện trong bảng điều khiển.
Quentin

Bạn đang sử dụng Safari nào và lỗi chính xác là gì?
Neville Hillyer

Vẫn là 8.0.3 và nếu bạn thực sự muốn tôi tạo lại trường hợp thử nghiệm:TypeError: undefined is not an object (evaluating 'w.document')
Quentin

Lời giải thích khả dĩ nhất cho những gì bạn đã làm là bạn đã tìm thấy một lỗ hổng bảo mật tồn tại nhờ sự kết hợp nào đó giữa trình duyệt cổ xưa của bạn và các bản vá không chính thức của nó. Đó không phải là thứ sử dụng thực tế trong hầu hết các trường hợp.
Quentin

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

</script>

Bao gồm jQuery và sử dụng mã này để lấy HTML của trang web khác. Thay thế example.com bằng trang web của bạn .

Phương pháp này liên quan đến một máy chủ bên ngoài tìm nạp HTML các trang web và gửi nó cho bạn. :)


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

Đánh dấu điều này và kéo nó vào thanh dấu trang của bạn và nhấp vào nó khi bạn muốn chỉnh sửa và xem mã nguồn của các trang web hiện tại.


0

Trên linux

  1. tải xuống slimerjs (slimerjs.org)

  2. tải xuống firefox phiên bản 59

  3. thêm biến môi trường này: export SLIMERJSLAUNCHER = / home / en / Letöltések / firefox59 / firefox / firefox

  4. trên trang tải xuống slimerjs, hãy sử dụng chương trình .js này (./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();
       }
     );
    

Sử dụng pdftotext để lấy văn bản trên trang.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.