คุณจะใช้ WGET เพื่อทำมิเรอร์ไซต์ระดับ 1 ระดับลึกโดยกู้คืนทรัพยากร JS, CSS รวมถึงอิมเมจ CSS ได้อย่างไร


11

แกล้งฉันต้องการสำเนาหน้าง่าย ๆ ที่จะดาวน์โหลดไปยัง HD ของฉันสำหรับการรักษาอย่างถาวร ฉันไม่ได้มองหาการเรียกซ้ำแบบลึก ๆ เพียงหน้าเดียว แต่ยังรวมถึงแหล่งข้อมูลที่โหลดโดยหน้านั้นเพื่อดาวน์โหลดด้วย

ตัวอย่าง: https://www.tumblr.com/

คาดหวัง:

  • index.html
  • โหลดภาพใด ๆ
  • ไฟล์ JS ใด ๆ ที่โหลด
  • โหลดไฟล์ CSS ใด ๆ
  • ภาพใด ๆ ที่โหลดในไฟล์ CSS
  • ลิงก์สำหรับทรัพยากรของหน้าเว็บที่มีการแปลเพื่อให้ทำงานกับสำเนาที่ดาวน์โหลดมา (ไม่มีการพึ่งพาเว็บ)

ฉันสนใจที่จะทราบว่าคุณสามารถช่วยฉันหาไวยากรณ์ wget ที่ดีที่สุดหรือเครื่องมืออื่น ๆ ที่จะทำเช่นนี้ เครื่องมือที่ฉันพยายามมักจะล้มเหลวในการโหลดรูปภาพด้วย CSS ดังนั้นหน้าเว็บจะดูไม่ถูกต้องเมื่อโหลดในเครื่อง ขอบคุณ!

โซลูชั่นแทนเจนต์

ฉันพบวิธีการใช้ FireFox การบันทึกเริ่มต้นจะใช้งานไม่ได้และมีส่วนเสริมที่เรียกว่า "บันทึกเสร็จสมบูรณ์" ซึ่งเห็นได้ชัดว่าสามารถทำงานได้ดีกับสิ่งนี้ อย่างไรก็ตามคุณไม่สามารถดาวน์โหลดได้เพราะมันบอกว่ามันไม่รองรับ FireFox เวอร์ชั่นปัจจุบัน เหตุผลก็คือมันถูกรีดลงในส่วนเสริมนี้: "Mozilla Archive Format" ติดตั้งนั้นจากนั้นเมื่อคุณใช้ไฟล์> "บันทึกหน้าเป็น .. " มีตัวเลือกใหม่ที่เรียกว่า "หน้าเว็บเสร็จสมบูรณ์" ซึ่งเป็นส่วนเสริมเก่าซึ่งแก้ไขการใช้งานหุ้นของ FireFox (ซึ่งแย่มาก) นี่ไม่ใช่โซลูชัน WGET แต่ให้โซลูชันที่ใช้การได้

แก้ไข: ปัญหาที่น่าหัวเราะอีกอย่างสำหรับใครก็ตามที่อาจติดตามคำถามนี้ในอนาคตพยายามทำสิ่งนี้ ทำให้ addon ทำงานได้อย่างถูกต้องคุณต้องใช้เครื่องมือ> Mozilla Archive Format และเปลี่ยนการตั้งค่าเริ่มต้น (แย่) ของ "take snapshot ที่ซื่อสัตย์ของหน้า" เป็น "เก็บสคริปต์และแหล่งที่มาโดยใช้ Save Complete" มิฉะนั้น addon จะว่างเปล่าทั้งหมด ไฟล์สคริปต์ของคุณและแทนที่ด้วยข้อความ "/ * สคริปต์ถูกลบออกโดย snapshot save * /"


ไฟล์> บันทึกเป็นใน Firefox หรือเบราว์เซอร์อื่น ๆ จะดาวน์โหลดไฟล์รูปภาพ js และ css ทั้งหมด
user31113

