Cách tải WGET để tải xuống chính xác html trang web giống như trình duyệt


34

Sử dụng trình duyệt web (IE hoặc Chrome) Tôi có thể lưu một trang web (.html) bằng Ctl-S, kiểm tra nó với bất kỳ trình soạn thảo văn bản nào và xem dữ liệu ở định dạng bảng. Một trong những số tôi muốn trích xuất, nhưng đối với nhiều, nhiều trang web, quá nhiều để làm thủ công. Vì vậy, tôi muốn sử dụng WGET để lần lượt lấy các trang web đó và viết một chương trình khác để phân tích cú pháp .html và lấy số tôi muốn. Nhưng tệp .html được lưu bởi WGET khi sử dụng cùng một URL vì trình duyệt không chứa bảng dữ liệu. Tại sao không? Như thể máy chủ phát hiện yêu cầu đến từ WGET chứ không phải từ trình duyệt web và cung cấp trang web bộ xương, thiếu bảng dữ liệu. Làm cách nào tôi có thể có cùng một trang web với WGET? - Cám ơn!

THÊM THÔNG TIN:

Một ví dụ về URL tôi đang cố gắng tìm nạp là: http://performance.morningstar.com/fund/performance-return.action?t=ICENX®ion=usa&cocate=en-US trong đó chuỗi ICENX là biểu tượng đánh dấu quỹ tương hỗ , mà tôi sẽ thay đổi thành bất kỳ biểu tượng đánh dấu nào khác nhau. Điều này tải xuống một bảng dữ liệu khi được xem trong trình duyệt, nhưng bảng dữ liệu bị thiếu nếu được tìm nạp bằng WGET.


Đó là url nào?
Braiam

2
Nhiều khả năng HTML ban đầu được điền vào bằng cách sử dụng các kỹ thuật AJAX bởi một đoạn javascript tải xuống và điền vào bảng. Trong trường hợp này, bạn có thể gặp may mắn hơn khi thực hiện cuộc gọi đến kịch bản này. Giống như Braiam yêu cầu, nếu bạn cung cấp URL, chúng tôi có thể giúp tìm ra điều này tốt hơn.
roadmr

1
ad Thông tin thêm: Trong trình duyệt, khi bạn hiển thị mã nguồn, bạn không thấy HTML gốc (giống như có bởi wget) nhưng HTML được cập nhật bởi javascript / ajax. Các trình duyệt hiện đại hiển thị nguồn được tạo như vậy thay vì HTML đơn giản.
Vrata Blazek

Câu trả lời:


39

Như roadmr đã lưu ý, bảng trên trang này được tạo bởi javascript. wget không hỗ trợ javascript, nó chỉ bỏ trang khi nhận được từ máy chủ (tức là trước khi bất kỳ mã javascript nào chạy) và do đó bảng bị thiếu.

Bạn cần một trình duyệt không đầu hỗ trợ javascript như ph Phantomjs :

$ phantomjs save_page.js http://example.com > page.html

với save_page.js:

var system = require('system');
var page = require('webpage').create();

page.open(system.args[1], function()
{
    console.log(page.content);
    phantom.exit();
});

Sau đó, nếu bạn chỉ muốn trích xuất một số văn bản, dễ nhất có thể là hiển thị trang với w3m:

$ w3m -dump page.html

và / hoặc sửa đổi tập lệnh ph Phantomjs để bỏ đi những gì bạn quan tâm.


Điều này cũng không hoạt động, ví dụ như cotrino.com/lifespan
mrgloom

Các liên kết được tạo ra sẽ không hoạt động với điều đó
QkiZ

1
2018: Dự án PhantomJS bị đình chỉ cho đến khi có thông báo mới :(
1rq3fea324wre

Giải pháp này chỉ để tải xuống các trang từ các url được chỉ định. Làm thế nào để bạn cơ chế thu thập dữ liệu trang web của wget với nó? Ngoài ra, kịch bản sẽ trông như thế nào với chrome không đầu?
Phil

10

Bạn có thể tải xuống một trang web đầy đủ bằng cách sử dụng wget --mirror

Thí dụ:

wget --mirror -p --convert-links -P ./LOCAL-DIR WEBSITE-URL

Dòng lệnh trên mà bạn muốn thực thi khi bạn muốn tải xuống một trang web đầy đủ và có sẵn để xem cục bộ.

Tùy chọn:

  • --mirror bật tùy chọn phù hợp để phản chiếu.

  • -p tải xuống tất cả các tệp cần thiết để hiển thị đúng một trang HTML đã cho.

  • --convert-links sau khi tải xuống, chuyển đổi các liên kết trong tài liệu để xem cục bộ.

  • -P ./LOCAL-DIR lưu tất cả các tập tin và thư mục vào thư mục được chỉ định.

Để biết thêm thông tin về các tùy chọn Wget Đọc thêm bài viết này: Tổng quan về tất cả các lệnh wget với các ví dụ hoặc kiểm tra trang man của Wget .


2
Điều này sẽ không hoạt động với nội dung kết xuất javascript. Vì vậy, bạn sẽ cần phải sử dụng ph Phantomjs như được trả lời bởi lemonsqueeze.
Mattias

1
Cmd này cũng sẽ đi qua tất cả các url phụ, nó sẽ tải xuống các tài nguyên không cần thiết để hiển thị trang web đã cho.
1rq3fea324wre

3

Thay vì --recursive, sẽ chỉ tiếp tục và "nhện" mỗi liên kết trong URL của bạn, sử dụng --page-requisites. Nên hoạt động chính xác như các tùy chọn bạn mô tả trong trình duyệt đồ họa.

       This option causes Wget to download all the files that are
       necessary to properly display a given HTML page.  This includes
       such things as inlined images, sounds, and referenced stylesheets.

       Ordinarily, when downloading a single HTML page, any requisite
       documents that may be needed to display it properly are not
       downloaded.  Using -r together with -l can help, but since Wget
       does not ordinarily distinguish between external and inlined
       documents, one is generally left with "leaf documents" that are
       missing their requisites.

Để biết thêm thông tin, hãy làm man wgetvà tìm kiếm --page-requisitestùy chọn (sử dụng "/" để tìm kiếm trong khi đọc trang nam).


2

Nếu câu trả lời của máy chủ khác nhau tùy thuộc vào nguồn hỏi, phần lớn là do biến HTTP_USER_AGENT (chỉ là một chuỗi văn bản) được cung cấp với yêu cầu từ nguồn hỏi, thông báo cho máy chủ về công nghệ.


  1. Bạn có thể kiểm tra đại lý trình duyệt của mình tại đây -> http://whatsmyuseragent.com

  2. Theo hướng dẫn của WGET, tham số này sẽ thực hiện công việc --user-agent=AGENT.


Nếu điều này không có ích, tức là có thể cần xử lý JavaScript để có cùng trang với trình duyệt hoặc có thể yêu cầu phù hợp với tham số GET để máy chủ sẽ chuẩn bị câu trả lời không yêu cầu JavaScript điền vào 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.