python多線程+隊列下載資源
網上有一些公開課視頻教程還有課件啥的,手動下太慢了,寫個python下載。我想盡可能的做到通用性,以后可以直接用的,代碼如下,拋磚引玉,歡迎建議和意見:
import urllib.request
import re
import queue
import threading
import os
class download(threading.Thread):
def __init__(self,que):
threading.Thread.__init__(self)
self.que=que
def run(self):
while True:
if not self.que.empty():
print('-----%s------'%(self.name))
os.system('wget '+self.que.get())
else:
break
def startDown(url,rule,num,start,end,decoding=None):
if not decoding:
decoding='utf8'
req=urllib.request.urlopen(url)
body=req.read().decode(decoding)
rule=re.compile(rule)
link=rule.findall(body)
que=queue.Queue()
for l in link:
que.put(l[start:end])
for i in range(num):
d=download(que)
d.start()
if __name__=='__main__':
url='https://class.coursera.org/algo-004/lecture/index'
rule='<a target=\"_new\" href=\".*\"'
startDown(url,rule,10,23,-1) 簡單說一下:download類繼承了threading.Thread類,并重寫了run函數,目的是只要隊列不為空,則不停的從隊列中取出資源真實鏈接地址調用wget下載,如果為空則退出線程。startDown函數是多線程下載的接口,里面的參數分別為:url--資源的網頁,rule--正則表達式匹配方式,num--開啟的線程數,start--正則中匹配真實鏈接的起始位置,end--正則中匹配真實鏈接的結束位置,decoding--資源頁面采用的編碼方式,默認是utf8。
下面是我運行時的樣子:
好了,下次要下載直接import這個文件就妥了
轉自 http://blog.csdn.net/littlethunder/article/details/9396059
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!