วิธีรับ WGET เพื่อดาวน์โหลด html ของหน้าเว็บเดียวกับเบราว์เซอร์


34

การใช้เว็บเบราว์เซอร์ (IE หรือ Chrome) ฉันสามารถบันทึกเว็บเพจ (.html) ด้วย Ctl-S ตรวจสอบด้วยโปรแกรมแก้ไขข้อความและดูข้อมูลในรูปแบบตาราง หนึ่งในตัวเลขเหล่านั้นที่ฉันต้องการแยกออกมา แต่สำหรับหลาย ๆ หน้าเว็บหลายแห่งที่ทำด้วยตนเอง ดังนั้นฉันต้องการใช้ WGET เพื่อรับหน้าเว็บเหล่านั้นทีละรายการและเขียนโปรแกรมอื่นเพื่อแยกวิเคราะห์. html และดึงหมายเลขที่ฉันต้องการ แต่ไฟล์. html ที่บันทึกโดย WGET เมื่อใช้ URL เดียวกันกับเบราว์เซอร์ไม่มีตารางข้อมูล ทำไมไม่ มันเหมือนกับว่าเซิร์ฟเวอร์ตรวจพบการร้องขอมาจาก WGET ไม่ใช่จากเว็บเบราว์เซอร์และหน้าเว็บโครงกระดูกที่ขาดตารางข้อมูล ฉันจะรับหน้าเว็บเดียวกันกับ WGET ได้อย่างไร - ขอบคุณ!

ข้อมูลเพิ่มเติม:

ตัวอย่างของ URL ที่ฉันพยายามดึงข้อมูลคือ: http://performance.morningstar.com/fund/performance-return.action?t=ICENX®ion=usa&culture=th- ที่สตริง ICENX เป็นสัญลักษณ์ของกองทุนรวม ซึ่งฉันจะเปลี่ยนเป็นสัญลักษณ์ที่แตกต่างกันจำนวนหนึ่ง สิ่งนี้จะดาวน์โหลดสารบัญเมื่อดูในเบราว์เซอร์ แต่ตารางข้อมูลจะหายไปหากดึงข้อมูลด้วย WGET


URL ไหน
Braiam

2
เป็นไปได้ว่า HTML เริ่มต้นจะถูกเติมด้วยการใช้เทคนิค AJAX โดย javascript fragment ที่ดาวน์โหลดและเติมข้อมูลลงในตาราง ในกรณีนี้คุณอาจโชคดีกว่าที่ได้ลองโทรหาสคริปต์นี้ เช่นเดียวกับ Braiam ถามว่าหากคุณระบุ URL เราอาจช่วยให้เข้าใจได้ดีขึ้น
roadmr

1
โฆษณาข้อมูลเพิ่มเติม: ในเบราว์เซอร์เมื่อคุณแสดงซอร์สโค้ดคุณจะไม่เห็น HTML ดั้งเดิม (เหมือนกับที่ได้รับจาก wget) แต่ HTML จะถูกอัปเดตโดย javascript / ajax เบราว์เซอร์สมัยใหม่แสดงแหล่งที่มาที่สร้างขึ้นแทน HTML ธรรมดา
Vrata Blazek

คำตอบ:


39

ตามที่ระบุไว้roadmrตารางในหน้านี้ถูกสร้างขึ้นโดย javascript wget ไม่รองรับจาวาสคริปต์มันแค่ทิ้งหน้าเว็บที่ได้รับจากเซิร์ฟเวอร์ (เช่นก่อนที่จะรันโค้ดจาวาสคริปต์ใด ๆ ) ดังนั้นตารางจะหายไป

คุณต้องมีเบราว์เซอร์ที่ไม่มีส่วนหัวที่รองรับจาวาสคริปต์เช่นphantomjs :

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

ด้วย save_page.js:

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

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

จากนั้นหากคุณต้องการแยกข้อความบางส่วนวิธีที่ง่ายที่สุดคือการแสดงหน้าด้วย w3m:

$ w3m -dump page.html

และ / หรือแก้ไขสคริปต์ phantomjs เพื่อทิ้งสิ่งที่คุณสนใจ


