Cara mendapatkan WGET untuk mengunduh html laman web yang sama persis dengan peramban

34

Menggunakan browser web (IE atau Chrome) saya dapat menyimpan halaman web (.html) dengan Ctl-S, memeriksanya dengan editor teks apa pun, dan melihat data dalam format tabel. Salah satu angka yang ingin saya ekstrak, tetapi bagi banyak, banyak halaman web, terlalu banyak untuk dilakukan secara manual. Jadi saya ingin menggunakan WGET untuk mendapatkan halaman web tersebut satu demi satu, dan menulis program lain untuk mem-parsing .html dan mengambil nomor yang saya inginkan. Tetapi file .html disimpan oleh WGET saat menggunakan URL yang sama dengan browser tidak berisi tabel data. Kenapa tidak? Seolah-olah server mendeteksi permintaan datang dari WGET dan bukan dari browser web, dan memasok halaman web kerangka, kurang tabel data. Bagaimana saya bisa mendapatkan halaman web yang sama persis dengan WGET? - Terima kasih!

INFO LEBIH LANJUT:

Contoh URL yang saya coba ambil adalah: http://performance.morningstar.com/fund/performance-return.action?t=ICENX®ion=usa&culture=en-US di mana string ICENX adalah simbol ticker reksa dana reksa dana , yang akan saya ubah menjadi salah satu dari sejumlah simbol ticker yang berbeda. Ini mengunduh tabel data ketika dilihat di browser, tetapi tabel data tidak ada jika diambil dengan WGET.

pengguna239598
sumber
Url yang mana?
Braiam
2
Kemungkinan besar HTML awal diisi menggunakan teknik AJAX oleh fragmen javascript yang mengunduh dan mengisi tabel. Dalam hal ini Anda mungkin akan lebih beruntung jika menerima panggilan ke skrip ini. Seperti yang diminta Braiam, jika Anda memberikan URL, kami mungkin lebih bisa membantu memecahkan masalah ini.
roadmr
1
ad More Info: Di browser, ketika Anda menampilkan kode sumber, Anda tidak melihat HTML asli (sama seperti yang didapat oleh wget) tetapi HTML diperbarui oleh javascript / ajax. Browser modern menunjukkan sumber yang dihasilkan seperti itu, bukan HTML biasa.
Vrata Blazek

Jawaban:

39

Seperti dicatat oleh roadmr , tabel pada halaman ini dihasilkan oleh javascript. wget tidak mendukung javascript, itu hanya membuang halaman yang diterima dari server (yaitu sebelum kode javascript berjalan) dan karenanya tabel tersebut hilang.

Anda memerlukan peramban tanpa kepala yang mendukung javascript seperti phantomjs :

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

dengan save_page.js:

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

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

Maka jika Anda hanya ingin mengekstraksi beberapa teks, mungkin yang paling mudah adalah merender halaman dengan w3m:

$ w3m -dump page.html

dan / atau memodifikasi skrip phantomjs untuk hanya membuang apa yang Anda minati.

perasan lemon
sumber
Ini juga tidak berfungsi, misalnya cotrino.com/lifespan
mrgloom
Tautan yang dihasilkan JS tidak akan bekerja dengan itu
QkiZ
1
2018: Proyek PhantomJS ditangguhkan hingga pemberitahuan lebih lanjut :(
1rq3fea324wre
Solusi ini hanya untuk mengunduh halaman dari url yang ditentukan. Bagaimana Anda memasang mekanisme merangkak situs wget dengan itu? Selain itu, seperti apa script dengan chrome tanpa kepala?
Phil
10

Anda dapat mengunduh Menggunakan Situs Web Lengkap wget --mirror

Contoh:

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

Baris perintah di atas yang ingin Anda jalankan ketika Anda ingin mengunduh situs web lengkap dan tersedia untuk dilihat secara lokal.

Pilihan:

  • --mirror menyalakan opsi yang cocok untuk mirroring.

  • -p mengunduh semua file yang diperlukan untuk menampilkan halaman HTML yang diberikan dengan benar.

  • --convert-links setelah unduhan, konversikan tautan dalam dokumen untuk tampilan lokal.

  • -P ./LOCAL-DIR menyimpan semua file dan direktori ke direktori yang ditentukan.

Untuk Info lebih lanjut tentang Opsi Wget. Baca selengkapnya artikel ini: Tinjauan Umum Tentang semua Perintah wget dengan Contoh , atau periksa halaman manual Wget .

GowriShankar
sumber
2
Ini tidak akan berfungsi dengan konten yang dirender javascript. Untuk itu Anda harus menggunakan phantomjs seperti yang dijawab oleh lemonsqueeze.
Mattias
1
Cmd ini juga akan membahas semua sub-url, yang akan mengunduh sumber daya yang tidak diperlukan untuk merender halaman web yang diberikan.
1rq3fea324wre
3

Alih-alih --recursive, yang hanya akan melanjutkan dan "laba-laba" setiap tautan tunggal di URL Anda, gunakan --page-requisites. Seharusnya berperilaku persis seperti opsi yang Anda gambarkan di browser grafis.

       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.

Untuk informasi lebih lanjut, lakukan man wgetdan cari --page-requisitesopsi (gunakan "/" untuk mencari saat membaca halaman manual).

roadmr
sumber
2

Jika jawaban server berbeda tergantung pada sumber yang meminta, itu sebagian besar karena variabel HTTP_USER_AGENT (hanya string teks) yang disediakan dengan permintaan dari sumber yang bertanya, menginformasikan server tentang teknologi.


  1. Anda dapat memeriksa agen peramban Anda di sini -> http://whatsmyuseragent.com

  2. Menurut manual WGET, parameter ini harus melakukan pekerjaan --user-agent=AGENT.


Jika ini tidak membantu, yaitu pemrosesan JavaScript mungkin diperlukan untuk mendapatkan halaman yang sama dengan browser, atau mungkin permintaan yang sesuai dengan parameter GET sehingga server akan menyiapkan jawaban yang tidak memerlukan JavaScript untuk mengisi halaman.

Esamo
sumber