ดาวน์โหลดพร้อมกันหลายรายการโดยใช้ Wget?


207

ฉันใช้ wget เพื่อดาวน์โหลดเนื้อหาเว็บไซต์ แต่ wget ดาวน์โหลดไฟล์ทีละไฟล์

ฉันจะทำการดาวน์โหลด wget โดยใช้การเชื่อมต่อ 4 พร้อมกันได้อย่างไร


4
คำถามที่คล้ายกันกับโซลูชันที่ดี: stackoverflow.com/questions/7577615/parallel-wget-in-bash
JohnEye

ไปดูโครงการนี้github.com/rockdaboot/wget2
9869932

คำตอบ:


197

ใช้ aria2:

aria2c -x 16 [url]
#          |
#          |
#          |
#          ----> the number of connections 

http://aria2.sourceforge.net

ฉันรักมัน !!


26
ฉันไม่เห็นว่าสิ่งนี้จะช่วยให้ดาวน์โหลดเว็บไซต์ได้อย่างไรดูเหมือนว่าจะดาวน์โหลดได้เพียง 1 ไฟล์ หากเป็นจริงการลงคะแนนควรเป็น -ve
สตีเฟ่น

8
ฉันเห็นด้วยนี่ไม่ใช่คำตอบที่ดีเพราะ aria2 ไม่สามารถทำเว็บหรือ ftp มิเรอร์อย่าง wget หรือ lftp ได้ lftp ทำมิเรอร์รวมถึงสนับสนุนการเชื่อมต่อหลาย ๆ
Anachronist

9
อย่าลืม-sระบุจำนวนของการแบ่งและ-kเพื่อระบุขนาดขั้นต่ำต่อกลุ่มแยก - มิฉะนั้นคุณอาจไม่เคยถึงการ-xเชื่อมต่อสูงสุด
Bob

2
@Stephen นี่คือการดาวน์โหลดไฟล์ขนาดใหญ่มากเร็วกว่ามากจากเว็บไซต์โดยใช้ซ็อกเก็ตหลายตัวไปยังเซิร์ฟเวอร์แทนที่จะเป็นหนึ่ง สิ่งนี้ไม่ได้หมายถึงการขูดเว็บไซต์
gabeio

ไม่รองรับถุงเท้า *
Fedcomp

111

Wget ไม่รองรับการเชื่อมต่อซ็อกเก็ตหลายตัวเพื่อเร่งความเร็วในการดาวน์โหลดไฟล์

ฉันคิดว่าเราสามารถทำได้ดีกว่าคำตอบ gmarian เล็กน้อย

aria2วิธีที่ถูกต้องคือการใช้งาน

aria2c -x 16 -s 16 [url]
#          |    |
#          |    |
#          |    |
#          ---------> the number of connections here

19
ถึงเอกสาร-x, --max-connection-per-server=NUM The maximum number of connections to one server for each download. Possible Values: 1-16 Default: 1และ-s, --split=N Download a file using N connections. If more than N URIs are given, first N URIs are used and remaining URLs are used for backup. If less than N URIs are given, those URLs are used more than once so that N connections total are made simultaneously. The number of connections to the same host is restricted by the --max-connection-per-server option. See also the --min-split-size option. Possible Values: 1-* Default: 5
นิค

ขอบคุณที่ให้รายละเอียดเกี่ยวกับพารามิเตอร์นิค
thomas.han

4
ตัวเลือก -s เพียงอย่างเดียวไม่ได้แยกไฟล์จากเซิร์ฟเวอร์เดียวตั้งแต่ปล่อย 1.10 หนึ่งจำเป็นต้องใช้ --max-connection-per-server ร่วมกันเพื่อบังคับให้สร้างการเชื่อมต่อหลาย ๆ ดูเอกสาร aria2: About the number of connections Since 1.10.0 release, aria2 uses 1 connection per host by default and has 20MiB segment size restriction. So whatever value you specify using -s option, it uses 1 connection per host. To make it behave like 1.9.x, use --max-connection-per-server=4 --min-split-size=1M.
Samuel Li

