มี wget แบบขนานหรือไม่ สิ่งที่ชอบ fping แต่สำหรับการดาวน์โหลดเท่านั้น?


15

ฉันพบ puf เท่านั้น (ตัวเรียก URL แบบขนาน) แต่ฉันไม่สามารถอ่าน URL จากไฟล์ได้ สิ่งที่ต้องการ

 puf < urls.txt

ไม่ทำงานเช่นกัน

ระบบปฏิบัติการที่ติดตั้งบนเซิร์ฟเวอร์คือ Ubuntu


สิ่งนี้สามารถทำได้ด้วย Python และ pycurl ไลบรารี่และตรรกะเล็ก ๆ ของกาวในสคริปต์ แต่ฉันไม่รู้เครื่องมือ "กระป๋อง" สำหรับสิ่งนั้น
Keith

@Keith วิธีนี้ดีกว่าการใช้ async ไลบรารี่แบบ gevent กับ urllib บ้างไหม?
Moonwalker

urllib ไม่ได้ถูกออกแบบมาให้ใช้แบบอะซิงโครนัส libcurl มีห่วง async ของตัวเองและสามารถตั้งค่าให้เรียกอย่างน้อย 1,000 รายการพร้อมกันโดยใช้อินเทอร์เฟซ "หลาย"
Keith

@ Keith ฉันชอบคำตอบของคุณดีที่สุดดังนั้นคุณสามารถเขียนมันเป็นคำตอบ "ของจริง" ที่จะใช้เครดิตเนื่องจากมันได้หรือไม่
Moonwalker

คำตอบ:


25

ใช้GNU ขนาน ,

$ ขนาน -j $ {jobs} wget <urls.txt

หรือxargsจากGNU Findutils ,

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

โดยที่${jobs}เป็นจำนวนสูงสุดของwgetคุณต้องการอนุญาตให้ทำงานพร้อมกัน (การตั้งค่า-nเพื่อ1ให้ได้หนึ่งwgetการร้องขอต่อบรรทัดในurls.txt) โดยไม่ต้อง-j/ -P, parallelจะทำงานเป็นงานจำนวนมากในเวลาที่เป็นแกน CPU (ซึ่งไม่จำเป็นต้องทำให้ความรู้สึกสำหรับwgetผูกพันตามเครือข่าย IO) และxargsจะทำงานในช่วงเวลาหนึ่ง

ฟีเจอร์ที่ดีอย่างหนึ่งที่parallelมีมากกว่าxargsคือการแยกเอาท์พุทของงานที่รันพร้อมกัน แต่ถ้าคุณไม่สนใจสิ่งxargsนั้นมีแนวโน้มที่จะถูกติดตั้งไว้ล่วงหน้า


เหมาะสมที่สุดjobsขึ้นอยู่กับปัจจัยหลายอย่าง: เวลาแฝงของพา ธ , แบนด์วิดท์ของพา ธ , นโยบายเซิร์ฟเวอร์ระยะไกล ฯลฯ
dhchdhd

6

คำตอบนี้จะได้รับการปรับปรุงด้วยตัวอย่างจริงที่แก้ปัญหาที่ถามแทนซึ่งถือว่าเป็นคำตอบสำหรับลิงค์เท่านั้น meta.stackexchange.com/questions/225370/…
Jeff Schaller

2

คุณสามารถใช้สิ่งนั้นได้โดยใช้ Python และ pycurl library ไลบรารี pycurl มีอินเทอร์เฟซ "หลาย" ที่ใช้การวนซ้ำของตัวเองที่เปิดใช้งานการเชื่อมต่อหลายรายการพร้อมกัน

อย่างไรก็ตามอินเทอร์เฟซนั้นค่อนข้าง C-like และค่อนข้างยุ่งยากเมื่อเทียบกับรหัสอื่น ๆ "Pythonic" มากกว่า

ฉันเขียน wrapper ของมันเพื่อสร้างไคลเอนต์ที่เหมือนเบราว์เซอร์ที่สมบูรณ์ยิ่งขึ้น คุณสามารถใช้มันเป็นตัวอย่าง ดูpycopia.WWW.client module HTTPConnectionManager ล้อมหลายอินเตอร์เฟส


2

วิธีนี้ใช้งานได้และจะไม่ใช้ DoS ในพื้นที่หรือระยะไกลด้วยการปรับที่เหมาะสม

(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

ส่วนหนึ่งของหน้า man GNU Parallel มีตัวอย่างของ wget แบบขนานซ้ำ

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

HTML ถูกดาวน์โหลดสองครั้ง: หนึ่งครั้งสำหรับการแยกลิงก์และอีกครั้งสำหรับการดาวน์โหลดไปยังดิสก์ เนื้อหาอื่น ๆ จะถูกดาวน์โหลดเพียงครั้งเดียว

หากคุณไม่ต้องการคำตอบที่ซ้ำซากจำเจของคำตอบก็ดูเหมือนชัดเจน


เพียงแค่ปลายปี FYI ที่การแก้ปัญหาแบบขนานบวกกับ wget นั้นไม่มีประสิทธิภาพโดยเนื้อแท้เพราะมันต้องมีการดาวน์โหลดเนื้อหาสองครั้งช้าลงเนื่องจากการดาวน์โหลดแบบมัลติเฟสทั้งหมด ใช้โซลูชันที่มีประสิทธิภาพ
dhchdhd

0

ผู้ที่ตกเป็นเหยื่อของการดาวน์โหลด paralell ของคุณจะไม่สนุก: พวกเขาคาดหวังว่าการเชื่อมต่อหนึ่งครั้งเพื่อให้บริการลูกค้าแต่ละรายการตั้งค่าการเชื่อมต่อต่างๆหมายถึงลูกค้าโดยรวมที่น้อยลง (เช่นนี้ถือเป็นพฤติกรรมที่หยาบคาย)


1
แต่เขาอาจกำลังดาวน์โหลดไฟล์จากเซิร์ฟเวอร์ที่แตกต่างกันดังนั้นสิ่งนี้จะไม่นำมาใช้
Renan

นอกจากสิ่งที่ @vonbrand พูดไว้คุณสามารถได้รับ "การเชื่อมต่อมากเกินไป" และไม่สามารถดาวน์โหลดไฟล์ทั้งหมดได้ และอาจจะช้าลงเล็กน้อย (เช่นการนำเชื่อมต่อแบบ HTTP หนึ่งเมื่อเทียบกับการสร้างการเชื่อมต่อ HTTP หลาย ๆ คน)
golimar

2
ตราบใดที่คุณยังมีสติอยู่มันไม่ใช่เรื่องใหญ่อะไร เช่นในขณะที่คุณเขียนสิ่งนี้ Firefox ใช้การเชื่อมต่อ15 ครั้งต่อเซิร์ฟเวอร์เมื่อไม่ได้ใช้การเชื่อมต่อแบบถาวร (ตั้งแต่พวกเขาเปลี่ยนมาใช้การพยายามเชื่อมต่อแบบถาวรเท่านั้นซึ่ง จำกัด ไว้ที่ 6 ต่อเซิร์ฟเวอร์) เบราว์เซอร์อื่น ๆ ใช้หมายเลขใกล้เคียงกัน
Derobert
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.