unduh hanya beberapa byte pertama dari halaman sumber


9

Saya mengunduh halaman sumber HTML situs web menggunakan cURLperintah. Masalahnya adalah, saya tidak ingin sebagian besar konten di halaman. Saya hanya perlu 100 baris pertama dari halaman sumber. Apakah ada cara untuk menghentikan pengunduhan halaman setelah beberapa baris pertama?

Saat ini, saya memiliki perintah di bawah ini yang bekerja tetapi sepertinya tidak efektif waktu.

curl -r[0-1] "http://www.freebase.com/m/045c7b" > foo.txt

Saya mencoba mengubah nilai dari 1menjadi .5dan .05dan masih seluruh halaman web diunduh.

Saya melihat waktu kurang dari satu detik untuk menjalankan perintah di atas.

EDIT

Dari halaman manual cURL, saya melihat bahwa " Anda juga harus menyadari bahwa banyak server HTTP / 1.1 tidak mengaktifkan fitur ini, sehingga ketika Anda mencoba untuk mendapatkan jangkauan, Anda akan mendapatkan seluruh dokumen. " Jadi jika server tidak mendukung kisaran kueri, apakah ada perintah lain di nixlingkungan yang akan membantu saya menyelesaikan apa yang saya coba lakukan?

Jawaban:


6

Anda dapat menggunakan headdan -sberalih ke curluntuk mengunduh sebagian halaman. Cukup beri tahu headberapa garis output yang Anda inginkan.

Contoh

$ curl -r[0-1] "http://www.freebase.com/m/045c7b" -s 2>&1 | head -10
Warning: Invalid character is found in given range. A specified range MUST 
Warning: have only digits in 'start'-'stop'. The server's response to this 
Warning: request is uncertain.


  <!DOCTYPE html PUBLIC "null" "null">
  <html class="no-js" dir="ltr" lang="en">
    <head>
      <meta charset="utf-8">
      <title>

Detail

  • The -10untuk headakan kembali 10 baris dan kemudian berhenti. Jika Anda menginginkan lebih dari itu ubahlah sesuai dengan kebutuhan Anda.
  • The -sberalih ke curlmengatakan itu untuk diam sehingga tidak akan menampilkan progress bar saat download.

1
Masih perlu waktu cukup lama untuk mengunduh konten. Saya mengharapkan rentang waktu dalam mili detik untuk ini terjadi.
Ramesh

@ Ramesh - ya saya perhatikan itu agak lambat juga. Tampaknya perlu waktu agar server membalas.
slm

@Ramesh - daripada pergi di situs menggunakan curl Anda mungkin ingin melihat API: developers.google.com/freebase
slm

Hmmm, menarik. Teman saya menyarankan bahwa di Jawa jika dia menggunakan freebase API, butuh 300 MS untuk mengunduh data. Saya mengatakan kepadanya bahwa ini dapat dikurangi dengan menggunakan shell script. Tampaknya masalah dengan server daripada perintah shell.
Ramesh

@ Ramesh - Ya kelambatan dalam hal ini ada dalam permintaan basis data dan persiapan data tersebut menjadi respons. Jika database mengekspos data dalam format lain seperti JSON maka Anda dapat mempercepat respons dengan memanfaatkan itu alih-alih mengambil output sebagai HTTP. Ada overhead dalam menyiapkan respon sebagai HTTP yang sia-sia jika pengguna akhir tidak akan menjadi manusia yang membaca hasilnya.
slm

1

Saya belum benar-benar menguji aplikasi khusus ini, tetapi ada sesuatu yang memberitahu saya bahwa Anda dapat memasangkan dd dan nc di sini:

$ nc www.website.com 80 <<GOT | dd bs=$BYTE_COUNT iflag=fullblock \
     count=1 of=$OUTFILE
GET / HTTP/1.1
Host: ispconfig.org
Referrer: mypage.com
User-Agent: my-browser
$(printf %b '\r\r')
GOT

Netcat ( nc) mungkin memerlukan konfigurasi lebih lanjut untuk mendapatkan tajuk permintaan dengan benar, tetapi jika itu adalah situs publik, Anda harus dapat meyakinkan hasil yang bermanfaat jika Anda cukup peduli untuk mencoba. Tentu saja dd hanya akan mengambil input sebanyak yang Anda tentukan dan keluar, yang akan SIGPIPE netcat sehingga akan segera mengikutinya. Satu-satunya trik nyata adalah menyetrika jabat tangan awal - setelah Anda memulai aliran, Anda dapat menjatuhkannya kapan pun Anda mau.

EDIT

Membaca komentar slm telah mendorong saya untuk mendukung gerakan itu; jika Anda bisa membuat serial JSON POST dalam format yang benar, itu pasti cara untuk mendapatkan respons yang lebih tepat waktu. Parsing HTML adalah untuk burung.

Salah satu trik yang berguna untuk itu adalah untuk menangkap aliran jaringan Anda saat berkomunikasi dengan server di browser Anda, kemudian ketika browser Anda mengirim POST yang memberi Anda apa yang ingin Anda kirim lagi sebagai GET dan lihat hasilnya.


1

The headPerintah biasanya akan menghentikan download sebelum berakhir (meskipun untuk file pendek itu dapat mengisi pipa penyangga sebelum pipa ditutup). Ini karena ketika pipa ditutup, curltidak punya tempat untuk menulis (deskriptor file ditutup, tulis gagal).

Namun, dalam pengalaman saya, hal terpanjang saat mengunduh menunggu permintaan DNS (menyakitkan ketika Anda mengunduh ratusan file secara berurutan). Ini dapat dibantu dengan cache DNS lokal seperti dnsmasqatau, jika Anda menggunakan nama domain yang sama berkali-kali dengan struktur direktori yang berbeda, cukup atasi saja ke IP satu kali dan lakukan penggantian pada URL.

Untuk membuktikan maksud saya ... coba time netstatversus time netstat -n(tanpa cache perbedaannya dramatis, dengan cache, itu hanya buruk pertama kali, maka ia ingat).

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.