สิ่งนี้ยังใช้งานไม่ได้เช่นcotrino.com/lifespan
mrgloom

JS สร้างลิงค์จะไม่ทำงานกับมัน
QkiZ

1
2018: โครงการ PhantomJS ถูกระงับจนกว่าจะมีการแจ้งเตือนเพิ่มเติม :(
1rq3fea324wre

โซลูชันนี้ใช้สำหรับดาวน์โหลดหน้าเว็บจาก URL ที่ระบุเท่านั้น คุณจะใช้กลไกการรวบรวมข้อมูลของเว็บไซต์ได้อย่างไร นอกจากนี้สคริปต์จะมีลักษณะอย่างไรกับโครเมี่ยมที่ไม่มีหัว
Phil

10

คุณสามารถดาวน์โหลดเว็บไซต์แบบเต็มโดยใช้ wget --mirror

ตัวอย่าง:

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

บรรทัดคำสั่งด้านบนที่คุณต้องการดำเนินการเมื่อคุณต้องการดาวน์โหลดเว็บไซต์แบบเต็มและทำให้พร้อมใช้งานสำหรับการดูในเครื่อง

ตัวเลือก:

  • --mirror เปิดตัวเลือกที่เหมาะสมสำหรับการมิเรอร์

  • -p ดาวน์โหลดไฟล์ทั้งหมดที่จำเป็นในการแสดงหน้า HTML ที่ถูกต้อง

  • --convert-links หลังจากดาวน์โหลดแล้วให้แปลงลิงก์ในเอกสารสำหรับการดูในเครื่อง

  • -P ./LOCAL-DIR บันทึกไฟล์และไดเรกทอรีทั้งหมดไปยังไดเรกทอรีที่ระบุ

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือก Wget อ่านบทความนี้: ภาพรวมเกี่ยวกับ wget คำสั่งทั้งหมดที่มีตัวอย่างหรือเช็คหน้าคน Wget ของ


2
สิ่งนี้จะไม่ทำงานกับเนื้อหาที่แสดงผลจาวาสคริปต์ เพื่อที่คุณจะต้องใช้ phantomjs ตามที่ตอบโดย lemonsqueeze
Mattias

1
cmd นี้จะดำเนินการผ่าน URL ย่อยทั้งหมดด้วยซึ่งจะดาวน์โหลดทรัพยากรที่ไม่จำเป็นในการแสดงผลหน้าเว็บที่กำหนด
1rq3fea324wre

3

แทนการ--recursiveที่เพิ่งจะไปข้างหน้าและ "แมงมุม" การเชื่อมโยงทุกเดียวใน URL --page-requisitesของคุณใช้ ควรทำงานเหมือนกับตัวเลือกที่คุณอธิบายในเบราว์เซอร์กราฟิก

       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.

สำหรับข้อมูลเพิ่มเติมให้ทำman wgetและค้นหา--page-requisitesตัวเลือก (ใช้ "/" เพื่อค้นหาในขณะที่อ่านหน้าคน)


2

หากคำตอบของเซิร์ฟเวอร์แตกต่างกันไปขึ้นอยู่กับแหล่งที่มาขอส่วนใหญ่เป็นเพราะตัวแปร HTTP_USER_AGENT (เพียงสตริงข้อความ) ที่ให้มาพร้อมกับการร้องขอจากแหล่งที่ถามถามเซิร์ฟเวอร์เกี่ยวกับเทคโนโลยี


  1. คุณสามารถตรวจสอบตัวแทนเบราว์เซอร์ของคุณที่นี่ -> http://whatsmyuseragent.com

  2. ตามคู่มือ wget --user-agent=AGENTพารามิเตอร์นี้ควรทำงาน


หากวิธีนี้ไม่ได้ผลเช่นอาจจำเป็นต้องมีการประมวลผล JavaScript เพื่อให้ได้หน้าเดียวกับเบราว์เซอร์หรืออาจร้องขอที่เหมาะสมกับพารามิเตอร์ GET ดังนั้นเซิร์ฟเวอร์จะจัดเตรียมคำตอบที่ไม่ต้องใช้ JavaScript เพื่อเติมหน้าเว็บ

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