Làm thế nào để bạn sử dụng WGET để phản chiếu một trang web sâu 1 cấp, phục hồi các tài nguyên JS, CSS bao gồm các hình ảnh CSS?


11

Giả sử tôi muốn một bản sao trang đơn giản được tải xuống HD của tôi để lưu giữ vĩnh viễn. Tôi không tìm kiếm một đệ quy sâu, chỉ một trang, nhưng cũng có bất kỳ tài nguyên nào được tải bởi trang đó cũng được tải xuống.

Ví dụ: https://www.tumblr.com/

Chờ đợi:

  • Chỉ mục.html
  • Bất kỳ hình ảnh được tải
  • Mọi tệp tin được tải
  • Mọi tệp CSS được tải
  • Mọi hình ảnh được tải trong tệp CSS
  • liên kết cho các tài nguyên trang được bản địa hóa để hoạt động với các bản sao được tải xuống (không phụ thuộc vào web)

Tôi muốn biết liệu bạn có thể giúp tôi tìm cú pháp wget tốt nhất hoặc công cụ khác sẽ làm việc này không. Các công cụ tôi đã thử thường không tải được hình ảnh được tải bởi CSS, vì vậy trang không bao giờ trông đúng khi được tải cục bộ. Cảm ơn bạn!

Giải pháp tiếp tuyến

Tôi tìm thấy một cách để làm điều này bằng cách sử dụng FireFox. Lưu mặc định bị hỏng và có một addon được gọi là "Lưu hoàn thành" rõ ràng có thể làm tốt công việc này. Tuy nhiên, bạn không thể tải xuống vì nó nói rằng nó không được hỗ trợ trong phiên bản FireFox hiện tại. Lý do là nó đã được đưa vào addon này: "Định dạng lưu trữ Mozilla". Cài đặt nó, sau đó khi bạn sử dụng Tệp> "Lưu trang dưới dạng ..", có một tùy chọn mới gọi là "Trang web, hoàn thành", về cơ bản là bổ trợ cũ, giúp sửa lỗi triển khai chứng khoán mà FireFox sử dụng (rất tệ). Đây không phải là giải pháp WGET nhưng nó cung cấp giải pháp khả thi.

EDIT: Một vấn đề nực cười khác cho bất cứ ai có thể theo dõi câu hỏi này trong tương lai, cố gắng làm điều này. Để addon hoạt động chính xác, bạn cần vào Công cụ> Định dạng Lưu trữ Mozilla và thay đổi cài đặt mặc định (khủng khiếp) của "chụp ảnh trung thực của trang" thành "giữ nguyên tập lệnh và nguồn bằng Save Complete", nếu không thì addon sẽ làm trống tất cả tập tin tập lệnh của bạn và thay thế chúng bằng văn bản "/ * Tập lệnh được xóa bằng cách lưu ảnh chụp nhanh * /".


tệp> lưu như trên firefox hoặc trình duyệt khác sẽ tải xuống tất cả hình ảnh, tệp js và css
user31113

Bạn có thực sự muốn các tập tin, hoặc bạn chỉ muốn một phiên bản được hiển thị chính xác của trang?

Tôi muốn các tập tin, dù sao chúng cũng sẽ được yêu cầu hiển thị chính xác trang. Nếu bạn không có chúng, nó sẽ trông khác. Tệp> Lưu Như không hoạt động trong Firefox. Nếu bạn làm điều này, bạn sẽ không nhận được hình ảnh css. Hãy thử nó tại tumblr.com/login . Thiếu hình nền, hình ảnh bg cho các trường đầu vào bị thiếu.

Không có giải pháp wget nào làm việc cho tôi. Giải pháp Tangent của tôi là phương pháp tốt nhất để đạt được loại tiết kiệm trang web này. Tuy nhiên, tôi đã thấy nó thất bại trên các trang rất phức tạp như apple.com , có lẽ vì rất nhiều đường dẫn tài nguyên được tạo động bằng cách thực thi javascript, một số không ngay lập tức nhưng trong một số loại thực thi ajax.
Lana Miller

Câu trả lời:


12

wget -p -k http://ExampleSite.com