คุณต้องการไฟล์จริงหรือคุณแค่ต้องการเวอร์ชั่นที่แสดงผลถูกต้องหรือไม่?

ฉันต้องการไฟล์พวกเขาจะต้องแสดงหน้าอย่างถูกต้องต่อไป หากคุณไม่มีมันก็จะดูแตกต่าง ไฟล์> บันทึกเป็นไม่ทำงานใน Firefox หากคุณทำเช่นนี้คุณจะไม่ได้ภาพ css ลองมันที่tumblr.com/login ไม่มีภาพพื้นหลังภาพ bg สำหรับช่องป้อนข้อมูลหายไป

ไม่มีวิธีแก้ปัญหา wget สำหรับฉัน โซลูชันแทนเจนต์ของฉันเป็นวิธีที่ดีที่สุดในการประหยัดไซต์ประเภทนี้ อย่างไรก็ตามฉันได้เห็นว่ามันล้มเหลวในหน้าเว็บที่ซับซ้อนมากเช่นapple.comน่าจะเป็นเพราะเส้นทางทรัพยากรจำนวนมากถูกสร้างขึ้นแบบไดนามิกโดยการเรียกใช้จาวาสคริปต์บางอย่างไม่ได้เกิดขึ้นทันที แต่ในระหว่างการประมวลผล ajax
Lana Miller

คำตอบ:


12

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

-p จะให้องค์ประกอบที่จำเป็นทั้งหมดแก่คุณในการดูเว็บไซต์อย่างถูกต้อง (css, ภาพ, ฯลฯ ) -k จะเปลี่ยนลิงก์ทั้งหมด (เพื่อรวมลิงก์สำหรับ CSS & รูปภาพ) เพื่อให้คุณสามารถดูหน้าออฟไลน์ตามที่ปรากฏออนไลน์

อัปเดต: นี่คือเฉพาะสำหรับเว็บไซต์ตัวอย่างของคุณ: 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

รายละเอียด:

-H = อนุญาตให้ wget ไปขยายโฮสต์ต่างประเทศ จำเป็นต้องใช้เนื่องจาก Tumblr ไม่มีภาพบนหน้าแรกในที่อยู่เดียวกันพวกเขากำลังใช้ secure.assets.tumblr.com ดูหมายเหตุเกี่ยวกับการยกเว้นโดเมน

-N = จะหยิบเฉพาะไฟล์ที่ใหม่กว่าที่คุณมีอยู่ในกรณีที่คุณดาวน์โหลดหน้าเดิมอีกครั้งเมื่อเวลาผ่านไป

-k = แปลงลิงก์ของคุณเพื่อดูออฟไลน์อย่างถูกต้อง

-p = คว้าองค์ประกอบที่จำเป็นทั้งหมดเพื่อดูอย่างถูกต้อง (css, ภาพ, ฯลฯ )

--exclude-domains = เนื่องจากหน้าแรกของ tumblr.com มีลิงก์สำหรับ quantserve.com และฉันเดาว่าคุณไม่ต้องการสิ่งนี้คุณต้องแยกออกจากการดาวน์โหลดของคุณ หมายเหตุ : นี่เป็นสิ่งสำคัญที่คุณควรใช้กับ -H เพราะถ้าคุณไปที่ไซต์และมีลิงก์หลายลิงก์สำหรับโฮสต์ภายนอก (คิดว่าผู้โฆษณาและเนื้อหาการวิเคราะห์) คุณก็จะคว้าสิ่งนั้นด้วย!

- ไม่มีการตรวจสอบใบรับรองที่จำเป็นเนื่องจาก Tumblr ใช้ https

-U เปลี่ยน user-agent ไม่จำเป็นจริง ๆ ในอินสแตนซ์นี้เนื่องจากอนุญาตให้ตัวแทนผู้ใช้เริ่มต้น wget แต่ฉันรู้ว่าบางไซต์จะบล็อก ฉันเพิ่งขว้างมันที่นี่ดังนั้นในกรณีที่คุณพบปัญหาในเว็บไซต์อื่น ๆ ในตัวอย่างข้อมูลที่ฉันให้มันจะปรากฏเป็น Mozilla Firefox 6.02a

