2010-03-18 40 views
25

Tôi làm cách nào để tải xuống tệp (video) bằng Python bằng cách sử dụng wget và lưu chúng cục bộ? Sẽ có một loạt các tệp, vì vậy làm cách nào để biết rằng một tệp được tải xuống để tự động bắt đầu downloding một tệp khác?Sử dụng wget qua Python

Cảm ơn.

+3

Bạn sẽ làm như thế nào? Tìm kiếm đầu tiên cho tất cả các câu hỏi trước giống hệt như của bạn: http://stackoverflow.com/questions/tagged/wget+python. Thứ hai, đọc câu hỏi cụ thể này: http://stackoverflow.com/questions/419235/anyone-know-of-a-good-python-based-web-crawler-that-i-could-use –

Trả lời

20

Đừng làm điều này. Thay vào đó, hãy sử dụng urllib2 hoặc urlgrabber.

+9

Câu trả lời này cần phải là mở rộng. Tại sao không nên sử dụng 'wget'? – muhuk

+10

Bởi vì nó bắt đầu một quá trình hoàn toàn mới chỉ để làm những việc mà bản thân Python có khả năng. –

+6

Bởi vì nó làm suy yếu tính di động. – Ekevoo

10

Nếu bạn sử dụng os.system() để sinh ra quy trình cho wget, nó sẽ chặn cho đến khi wget kết thúc quá trình tải xuống (hoặc thoát khỏi lỗi). Vì vậy, chỉ cần gọi os.system('wget blah') trong vòng lặp cho đến khi bạn đã tải xuống tất cả các tệp của mình.

Hoặc, bạn có thể sử dụng urllib2 hoặc httplib. Bạn sẽ phải viết một mã số không tầm thường, nhưng bạn sẽ nhận được hiệu suất tốt hơn, vì bạn có thể tái sử dụng một kết nối HTTP duy nhất để tải xuống nhiều tệp, thay vì mở một kết nối mới cho từng tệp.

9

Không có lý do để sử dụng os.system. Tránh viết một kịch bản shell trong Python và đi với một cái gì đó như urllib.urlretrieve hoặc tương đương.

Chỉnh sửa ... để trả lời phần thứ hai của câu hỏi, bạn có thể thiết lập nhóm chủ đề bằng cách sử dụng lớp Hàng đợi thư viện chuẩn. Vì bạn đang tải xuống rất nhiều, GIL không phải là vấn đề. Tạo danh sách các URL bạn muốn tải xuống và cung cấp chúng cho hàng đợi công việc của bạn. Nó sẽ xử lý các yêu cầu đẩy đến các luồng công nhân.

Tôi đang chờ bản cập nhật cơ sở dữ liệu hoàn tất, vì vậy, tôi sẽ nhanh chóng thực hiện việc này cùng nhau.

 

#!/usr/bin/python 

import sys 
import threading 
import urllib 
from Queue import Queue 
import logging 

class Downloader(threading.Thread): 
    def __init__(self, queue): 
     super(Downloader, self).__init__() 
     self.queue = queue 

    def run(self): 
     while True: 
      download_url, save_as = queue.get() 
      # sentinal 
      if not download_url: 
       return 
      try: 
       urllib.urlretrieve(download_url, filename=save_as) 
      except Exception, e: 
       logging.warn("error downloading %s: %s" % (download_url, e)) 

if __name__ == '__main__': 
    queue = Queue() 
    threads = [] 
    for i in xrange(5): 
     threads.append(Downloader(queue)) 
     threads[-1].start() 

    for line in sys.stdin: 
     url = line.strip() 
     filename = url.split('/')[-1] 
     print "Download %s as %s" % (url, filename) 
     queue.put((url, filename)) 

    # if we get here, stdin has gotten the ^D 
    print "Finishing current downloads" 
    for i in xrange(5): 
     queue.put((None, None)) 
 
+1

có lỗi trong 'download_url, save_as = queue.get()'. nên là 'download_url, save_as = self.queue.get()'. – disfated

-4

Không có lý do gì để sử dụng python. Tránh viết một kịch bản shell trong Python và đi với một cái gì đó như bash hoặc tương đương.

+1

Viết kịch bản lệnh shell trong Python là OK.Nếu bạn muốn thực hiện điều gì đó nhanh chóng nhưng bạn ghét cú pháp của bash, hãy thực hiện nó bằng Python. Nếu bạn thực hiện một dự án lớn hơn, thì có, hãy cố gắng tránh các cuộc gọi bên ngoài này. – Jabba

+3

Python là một ngôn ngữ kịch bản tốt. –

2

Cài đặt wget qua pypi http://pypi.python.org/pypi/wget/0.3

pip install wget 

sau đó chạy, cũng như tài liệu

python -m wget <url> 
+9

Đối với bất kỳ ai khác thấy điều này gây nhầm lẫn, thư viện được liên kết không sử dụng wget. Nó sử dụng urllib. Và nó hiện không hỗ trợ bất cứ điều gì gần với những gì wget (http://www.gnu.org/software/wget/) nào. –

18

Câu trả lời ngắn (giản thể). Để nhận một tệp

import urllib 
urllib.urlretrieve("http://google.com/index.html", filename="local/index.html") 

Bạn có thể tìm hiểu cách lặp lại điều đó nếu cần.

Các vấn đề liên quan