-P sẽ giúp bạn có tất cả các yếu tố cần thiết để xem trang web một cách chính xác (css, hình ảnh, v.v.). -K sẽ thay đổi tất cả các liên kết (để bao gồm các liên kết cho CSS & hình ảnh) để cho phép bạn xem trang ngoại tuyến khi nó xuất hiện trực tuyến.

Cập nhật: Điều này là cụ thể cho trang web mẫu của bạn: tumblr.com

wget -H -N -k -p --exclude-domains quantserve.com --no-check-certificate -U "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0a2) Gecko/20110613 Firefox/6.0a2" https://www.tumblr.com

Sự phá vỡ:

-H = Cho phép wget đi đến một máy chủ nước ngoài. Bắt buộc vì tumblr không có hình ảnh của nó trên trang đầu trên cùng một địa chỉ, nên họ đang sử dụng safe.assets.tumblr.com xem ghi chú về việc loại trừ tên miền

-N = sẽ chỉ lấy các tệp mới hơn những gì bạn hiện có, trong trường hợp bạn đang tải xuống cùng một trang theo thời gian

-k = chuyển đổi liên kết của bạn để xem ngoại tuyến đúng cách

-p = lấy tất cả các yếu tố cần thiết để xem chính xác (css, hình ảnh, v.v.)

--exclude-domain = vì trang chủ tumblr.com có ​​liên kết cho quantserve.com và tôi đoán bạn không muốn những thứ này, bạn cần loại trừ nó khỏi tải xuống wget của bạn. Lưu ý : Đây là một thứ khá quan trọng mà bạn nên sử dụng với -H bởi vì nếu bạn truy cập một trang web và họ có nhiều liên kết cho các máy chủ bên ngoài (nghĩ rằng các nhà quảng cáo & công cụ phân tích) thì bạn cũng sẽ lấy thứ đó!

--no-check-chứng nhận cần thiết vì tumblr đang sử dụng https

-U thay đổi tác nhân người dùng. Không thực sự cần thiết trong trường hợp này vì nó cho phép tác nhân người dùng mặc định nhưng tôi biết một số trang web sẽ chặn nó. Tôi vừa ném nó vào đây để đề phòng bạn gặp phải bất kỳ vấn đề nào trên các trang web khác. Trong đoạn mã ví dụ tôi đã đưa ra, nó xuất hiện dưới dạng Mozilla Firefox 6.02a

cuối cùng bạn cũng có trang web: https://www.tumblr.com


1
Tôi đã thử điều này, không nhận được bất kỳ tệp tin JS hoặc CSS hoặc hình ảnh nào. Bạn đã?

Nếu bạn đang sử dụng nó trên tumblr (ví dụ của bạn ở trên), bạn có thể phải chỉ định --no-check-cert.

Tôi nghĩ bạn đã đúng, có lẽ nó cần tùy chọn đó. Vẫn không có gì ngoại trừ index.html tuy nhiên. Một cái gì đó đang thiếu ...

@LanaMiller Tôi cập nhật câu trả lời của tôi. Hãy cho tôi biết nếu có bất kỳ vấn đề.

Bạn không thể làm một cái gì đó như -exclude-domain! = Tumblr.com?
alpha1

3

Đối với trang web cụ thể mà bạn đã đề cập và nhiều trang khác được mã hóa như nó wget (và curl) sẽ không hoạt động. Vấn đề là một số liên kết tài sản cần có để hiển thị trang trong trình duyệt được tạo thông qua javascript. Wget có một yêu cầu tính năng đang chờ xử lý để chạy javascript:

http://wget.addictivecode.org/FeatureSpecutions/JavaScript

Tuy nhiên, cho đến khi đó là các trang web hoàn chỉnh xây dựng liên kết tài sản bằng cách sử dụng javascript sẽ không thể được sao chép bằng wget. Giải pháp đơn giản nhất là tìm một công cụ thực sự xây dựng DOM và phân tích cú pháp javascript giống như một công cụ trình duyệt (tức là phương thức firefox mà bạn đã đề cập).


1

Bạn cũng có thể thực hiện việc này một cách tự động (hoặc lập trình nếu bạn thực hiện mã hóa) bằng cách phát lệnh thông qua shell bằng wget:

wget --convert-links -r http://www.yourdomain.com

Nó sẽ tải xuống trang và các tập tin nội bộ và làm cho các liên kết cục bộ.


