Có song song wget? Một cái gì đó như fping nhưng chỉ để tải về?


14

Tôi chỉ tìm thấy puf (Trình tải URL song song) nhưng tôi không thể lấy nó để đọc các url từ một tệp; cái gì đó như

 puf < urls.txt

cũng không hoạt động.

Hệ điều hành được cài đặt trên máy chủ là Ubuntu.


Điều này có thể được thực hiện với thư viện Python và pycurl và một chút logic logic trong một tập lệnh. Nhưng tôi không biết về một công cụ "đóng hộp" cho việc đó.
Keith

@Keith Cách tiếp cận này có tốt hơn so với sử dụng một số thư viện async như gevent với urllib không?
Moonwalker

urllib không được thiết kế để được sử dụng không đồng bộ. Libcurl có vòng lặp async riêng và có thể được thiết lập để thực hiện ít nhất 1000 lần tìm nạp đồng thời bằng giao diện "đa".
Keith

@Keith Tôi thích câu trả lời của bạn nhất vì vậy bạn có thể viết nó như một câu trả lời "thực sự" để lấy tín dụng đúng hạn cho nó không?
Moonwalker

Câu trả lời:


24

Sử dụng GNU Song song ,

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

hoặc xargstừ GNU Findutils ,

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

nơi ${jobs}được số lượng tối đa wgetbạn muốn cho phép chạy đồng thời (thiết -nđể 1có được một wgetsự thỉnh nguyện mỗi dòng trong urls.txt). Không có -j/ -P, parallelsẽ chạy nhiều công việc cùng một lúc như các lõi CPU (điều này không nhất thiết có nghĩa là wgetbị ràng buộc bởi IO mạng) và xargssẽ chạy từng công việc một.

Một tính năng hay parallelđã kết thúc xargslà tách biệt đầu ra của các công việc đang chạy đồng thời, nhưng nếu bạn không quan tâm đến điều đó, xargsnhiều khả năng sẽ được cài đặt sẵn.


Tối ưu jobsphụ thuộc vào nhiều yếu tố: độ trễ đường dẫn, băng thông đường dẫn, chính sách máy chủ từ xa, v.v.
dhchdhd


2

Bạn có thể thực hiện điều đó bằng cách sử dụng Python và thư viện pycurl. Thư viện pycurl có giao diện "đa" thực hiện vòng lặp chẵn của chính nó cho phép nhiều kết nối đồng thời.

Tuy nhiên, giao diện khá giống C và do đó hơi cồng kềnh so với các mã khác, "Pythonic" hơn.

Tôi đã viết một trình bao bọc cho nó để xây dựng một ứng dụng khách giống như trình duyệt hoàn chỉnh hơn trên đầu trang. Bạn có thể sử dụng nó như một ví dụ. Xem mô-đun pycopia.WWW.client . HTTPConnectionManager kết thúc giao diện đa.


2

Điều này hoạt động và sẽ không làm DoS cục bộ hoặc từ xa, với các điều chỉnh thích hợp:

(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

Một phần của trang man của GNU Parallel chứa một ví dụ về wget đệ quy song song.

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

HTML được tải xuống hai lần: Một lần để trích xuất các liên kết và một lần để tải xuống đĩa. Nội dung khác chỉ được tải xuống một lần.

Nếu bạn không cần câu trả lời đệ quy có vẻ rõ ràng.


Chỉ là một FYI muộn mà bất kỳ "giải pháp" song song nào cũng không hiệu quả vì nó yêu cầu tải xuống nội dung hai lần , chậm vì tất cả tải xuống đa hướng và cũng không tốt khi sysops phải trả tiền cho tất cả sự lãng phí băng thông của bạn vì bạn đã không lãng phí băng thông vì bạn đã không 't sử dụng một giải pháp hiệu quả.
dhchdhd

0

Các nạn nhân của tải xuống paralell của bạn sẽ không thích thú: họ mong đợi một kết nối sẽ phục vụ mỗi khách hàng, thiết lập một số kết nối có nghĩa là ít khách hàng hơn. (Tức là, đây được coi là hành vi thô lỗ).


1
Nhưng anh ta có thể đang tải xuống các tệp từ các máy chủ khác nhau, vì vậy điều này sẽ không áp dụng.
Renan

Bên cạnh những gì @vonbrand đã nói, bạn có thể nhận được một cái gì đó như "Quá nhiều kết nối" và không thể tải xuống tất cả các tệp. Và nó có thể chậm hơn một chút (ví dụ: sử dụng lại một kết nối HTTP so với việc tạo một số kết nối HTTP)
golimar

2
Miễn là bạn giữ số lành mạnh, đó không phải là vấn đề lớn. Ví dụ, tại thời điểm bạn viết bài này, Firefox đã sử dụng 15 kết nối cho mỗi máy chủ khi không sử dụng các kết nối liên tục (từ đó họ đã chuyển sang chỉ thử các kết nối liên tục, giới hạn ở mức 6 trên mỗi máy chủ). Các trình duyệt khác sử dụng số tương tự.
derobert
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.