Bir dizini indirmek için CURL


35

CURL kullanarak tam bir web sitesi dizini indirmeye çalışıyorum. Aşağıdaki komut çalışmıyor:

curl -LO http://example.com/

Bu hata verir: curl: Remote file name has no length!.

Ama bunu yaptığımda: curl -LO http://example.com/someFile.typeişe yarıyor. Belirtilen dizindeki tüm dosyaları nasıl indirebileceğiniz hakkında bir fikrin var mı? Teşekkürler.

Yanıtlar:


33

HTTP'de gerçekten bir dizin kavramı yoktur. İlk üç ( http://example.com/) dışındaki eğik çizgilerin ..göreceli URL’lerde belirtilenler dışında özel bir anlamı yoktur . Dolayısıyla, sunucu belirli bir formatta yoksa, “tüm dosyaları belirtilen dizinde indirmenin” yolu yoktur.

Sitenin tamamını indirmek istiyorsanız, en iyi tercihiniz ana sayfadaki tüm bağlantıları tekrarlı bir şekilde geçmek. Curl yapamaz, ama wget yapabilir. Web sitesi çok dinamik değilse bu işe yarar (özellikle, wget Javascript koduyla oluşturulan bağlantıları görmez). İle başlayın wget -r http://example.com/ve daha alakalı seçenekler (özyineleme derinliği, hariç tutma listeleri vb.) İçin wget el kitabındaki “Özyinelemeli Alma Seçenekleri” ve “Özyinelemeli Kabul Et / Reddet Seçenekleri” kısmına bakın.

Web sitesi otomatik indirmeleri engellemeye çalışırsa, kullanıcı aracısı dizesini ( -U Mozilla) değiştirmeniz ve görmezden gelmeniz robots.txt(boş bir dosya oluşturup wget'ın sunucudan indirmeyi denememesi için seçeneği example.com/robots.txtkullanmanız gerekebilir -nc).


Wget nasıl yapabiliyor? ??
Srikan

@Srikan wget, içerdiği bağlantıları bulmak için HTML'yi ayrıştırır ve bu bağlantıları yinelemeli olarak indirir (bir seçim).
Gilles,

Dosyaların dahili bağlantıları yoksa, özyinelemeli indirme tüm dosyaları alamadı. Diyelim ki bazı txt dosyalarının bir HTTP klasörü var. Tüm dosyaları almak için başarılı olur wget. Bu yorumdan sonra
deneyeyim

@Srikan HTTP'de dizin kavramı yoktur. Özyinelemeli indirme, web sayfalarındaki bağlantıları ( web sunucusu bunu yaparsa, bir dizin listesini göstermek için sunucu tarafından oluşturulan web sayfaları dahil) anlamına gelir .
Gilles

wget, bayrakla robots.txt dosyasının yok sayılmasını destekler -e robots=off. Alternatif olarak, reddederek indirmekten kaçınabilirsiniz -R "robots.txt".
Ryan Krage

30

Her zaman benim için çalışır, ebeveyn dahil değil ve yalnızca istenen dizini elde etmek için özyinelemeli.

 wget --no-parent -r http://WEBSITE.com/DIRECTORY

1
Bu kabul edilen cevap olmalı.
Juan Jimenez

15

Bu durumda, curlen iyi araç DEĞİLDİR. Bu gibi argüman wgetile kullanabilirsiniz -r:

wget -r http://example.com/ 

Bu en temel formdur ve siz de ek argümanlar kullanabilirsiniz. Daha fazla bilgi için, bkz. manpage( man wget).


5

Bu mümkün değil. Bir web sunucusunun bir dizinin içeriğini size geri döndürmesi için standart, genel olarak uygulanmış bir yöntem yoktur. Çoğu sunucu, eğer yapılandırılmışsa bir dizinin HTML dizinini oluşturur, ancak bu çıktı standart değildir ve hiçbir şekilde garanti edilemez. Bu HTML'yi ayrıştırabilirsiniz, ancak biçimin sunucudan sunucuya değişeceğini ve her zaman etkinleştirilmeyeceğini unutmayın.


Site Sucker adlı bu uygulamaya bakın. sitesucker.us . Nasıl yapıyorlar?
Foo

HTML dosyasını ayrıştırır ve içindeki her linki indirirler.
Brad

Kullanımı wgetya curl?
Foo

7
@ Brad: curl HTML'yi ayrıştırmaz, ancak wget tam olarak bunu yapar (özyinelemeli alma olarak adlandırılır).
Gilles

1
Ah, ben düzeltilmiş duruyorum! gnu.org/software/wget/manual/html_node/… OP, bunun hala aradığı şeyi elde edemediğinin farkında olmalı ... sadece iade edilen sayfalarda mevcut olan bağlantıları takip ediyor.
Brad,

2

Firefox eklentisini DownThemAll! Tek bir tıklamayla bir dizindeki tüm dosyaları indirmenize izin verir. Aynı zamanda özelleştirilebilir ve hangi dosya türlerinin indirileceğini belirleyebilirsiniz. Bulduğum en kolay yol bu.


0

Burada bir web sitesi yırtıcısı için bir kullanım bulabilirsiniz, bu her şeyi indirecek ve yerel kullanım için içerikleri / dahili bağlantıları değiştirecektir. Burada iyi bir tane bulunabilir: http://www.httrack.com

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.