Paralel çözüm var mı? Sadece indirmek için fping gibi bir şey mi?


15

Ben sadece puf (Paralel URL getirici) buldum ama bir dosyadan url okumak için alamadım; gibi bir şey

 puf < urls.txt

de çalışmıyor.

Sunucuda kurulu işletim sistemi Ubuntu'dur.


Bu Python ve pycurl kütüphanesi ve bir senaryoda biraz tutkal mantığı ile yapılabilir. Ama bunun için bir "konserve" aracı bilmiyorum.
Keith

@ Keith Bu yaklaşım, urllib ile uyumlu olarak bazı asenkron kütüphaneleri kullanmaktan daha mı iyi?
Moonwalker

urllib zaman uyumsuz olarak kullanılmak üzere tasarlanmamıştır. Libcurl kendi asenkron döngüsüne sahiptir ve "çoklu" arayüz kullanılarak en az 1000 eşzamanlı getirme yapacak şekilde ayarlanabilir.
Keith

@Keith Cevabınızı en çok beğeniyorum, bu yüzden gerekli krediyi almak için "gerçek" bir cevap olarak yazabilir misiniz?
Moonwalker

Yanıtlar:


25

GNU Paralel'i kullanma ,

$ parallel -j $ {jobs} wget <urls.txt

ya da xargsgelen GNU Findutils ,

$ xargs -n 1 -P $ {jobs} wget <urls.txt

nerede ${jobs}maksimum sayısı olan wget, aynı anda çalışmasına izin vermek istediğiniz (ayarı -niçin 1bir tane alacak kadar wgetsatıra çağırma içinde urls.txt). -j/ Olmadan -P, parallelaynı anda CPU çekirdeği kadar çok sayıda iş çalıştıracaktır (bu, wgetağ G / Ç'si tarafından bağlanması zorunlu değildir ) ve xargsbirer birer çalışacaktır.

Güzel bir özellik parallelüzerinde olan xargseş zamanlı çalışan işlerin çıkışını tutuyor ayrılmış, ancak bu konuda umursamazsak, xargsönceden yüklenmiş olması daha olasıdır.


Optimal jobsbirçok faktöre bağlıdır: yol gecikmesi, yol bant genişliği, uzak sunucu politikaları, vb.
dhchdhd 18:17


2

Bunu Python ve pycurl kütüphanesini kullanarak uygulayabilirsiniz. Pycurl kütüphanesi, birden fazla eşzamanlı bağlantıya izin veren kendi çift döngüsünü uygulayan "çoklu" arayüze sahiptir.

Ancak arayüz oldukça C-benzeri ve bu nedenle diğer "Pythonic" koduna göre biraz hantal.

Bunun için daha eksiksiz bir tarayıcı benzeri istemci oluşturan bir sarmalayıcı yazdım. Bunu örnek olarak kullanabilirsiniz. Bkz. Pycopia.WWW.client modülü. HTTPConnectionManager çoklu arayüzü sarar.


2

Bu, uygun ayarlarla çalışır ve yerel veya uzak DoS olmaz:

(bandwidth=5000 jobs=8; \
 parallel      \
   --round     \
   -P $jobs    \
   --nice +5   \
   --delay 2   \
   --pipepart  \
   --cat       \
   -a urls.txt \
     wget                                \
       --limit-rate=$((bandwidth/jobs))k \
       -w 1                              \
       -nv                               \
       -i {}                             \
)

1

GNU Parallel'in kılavuz sayfasının bir kısmı, paralel bir yinelemeli wget örneğini içerir.

https://www.gnu.org/software/parallel/man.html#EXAMPLE:-Breadth-first-parallel-web-crawler-mirrorer

HTML iki kez indirilir: Bir kez linkleri çıkarmak için ve bir kez diske indirmek için. Diğer içerik yalnızca bir kez indirilir.

Özyinelemeye ihtiyacınız yoksa ephemient'in cevabı açık görünüyor.


Sadece geç FYI herhangi bir paralel artı wget "çözüm" her ikisi de doğal olarak verimsiz çünkü iki aşamalı indirme gerektirir , tüm çok fazlı indirme nedeniyle yavaş ve aynı zamanda tüm bant genişliği israf için ödemek zorunda olan sysops için hoş değil çünkü verimli bir çözüm kullanmayın.
dhchdhd

0

Paralell indirmenizin kurbanları eğlendirilmeyecek: her bir müşteriye bir bağlantının sunulmasını bekliyorlar, birkaç bağlantı kurmak genel olarak daha az istemci anlamına geliyor. (Yani, bu kaba davranış olarak kabul edilir).


1
Ancak farklı sunuculardan dosya indiriyor olabilir, bu yüzden geçerli olmaz.
Renan

@Vonbrand'ın söylediklerinin yanı sıra, "Çok fazla bağlantı" gibi bir şey alabilir ve tüm dosyaları indiremezsiniz. Ve biraz daha yavaş olabilir (örneğin, birkaç HTTP bağlantısı oluşturmaya kıyasla bir HTTP bağlantısını yeniden kullanma)
golimar

2
Aklı başında tuttuğunuz sürece, bu çok önemli değil. Örneğin, bunu yazdığınız sırada, Firefox kalıcı bağlantılar kullanmadığınızda sunucu başına 15 bağlantı kullanıyordu (o zamandan beri sadece sunucu başına 6 ile sınırlı olan kalıcı bağlantıları denemeye geçtiler). Diğer tarayıcılar benzer numaralar kullanır.
derobert
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.