ในที่สุดคุณก็มีเว็บไซต์: https://www.tumblr.com


1
ฉันลองสิ่งนี้ไม่ได้รับไฟล์ JS หรือ CSS หรือไฟล์ภาพใด ๆ ใช่มั้ย

หากคุณใช้งานบน tumblr (ตัวอย่างของคุณด้านบน) คุณอาจต้องระบุ --no-check-certificate

ฉันคิดว่าคุณพูดถูกต้องมันอาจต้องใช้ตัวเลือกนั้น ยังไม่มีอะไรยกเว้น index.html อย่างไรก็ตาม มีบางอย่างขาดหายไป ...

@LanaMiller ฉันอัปเดตคำตอบของฉัน แจ้งให้เราทราบหากมีปัญหาใด ๆ

คุณไม่สามารถทำอะไรเช่น -exclude-domains! = tumblr.com ได้หรือไม่?
alpha1

3

สำหรับเว็บไซต์เฉพาะที่คุณพูดถึงและอื่น ๆ อีกมากมายที่เขียนโค้ดเหมือนมัน wget (และ curl) ก็ไม่ทำงาน ปัญหาคือการเชื่อมโยงเนื้อหาบางส่วนที่จำเป็นในการแสดงผลหน้าเว็บในเบราว์เซอร์นั้นสร้างขึ้นเองผ่านทางจาวาสคริปต์ Wget มีคำขอคุณลักษณะที่ค้างอยู่เพื่อเรียกใช้จาวาสคริปต์:

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

อย่างไรก็ตามจนกว่าจะเสร็จสมบูรณ์เว็บไซต์ที่สร้างการเชื่อมโยงสินทรัพย์โดยใช้จาวาสคริปต์จะไม่สามารถโคลนได้โดยใช้ wget ทางออกที่ง่ายที่สุดคือการค้นหาเครื่องมือที่สร้าง DOM และ javascript ในการแยกวิเคราะห์เหมือนเครื่องมือเบราว์เซอร์ (เช่นวิธี firefox ที่คุณกล่าวถึง)


1

คุณยังสามารถทำสิ่งนี้โดยอัตโนมัติ (หรือโดยทางโปรแกรมถ้าคุณทำโค้ด) โดยการออกคำสั่งผ่านเชลล์โดยใช้ wget:

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

มันจะดาวน์โหลดหน้าและไฟล์ภายในและทำให้การเชื่อมโยงท้องถิ่น


1
นี้จะได้รับทุกอย่าง อ่านคำถาม
evgeny

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

ฉันคิดว่ามันจะคว้าทุกอย่าง แต่ให้ยิงและค้นหา


1
มันได้ทุกอย่างที่มากเกินไป จนถึงตอนนี้โซลูชันของ FireFox ที่ฉันพบคือทางออกที่ดีที่สุด มันได้รับสิ่งที่คุณต้องการและไม่มีอะไรเพิ่มเติม

-1

$ ( ผู้ชาย wget ):

-p

--page-requisites

ตัวเลือกนี้ทำให้ Wget ดาวน์โหลดไฟล์ทั้งหมดที่จำเป็นในการแสดงหน้า HTML ที่ถูกต้อง ซึ่งรวมถึงสิ่งต่าง ๆ เช่นรูปภาพอินไลน์เสียงและสไตล์ชีตที่อ้างอิง

โดยปกติเมื่อดาวน์โหลดหน้า HTML หน้าเดียวเอกสารที่จำเป็นใด ๆ ที่อาจจำเป็นต้องแสดงอย่างถูกต้องจะไม่ถูกดาวน์โหลด การใช้ -r พร้อมกับ -l สามารถช่วยได้ แต่เนื่องจาก Wget ไม่ได้แยกความแตกต่างระหว่างเอกสารภายนอกและเอกสารอินไลน์โดยทั่วไปหนึ่งเอกสารจะเหลือด้วย '' เอกสารใบ '' ที่ไม่มีสิ่งที่ต้องทำ