1
Điều này sẽ nhận được mọi thứ . Đọc câu hỏi.
sinh

-1
wget -r http://www.example.com

Tôi nghĩ rằng nó sẽ lấy tất cả mọi thứ, nhưng hãy thử và tìm hiểu.


1
Nó nhận được mọi thứ là quá nhiều. Cho đến nay, giải pháp FireFox tôi thấy là giải pháp hoạt động tốt nhất. Nó có được những gì bạn cần và không có gì hơn.

-1

$ ( người đàn ông quên ):

-p

--page-điều kiện cần thiết

Tùy chọn này khiến Wget tải xuống tất cả các tệp cần thiết để hiển thị đúng một trang HTML đã cho. Điều này bao gồm những thứ như hình ảnh, âm thanh và biểu định kiểu được tham chiếu.

Thông thường, khi tải xuống một trang HTML, mọi tài liệu cần thiết có thể cần để hiển thị đúng sẽ không được tải xuống. Sử dụng -r cùng với -l có thể giúp ích, nhưng vì Wget thường không phân biệt giữa các tài liệu bên ngoài và nội dung, nên người ta thường để lại '' tài liệu lá '' mà thiếu các điều kiện cần thiết của họ.

Ví dụ: giả sử tài liệu 1.html chứa thẻ "<IMG>" tham chiếu 1.gif và thẻ "<A>" trỏ đến tài liệu bên ngoài 2.html. Nói rằng 2.html tương tự nhưng hình ảnh của nó là 2.gif và nó liên kết với 3.html. Nói điều này tiếp tục lên đến một số cao tùy ý.

Nếu một người thực thi lệnh:

wget -r -l 2 http: // <trang web> /1.html

sau đó 1.html, 1.gif, 2.html, 2.gif và 3.html sẽ được tải xuống. Như bạn có thể thấy, 3.html không có 3.gif cần thiết vì Wget chỉ đơn giản là đếm số bước nhảy (tối đa 2) từ 1.html để xác định nơi dừng đệ quy. Tuy nhiên, với lệnh này:

wget -r -l 2 -p http: // <trang web> /1.html

tất cả các tệp trên và 3.htif của 3.htl sẽ được tải xuống. Tương tự

wget -r -l 1 -p http: // <trang web> /1.html

sẽ khiến 1.html, 1.gif, 2.html và 2.gif được tải xuống. Người ta có thể nghĩ rằng:

wget -r -l 0 -p http: // <trang web> /1.html

sẽ chỉ tải xuống 1.html và 1.gif, nhưng thật không may, đây không phải là trường hợp, bởi vì -l 0 tương đương với -l inf --- nghĩa là đệ quy vô hạn. Để tải xuống một trang HTML (hoặc một số ít trong số chúng, tất cả được chỉ định trên dòng lệnh hoặc trong tệp nhập URL -i) và các yêu cầu của nó (hoặc của chúng), chỉ cần bỏ qua -r và -l:

wget -p http: // <trang web> /1.html

Lưu ý rằng Wget sẽ hoạt động như thể -r đã được chỉ định, nhưng chỉ có một trang duy nhất và các yêu cầu của nó sẽ được tải xuống. Liên kết từ trang đó đến các tài liệu bên ngoài sẽ không được theo dõi. Trên thực tế, để tải xuống một trang duy nhất và tất cả các yêu cầu của nó (ngay cả khi chúng tồn tại trên các trang web riêng biệt) và đảm bảo lô hiển thị đúng cách cục bộ, tác giả này thích sử dụng một vài tùy chọn ngoài -p:

wget -E -H -k -K -p http: // <trang web> / <tài liệu & gt ;

Để kết thúc chủ đề này, bạn nên biết rằng ý tưởng của Wget về liên kết tài liệu bên ngoài là bất kỳ URL nào được chỉ định trong thẻ "<A>", thẻ "<AREA>" hoặc thẻ "<LINK>" khác với "<LINK>" LINK REL = "bản định kiểu"> ".


2
Phần nào trong số này bạn nghĩ giống với giải pháp? Bởi vì tôi đã cố đọc nội dung của trang nam và tôi không thấy giải pháp chính xác ở đây. Bạn đã thử bất kỳ điều này cho mình? Bạn nghĩ gì về lệnh là giải quyết câu hỏi cụ thể.
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.