kaynak sayfanın yalnızca ilk birkaç baytını indir


9

cURLKomut kullanarak bir web sitesinin HTML kaynak sayfasını indiriyorum. Sorun şu ki, sayfadaki içeriğin çoğunu istemiyorum. Sadece kaynak sayfanın ilk 100 satırına ihtiyacım var. İlk birkaç satırdan sonra sayfanın indirilmesini durdurmanın bir yolu var mı?

Şu anda, aşağıdaki komut çalışma var ama zaman etkili gibi görünmüyor.

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

Ben gelen değerini değiştirerek çalıştı 1etmek .5ve .05hala tüm web sayfası indirilen elde.

Yukarıdaki komutu yürütmek için bir saniyeden az zamanda bakıyorum.

DÜZENLE

Man sayfasında, cURL" Pek çok HTTP / 1.1 sunucusunda bu özelliğin etkinleştirilmediğinin farkında olmalısınız, böylece bir aralık elde etmeye çalıştığınızda bunun yerine tüm belgeyi alırsınız. " sunucu aralık sorgulamayı desteklemiyor, nixçevrede ne yapmaya çalıştığımı başarmama yardımcı olacak başka bir komut var mı?

Yanıtlar:


6

Sayfanın bir bölümünü indirmek için headve -stuşunu kullanabilirsiniz curl. Sadece headkaç satır çıktı istediğinizi söyleyin .

Misal

$ 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>

ayrıntılar

  • -10İçin head10 satır dönmek ve sonra durur. Daha fazlasını istiyorsanız, ihtiyaçlarınıza göre değiştirin.
  • Geçiş -sanahtarı, curlsessiz olduğunu söyler, böylece indirme sırasında ilerleme çubuğunu görüntülemez.

1
İçeriği indirmek hala çok zaman alıyor. Bunun gerçekleşmesi için mili saniye cinsinden bir zaman aralığı bekliyordum.
Ramesh

@Ramesh - evet ben de oldukça yavaş olduğunu fark ettim. Sunucunun yanıt vermesi biraz zaman alıyor gibi görünüyor.
slm

@Ramesh - daha sonra siteye API'yı incelemek isteyebileceğiniz kıvrımı kullanarak gidin: developers.google.com/freebase
slm

Hmmm, ilginç. Arkadaşım Java'da freebase API kullandıysa, verileri indirmek için 300 MS aldığını öne sürüyordu. Ona kabuk komut dosyası kullanarak önemli ölçüde azaltılabileceğini söyledim. Kabuk komutları yerine sunucuda bir sorun var gibi görünüyor.
Ramesh

@Ramesh - Evet, bu durumda yavaşlık veritabanı sorgusundadır ve bu verilerin bir yanıta hazırlanmasıdır. Veritabanı, verileri JSON gibi diğer biçimlerde ortaya koyarsa, çıktıyı HTTP olarak almak yerine bunu kullanarak yanıtı hızlandırabilirsiniz. Son kullanıcı dosyası sonuçları okuyan bir insan olmayacaksa, yanıtı HTTP olarak hazırlamanın ek yükü vardır.
slm

1

Bu uygulamayı henüz gerçekten test etmedim, ama bir şey bana burada dd ve nc'yi eşleştirebileceğinizi söylüyor:

$ 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), istek üstbilgilerini doğru bir şekilde almak için daha fazla yapılandırma gerektirebilir, ancak herkese açık bir site ise, denemek için yeterince dikkatli olmanız durumunda yararlı bir çıktı elde edebilmeniz gerekir. Kesinlikle dd sadece belirttiğiniz ve bıraktığınız kadar girdi alacaktır, bu da SIGPIPE netcat'i derhal takip edecektir. Tek gerçek hile ilk el sıkışmasını ütülemek - akışı başlattığınızda istediğiniz zaman bırakabilirsiniz.

DÜZENLE

Slm'nin yorumlarını okumak beni bu hareketi ikinciye itti; bir JSON POST'u doğru biçimde serileştirebiliyorsanız, daha zamanında yanıt almak için kesinlikle yol budur. HTML'yi ayrıştırmak yine de kuşlar içindir.

Bu amaçla yararlı bir hile, tarayıcınızdaki sunucuyla iletişim kurarken ağ akışınızı yakalamaktır, daha sonra tarayıcınız size istediğiniz şeyi sağlayan POST'u gönderdiğinde bunun yerine tekrar GET olarak gönderin ve sonuçlara bakın.


1

headBiter önce (boru kapatılmadan önce kısa dosyalar için boru tampon doldurabilir rağmen) komutu genellikle indir duracaktır. Bunun nedeni, bir boru kapandığında, curlyazılacak hiçbir yerin olmadığıdır (dosya tanımlayıcı kapalı, yazma başarısız olur).

Ancak, tecrübelerime göre, indirirken en uzun şey DNS isteklerini bekliyor (sırayla yüzlerce dosyayı indirirken acı verici). Bunun gibi yerel bir DNS önbelleği ile yardımcı olabilir dnsmasqveya aynı dizin adını farklı dizin yapısıyla birçok kez kullanıyorsanız, bir kez bir IP'ye çözün ve URL'de bir değişiklik yapın.

Demek istediğimi kanıtlamak için ... time netstatkarşı deneyin time netstat -n(önbellek olmadan fark dramatik, önbellek ile sadece ilk kez kötü, o zaman hatırlar).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.