Schnelle Möglichkeit, viele kleine Webseiten herunterzuladen?

652
dandidondi

Ich muss viele kleine Seiten so schnell wie möglich herunterladen. Die durchschnittliche Größe für eine Seite beträgt 3 KB. Es gibt Millionen von Seiten. Zuerst habe ich es versucht, curlaber es war viel zu langsam, wahrscheinlich weil es darauf wartete, dass der Server eine Anfrage beantwortet, und dann den gleichen Prozess für die nächste Seite ausführt.

curl -O "http://website.com/pages/[0000001-1000000].html" 

Edit: Nach einigen Tests habe ich diese Ergebnisse beobachtet. Ich bin immer offen für weitere Vorschläge. Ich möchte die Geschwindigkeit noch weiter verbessern.

Vergleich 1: (dns vs. keine dns)

Langsamer:

curl -O "http://website.com/pages/[1-1000].html" -s -S 

schneller:

curl -O "http://90.111.123.222/pages/[1-1000].html" -s -S 

Wenn Sie viele kleine Seiten herunterladen, ist die Verzögerung von DNS kritisch.

Vergleich 2: (unter Verwendung der Curl-Sequenz vs. "seq")

Langsamer:

curl -O "http://90.111.123.222/pages/.html" -s -S ::: $(seq 1 1000) 

schneller:

curl -O "http://90.111.123.222/pages/[1-1000].html" -s -S 

Vergleich 3: (Parallelausführung)

Langsamer:

time parallel -j 5 curl -O \'"http://90.111.123.222/pages/.html"\' -S -s ::: $(seq 1 1000) 

schneller:

( time curl -O "http://90.111.123.222/pages/[1-200].html" -s -S & time curl -O "http://90.111.123.222/pages/[201-400].html" -s -S & time curl -O "http://90.111.123.222/pages/[401-600].html" -s -S & time curl -O "http://90.111.123.222/pages/[601-800].html" -s -S & time curl -O "http://90.111.123.222/pages/[801-1000].html" -s -S & ) 

Übrigens, offensichtlich werden mehr Instanzen ausgeführt, um die Geschwindigkeit für beide Methoden bis zu einem gewissen Punkt zu verbessern.

2
curl ist langsamer, da es das zu verwendende Protokoll handhabt, wget ist eine weitere Option, aber ich bin nicht sicher, ob es schneller verwendet wird. Francisco Tapia vor 9 Jahren 0
Ich denke, sowohl Curl als auch Wget werden langsam sein, wenn es keinen Weg gibt, sie parallel auszuführen. Als ich 5 Curl-Befehle in verschiedenen Bereichen gleichzeitig ausführte, stieg die Gesamtgeschwindigkeit auf 4-5x, war aber kein praktischer Weg. dandidondi vor 9 Jahren 0

2 Antworten auf die Frage

2
chui101

Sie beschleunigen dies, indem Sie Ihre Operation in mehrere kleinere Operationen unterteilen. Sie können beispielsweise 10 Curl-Prozesse erstellen und diese im Hintergrund anzeigen:

curl -O "http://website.com/pages/0[000000-999999].html" & curl -O "http://website.com/pages/1[000000-999999].html" & curl -O "http://website.com/pages/2[000000-999999].html" & ... 

und so weiter.

Die intelligentere und flexiblere Lösung möchte jedoch GNU parallel verwenden, sodass mehrere Dateien parallel heruntergeladen werden können und die Taskverteilung parallel gehandhabt wird.

Installiere es mit deinem Paketmanager deiner Wahl, dann wäre es einfach so

parallel -j 10 curl -O "http://website.com/pages/" ::: $(seq -w 1000000) 

das ist viel eleganter

Meine URLs enthalten das Zeichen "&" und verursachen Probleme bei der Verwendung von Parallel. Es funktioniert gut, wenn es ohne Parallele verwendet wird: `curl -O" http://website.com/page1.php?varx=1&vary=0 "` aber dieser liest nicht den Link nach "&": `parallel -j 10 curl -O "http://website.com/page.php?varx=1&vary=0" ::: $ (seq -w 1000000) ` dandidondi vor 9 Jahren 0
mit '' / `vor und nach dem Link wurde mein Problem gelöst:` parallel -j 10 curl -O '/ "http://website.com/page.php?varx=1&vary=0"'/ :: : $ (seq -w 1000000) ` dandidondi vor 9 Jahren 0
Sie können auch spezielle Shell-Zeichen (&,; usw.) mit einem Backtick (\) umgehen. chui101 vor 9 Jahren 1
Wenn Sie die URLs zu allen Ihren Seiten "kennen", können Sie versuchen, [Unterstützung für parametrisierte URI] (https://aria2.github.io/manual/de/html/aria2c.html#parameterized-uri-support) von zu verwenden `aria2c`. Alexey Ivanov vor 7 Jahren 0
1
Hannu

Laden Sie GNU Parallel herunter und lernen Sie es kennen:
https://www.gnu.org/software/parallel/

Mit einzeiligen Befehlen werden Sie in Kürze Dinge parallel ausführen, nicht nur das Herunterladen von Webseiten.