ตัวอย่างเช่นสมมติว่าเอกสาร 1.html มีแท็ก "<IMG>" อ้างอิงถึง 1.gif และแท็ก "<A>" ที่ชี้ไปที่เอกสารภายนอก 2.html สมมติว่า 2.html คล้ายกัน แต่ภาพนั้นเป็น 2.gif และเชื่อมโยงกับ 3.html สมมติว่าสิ่งนี้ดำเนินต่อไปจนถึงจำนวนที่สูงมาก

หากมีการดำเนินการคำสั่ง:

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

จากนั้นจะดาวน์โหลด 1.html, 1.gif, 2.html, 2.gif และ 3.html อย่างที่คุณเห็น 3.html นั้นไม่จำเป็นต้องมี 3.gif เพราะ Wget นั้นนับจำนวนการกระโดด (มากถึง 2) จาก 1.html เพื่อกำหนดตำแหน่งที่จะหยุดการเรียกซ้ำ อย่างไรก็ตามด้วยคำสั่งนี้:

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

ไฟล์ทั้งหมดข้างต้นและ 3.html ข้อกำหนดเบื้องต้นของ 3.gif จะถูกดาวน์โหลด ในทำนองเดียวกัน

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

จะทำให้ดาวน์โหลด 1.html, 1.gif, 2.html และ 2.gif หนึ่งอาจคิดว่า:

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

จะดาวน์โหลดเพียง 1.html และ 1.gif แต่น่าเสียดายที่ไม่ใช่ในกรณีนี้เนื่องจาก -l 0 เทียบเท่ากับ -l inf --- นั่นคือการเรียกซ้ำแบบไม่สิ้นสุด ในการดาวน์โหลดหน้า HTML หนึ่งหน้า (หรือหยิบขึ้นมาหนึ่งหน้าเพจทั้งหมดที่ระบุไว้ในบรรทัดคำสั่งหรือในไฟล์อินพุต URL -i) และสิ่งที่จำเป็น (หรือ) ของหน้าเว็บเหล่านั้นทำได้โดยไม่ต้องปิด -r และ -l:

wget -p http: // <site> /1.html

โปรดทราบว่า Wget จะทำงานเหมือนว่าได้ระบุ -r ไว้แล้ว แต่จะดาวน์โหลดเฉพาะหน้าเดียวและสิ่งที่ต้องการ ลิงค์จากหน้านั้นไปยังเอกสารภายนอกจะไม่ถูกติดตาม ที่จริงแล้วเพื่อดาวน์โหลดหน้าเดียวและข้อกำหนดทั้งหมดของมัน (แม้ว่าจะมีอยู่ในเว็บไซต์ที่แยกต่างหาก) และตรวจสอบให้แน่ใจว่าล็อตนั้นแสดงขึ้นอย่างถูกต้องในพื้นที่ผู้เขียนคนนี้ชอบใช้ตัวเลือกเพิ่มเติมนอกเหนือจาก -p:

wget -E -H -k -K -p http: // <site> / <document & gt ;

หากต้องการจบหัวข้อนี้การรู้ว่าแนวคิดของ Wget เกี่ยวกับลิงก์เอกสารภายนอกนั้นเป็น URL ใด ๆ ที่ระบุในแท็ก "<A>", แท็ก "<AREA>" หรือแท็ก "<LINK>" อื่นที่ไม่ใช่ "< LINK REL = "สไตล์ชีท"> "


2
ส่วนใดของสิ่งนี้ที่คุณคิดว่าคล้ายกับโซลูชัน เพราะฉันพยายามอ่านเนื้อหาของ man page และฉันไม่เห็นวิธีแก้ไขที่ถูกต้องที่นี่ คุณลองทำสิ่งนี้ด้วยตัวเองหรือไม่? คุณคิดว่าคำสั่งนั้นตอบคำถามโดยเฉพาะ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.