1
การอัปเดตชวเลขของ @ SamuelLi นั้นใช้ได้aria2c -x 4 -k 1M urlและทำงานได้ดีสำหรับฉัน (เซิร์ฟเวอร์ที่มีขีด จำกัด 100k ต่อการเชื่อมต่อให้ฉันดาวน์โหลดที่ 400k ด้วยพารามิเตอร์ที่กล่าวไว้)
EkriirkE

ฉกรรจ์aria2ไม่ไม่สนับสนุนการดาวน์โหลด HTTP recursive ทำให้มันทดแทนถึงขนาดสำหรับwgetถ้า-rเป็นที่ต้องการ
user2943160

55

ตั้งแต่ GNU ขนานยังไม่ได้กล่าวถึงให้ฉันให้วิธีอื่น:

cat url.list | parallel -j 8 wget -O {#}.html {}

5
นั่นเป็นวิธีที่น่าสนใจ ไม่สามารถใช้งานได้จริงเมื่อคุณต้องการดาวน์โหลดไฟล์ขนาดใหญ่และคุณได้รับความเร็วที่ จำกัด ต่อการเชื่อมต่อ แต่จะมีประโยชน์เมื่อดาวน์โหลดไฟล์หลายไฟล์
Nikola Petkanski

การรันคำสั่งนี้จะรันรายการ 8 ครั้งใช่หรือไม่? ฉันทำแบบเดียวกันและแทนที่จะประมวลผลแต่ละบรรทัดด้วย 8 แนวมันแค่ประมวลผลรายการทั้งหมด 8 ครั้ง
DomainsFeatured

4
ไม่แยกรายการที่ 8 งาน
Nikolay Shmyrev

โอเคฉันทำอะไรแปลก ๆ อย่างแน่นอน จะคิดออก ขอบคุณสำหรับการตอบสนองอย่างรวดเร็ว.
DomainsFeatured

1
นั่นคือการใช้งานที่ไร้ประโยชน์ของcatแต่ ในบริบทที่ จำกัด นี้มันค่อนข้างไม่เป็นอันตราย แต่บางทีคุณอาจไม่ต้องการที่จะทำลายล้างศัตรู
tripleee

39

ฉันพบ วิธีแก้ปัญหา

ในขั้นตอนการดาวน์โหลดไฟล์บันทึกสองสามพันไฟล์จากเซิร์ฟเวอร์หนึ่งไปยังเซิร์ฟเวอร์ถัดไปฉันจำเป็นต้องทำการดาวน์โหลดแบบมัลติเธรดที่ร้ายแรงใน BSD โดยเฉพาะอย่างยิ่งกับ Wget ซึ่งเป็นวิธีที่ง่ายที่สุดที่ฉันสามารถจัดการเรื่องนี้ได้ เมื่อมองไปรอบ ๆ พาฉันไปที่นักเก็ตตัวน้อยนี้:

wget -r -np -N [url] &
wget -r -np -N [url] &
wget -r -np -N [url] &
wget -r -np -N [url]

เพียงทำซ้ำwget -r -np -N [url]สำหรับเธรดจำนวนมากเท่าที่คุณต้องการ ... ทีนี้ถ้านี่ไม่สวยและมีวิธีที่ดีกว่าในการทำเช่นนี้ แต่ถ้าคุณต้องการบางสิ่งที่รวดเร็วและสกปรกก็ควรทำเคล็ดลับ ...

หมายเหตุ:ตัวเลือกนี้-Nจะทำการwgetดาวน์โหลดเฉพาะไฟล์ "ที่ใหม่กว่า" ซึ่งหมายความว่ามันจะไม่เขียนทับหรือดาวน์โหลดไฟล์ซ้ำเว้นแต่ว่าการเปลี่ยนแปลงเวลาจะเกิดขึ้นบนเซิร์ฟเวอร์


11
แต่นั่นไม่ได้ดาวน์โหลดสิ่งประดิษฐ์ทั้งชุดสำหรับแต่ละกระบวนการใช่ไหม
Kai Mattern

10
@KaiMattern: เพิ่ม-ncตัวเลือก: "no clobber" - ทำให้การเพิกเฉยไม่สนใจไฟล์ที่ดาวน์โหลดมา (แม้บางส่วน)
เอสเอฟ

1
ฉันมีรายการรูปภาพที่ฉันต้องดาวน์โหลดและwget -i list.txt -nc & wget -i list.txt -nc & wget -i list.txt -ncมันก็ใช้ได้สำหรับฉันเช่นกัน: น่าเกลียดมาก แต่ก็ใช้งานได้ : P
Jared

1
การมีหนึ่งในการเชื่อมต่อเหล่านั้นแตกด้วยเหตุผลบางอย่างทำให้คุณมีไฟล์ที่ไม่สมบูรณ์โดยไม่ต้องแตะต้องโดยการเชื่อมต่ออื่น วิธีนี้สร้างปัญหาความสมบูรณ์
muhammedv

-bธงจะเรียกใช้กระบวนการ wget ในพื้นหลังที่เป็นทางเลือกในการทุบตีคนมี&การควบคุมงานในตัว STDOUT จะถูกเขียนไปยัง wget-log หาก-o <filename>ไม่ได้ระบุไว้ ดีสำหรับการเขียนสคริปต์ ดู wget (1) สำหรับรายละเอียดเพิ่มเติม
พอล

21

axelโปรแกรมที่สามารถทำเช่นนี้ก็คือ

axel -n <NUMBER_OF_CONNECTIONS> URL

สำหรับ baisic HTTP Auth

axel -n <NUMBER_OF_CONNECTIONS> "user:password@https://domain.tld/path/file.ext"

หน้าคนอูบุนตู


5
โปรแกรมนี้อนุญาตการเชื่อมต่อไม่ จำกัด จำนวนซึ่งมีประโยชน์มากในบางกรณี
uglide

1
เครื่องมือที่ยอดเยี่ยม สำหรับ centos6.xi ใช้rpm.pbone.net/index.php3/stat/4/idpl/16390122/dir/redhat_el_6/…
satch_boogie

Axel ไม่สามารถทำ HTTP auth พื้นฐาน :(
rustyx

1
ฉันมักจะทำaxel -n 4 "user:pasword@http://domain.tld/path/file.ext"
ลอร์ดโลห์

ฉันจะใช้ axel เพื่อดาวน์โหลดโฟลเดอร์ทั้งหมดซ้ำได้ไหม?
Ryan Arief

17

ใหม่ ( แต่ยังไม่ได้รับการปล่อยตัว) เครื่องมือเป็นmget มีตัวเลือกมากมายที่เป็นที่รู้จักจาก Wget และมาพร้อมกับห้องสมุดที่ให้คุณสามารถฝัง (เรียกซ้ำ) การดาวน์โหลดลงในแอปพลิเคชันของคุณเองได้อย่างง่ายดาย

ในการตอบคำถามของคุณ:

mget --num-threads=4 [url]

UPDATE

ตอนนี้ Mget ได้รับการพัฒนาเป็นWget2พร้อมแก้ไขข้อบกพร่องมากมายและคุณสมบัติอื่น ๆ (เช่นการสนับสนุน HTTP / 2)

--num-threads--max-threadsอยู่ในขณะนี้


หาดี ขอบคุณ!
user9869932

มีคำแนะนำในการติดตั้ง wget2 บนเครื่อง mac อย่างไร? เว็บไซต์มีเพียงเอกสารวิธีการติดตั้งจากแหล่งและมีปัญหาในการรับอัตโนมัติ
Chris

ในสคริปต์ TravisCI เราใช้ homebrew เพื่อติดตั้ง gettext (ซึ่งรวมถึง autopoint) ดูที่ .travis_setup.sh จาก wget2 repo
rockdaboot

13

ฉันแนะนำอย่างยิ่งให้ใช้ httrack

อดีต: httrack -v -w http://example.com/

มันจะทำมิเรอร์พร้อมกับการเชื่อมต่อ 8 ค่าพร้อมกัน Httrack มีตัวเลือกมากมายให้เล่น ได้ดู


@ aaa90210: คงจะดีมากถ้าคุณได้อธิบายข้อบกพร่องของโปรแกรมอย่างกระชับ ความคิดเห็นของ ArturBodera เป็นข้อมูลที่มากขึ้น
ริชาร์ด

@ArturBodera คุณสามารถเพิ่มไฟล์ cookies.txt ไปยังโฟลเดอร์ที่คุณใช้โปรแกรมของคุณและมันจะเพิ่มคุกกี้เหล่านั้นไปยังส่วนหัวดาวน์โหลดโดยอัตโนมัติ
Bertoncelj1

httrack ไม่สนับสนุนการเปลี่ยนเส้นทางต่อไปนี้
Chris Hunt

11

ในฐานะที่เป็นผู้โพสต์อื่น ๆ ได้กล่าวผมขอแนะนำให้คุณมีลักษณะที่aria2 จากหน้า man ของ Ubuntu สำหรับเวอร์ชั่น 1.16.1:

aria2 เป็นเครื่องมือสำหรับการดาวน์โหลดไฟล์ โปรโตคอลที่รองรับคือ HTTP (S), FTP, BitTorrent และ Metalink aria2 สามารถดาวน์โหลดไฟล์จากหลายแหล่ง / โปรโตคอลและพยายามใช้แบนด์วิดท์การดาวน์โหลดสูงสุดของคุณ รองรับการดาวน์โหลดไฟล์จาก HTTP (S) / FTP และ BitTorrent ในเวลาเดียวกันในขณะที่ข้อมูลที่ดาวน์โหลดจาก HTTP (S) / FTP จะถูกอัพโหลดไปยัง BitTorrent ด้วยการใช้ checksum อันเล็กของ Metalink, aria2 จะตรวจสอบความถูกต้องของข้อมูลโดยอัตโนมัติในขณะที่ดาวน์โหลดไฟล์เช่น BitTorrent

คุณสามารถใช้-xค่าสถานะเพื่อระบุจำนวนการเชื่อมต่อสูงสุดต่อเซิร์ฟเวอร์ (ค่าเริ่มต้น: 1):

aria2c -x 16 [url] 

หากไฟล์เดียวกันพร้อมใช้งานจากหลาย ๆ ที่คุณสามารถเลือกดาวน์โหลดได้จากทั้งหมด ใช้-jแฟล็กเพื่อระบุจำนวนสูงสุดของการดาวน์โหลดแบบขนานสำหรับ URI สแตติกทุกตัว (ค่าเริ่มต้น: 5)

aria2c -j 5 [url] [url2]

ดูที่http://aria2.sourceforge.net/สำหรับข้อมูลเพิ่มเติม สำหรับข้อมูลการใช้งาน man page นั้นเป็นคำอธิบายจริงๆและมีส่วนที่ด้านล่างพร้อมตัวอย่างการใช้งาน รุ่นออนไลน์สามารถพบได้ที่http://aria2.sourceforge.net/manual/en/html/README.html


8

wget ไม่สามารถดาวน์โหลดได้ในหลายการเชื่อมต่อ แต่คุณสามารถลองใช้โปรแกรมอื่นเช่น aria2



4

ใช้

aria2c -x 10 -i websites.txt >/dev/null 2>/dev/null &

ในเว็บไซต์.txtใส่ 1 URL ต่อบรรทัดตัวอย่าง:

https://www.example.com/1.mp4
https://www.example.com/2.mp4
https://www.example.com/3.mp4
https://www.example.com/4.mp4
https://www.example.com/5.mp4

2

พวกเขามักจะบอกว่ามันขึ้นอยู่ แต่เมื่อมันมาถึงมิเรอร์เว็บไซต์ที่ดีที่สุดที่มีอยู่HTTrack มันเร็วและง่ายต่อการทำงาน ข้อเสียเพียงอย่างเดียวคือมันเรียกว่าฟอรั่มการสนับสนุน แต่คุณสามารถหาวิธีของคุณโดยใช้เอกสารที่เป็นทางการ มันมีทั้งอินเตอร์เฟส GUI และ CLI และรองรับคุกกี้ที่เพิ่งอ่านเอกสารนี่เป็นสิ่งที่ดีที่สุด (จงระวังด้วยเครื่องมือนี้คุณสามารถดาวน์โหลดเว็บทั้งหมดบนฮาร์ดไดรฟ์ของคุณ)

httrack -c8 [url]

โดยค่าเริ่มต้นจำนวนสูงสุดของการเชื่อมต่อพร้อมกันจำกัด ที่ 8เพื่อหลีกเลี่ยงการโอเวอร์โหลดเซิร์ฟเวอร์


2

ใช้xargsสำหรับwgetทำงานหลายไฟล์พร้อมกัน

#!/bin/bash

mywget()
{
    wget "$1"
}

export -f mywget

# run wget in parallel using 8 thread/connection
xargs -P 8 -n 1 -I {} bash -c "mywget '{}'" < list_urls.txt

ตัวเลือก Aria2, วิธีที่ถูกต้องในการทำงานกับไฟล์ที่เล็กกว่า 20mb

aria2c -k 2M -x 10 -s 10 [url]

-k 2M แยกไฟล์ออกเป็นก้อนขนาด 2MB

-kหรือ--min-split-sizeมีค่าเริ่มต้นที่ 20mb หากคุณไม่ได้ตั้งค่าตัวเลือกนี้และไฟล์ที่มีขนาดต่ำกว่า 20mb จะทำงานในการเชื่อมต่อเดียวไม่ว่าจะเป็นค่า-xใดหรือ-s


1

makeสามารถขนานได้อย่างง่ายดาย (เช่นmake -j 4) ตัวอย่างเช่นต่อไปนี้เป็นเรื่องง่ายที่Makefileฉันใช้เพื่อดาวน์โหลดไฟล์แบบขนานโดยใช้ wget:

BASE=http://www.somewhere.com/path/to
FILES=$(shell awk '{printf "%s.ext\n", $$1}' filelist.txt)
LOG=download.log

all: $(FILES)
    echo $(FILES)

%.ext:
    wget -N -a $(LOG) $(BASE)/$@

.PHONY: all
default: all

0

พิจารณาใช้นิพจน์ปกติหรือFTP Globbingglobbing โดยที่คุณสามารถเริ่ม wget หลายครั้งด้วยกลุ่มตัวอักษรเริ่มต้นชื่อไฟล์ที่แตกต่างกันขึ้นอยู่กับความถี่ของการเกิดขึ้น

นี่เป็นตัวอย่างวิธีการซิงค์โฟลเดอร์ระหว่าง NAS สองแห่ง:

wget --recursive --level 0 --no-host-directories --cut-dirs=2 --no-verbose --timestamping --backups=0 --bind-address=10.0.0.10 --user=<ftp_user> --password=<ftp_password> "ftp://10.0.0.100/foo/bar/[0-9a-hA-H]*" --directory-prefix=/volume1/foo &
wget --recursive --level 0 --no-host-directories --cut-dirs=2 --no-verbose --timestamping --backups=0 --bind-address=10.0.0.11 --user=<ftp_user> --password=<ftp_password> "ftp://10.0.0.100/foo/bar/[!0-9a-hA-H]*" --directory-prefix=/volume1/foo &

wget แรกจะซิงค์ไฟล์ / โฟลเดอร์ทั้งหมดที่เริ่มต้นด้วย0, 1, 2... F, G, Hและเธรดที่สองจะซิงค์ทุกอย่างอื่น

นี่เป็นวิธีที่ง่ายที่สุดในการซิงค์ระหว่าง NAS กับพอร์ตอีเธอร์เน็ต 10G หนึ่งพอร์ต (10.0.0.100) และ NAS ที่มีพอร์ตอีเธอร์เน็ต 1G สองพอร์ต (10.0.0.10 และ 10.0.0.11) ฉันผูกสอง wget เธรดผ่าน--bind-addressไปยังพอร์ตอีเธอร์เน็ตที่แตกต่างกันและเรียกมันขนานกันโดยวาง&ที่จุดสิ้นสุดของแต่ละบรรทัด โดยที่ฉันสามารถคัดลอกไฟล์ขนาดใหญ่ที่มี 2x 100 MB / s = 200 MB / s รวม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.