Python多线程如何下载有声小说
导读:本文共2538.5字符,通常情况下阅读需要8分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: 我特地买了大屏幕的Note II 以便看pdf,另外耳朵也不能闲着,不过咱不是听英语而是听小说,我在读书的时候就喜欢听广播,特别是说书、相声等,所以我需要大量的有声小说,现在网上这些资源多的很,但是下载页记为麻烦,为了挣取更多的流量和广告点击,这些网站的下载链接都需要打开至少两个以上的网页才能找到真正的链接,甚是麻烦,为了节省整体下载时间,我写了这个小程序,方便... ...
目录
(为您整理了一些要点),点击可以直达。我特地买了大屏幕的Note II 以便看pdf,另外耳朵也不能闲着,不过咱不是听英语而是听小说,我在读书的时候就喜欢听广播,特别是说书、相声等,所以我需要大量的有声小说,现在网上这些资源多的很,但是下载页记为麻烦,为了挣取更多的流量和广告点击,这些网站的下载链接都需要打开至少两个以上的网页才能找到真正的链接,甚是麻烦,为了节省整体下载时间,我写了这个小程序,方便自己和大家下载有声小说(当然,还有任何其他类型的资源)
先说明一下,我不是为了爬很多资料和数据,仅仅是为了娱乐和学习,所以这里不会漫无目的的取爬取一个网站的所有链接,而是给定一个小说,比方说我要下载小说《童年》,我会在我听评书网上找到该小说的主页然后用程序下载所有mp3音频,具体做法见下面代码,所有代码都在模块crawler5tps中:
1. 先设定一下start url 和保存文件的目录
#-*-coding:GBK-*-importurllib,urllib2importre,threading,osbaseurl='http://www.5tps.com'#baseurldown2path='E:/enovel/'#savingpathsave2path=''#savingfilename(fullpath)
2. 从start url 解析下载页面的url
defparseUrl(starturl):'''''parseoutdownloadpagefromstarturl.eg.wecanget'http://www.5tps.com/down/8297_52_1_1.html'from'http://www.5tps.com/html/8297.html''''globalsave2pathrDownloadUrl=re.compile(".*?<Ahref=\'(/down/\w+\.html)\'.*")#findthelinkofdownloadpage#rTitle=re.compile("<TITILE>.{4}\s{1}(.*)\s{1}.*</TITLE>")#<TITLE>有声小说闷骚1播音:刘涛全集</TITLE>f=urllib2.urlopen(starturl)totalLine=f.readlines()'''''createthenameofsavingfile'''title=totalLine[3].split("")[1]ifos.path.exists(down2path+title)isnotTrue:os.mkdir(down2path+title)save2path=down2path+title+"/"downUrlLine=[lineforlineintotalLineifrDownloadUrl.match(line)]downLoadUrl=[];fordlindownUrlLine:whileTrue:m=rDownloadUrl.match(dl)ifnotm:breakdownUrl=m.group(1)downLoadUrl.append(downUrl.strip())dl=dl.replace(downUrl,'')returndownLoadUrl
3. 从下载页面解析出真正的下载链接
defgetDownlaodLink(starturl):'''''findouttherealdownloadlinkfromdownloadpage.eg.wecangetthedownloadlink'http://180j-d.ysts8.com:8000/人物纪实/童年/001.mp3?\1251746750178x1356330062x1251747362932-3492f04cf54428055a110a176297d95a'from\'http://www.5tps.com/down/8297_52_1_1.html''''downUrl=[]gbk_ClickWord='点此下载'downloadUrl=parseUrl(starturl)rDownUrl=re.compile('<ahref=\"(.*)\"><fontcolor=\"blue\">'+gbk_ClickWord+'.*</a>')#findtherealdownloadlinkforurlindownloadUrl:realurl=baseurl+urlprintrealurlforlineinurllib2.urlopen(realurl).readlines():m=rDownUrl.match(line)ifm:downUrl.append(m.group(1))returndownUrl
4. 定义下载函数
defdownload(url,filename):'''''downloadmp3file'''printurlurllib.urlretrieve(url,filename)
5. 创建用于下载文件的线程类
classDownloadThread(threading.Thread):'''''dowanloadthreadclass'''def__init__(self,func,savePath):threading.Thread.__init__(self)self.function=funcself.savePath=savePathdefrun(self):download(self.function,self.savePath)
6. 开始下载
if__name__=='__main__':starturl='http://www.5tps.com/html/8297.html'downUrl=getDownlaodLink(starturl)aliveThreadDict={}#alivethreaddownloadingUrlDict={}#downloadinglinki=0;whilei<len(downUrl):'''''Note:我听评说网只允许同时有三个线程下载同一部小说,但是有时受网络等影响,\为确保下载的是真实的mp3,这里将线程数设为2'''whilelen(downloadingUrlDict)<2:downloadingUrlDict[i]=ii+=1forurlIndexindownloadingUrlDict.values():#argsTuple=(downUrl[urlIndex],save2path+str(urlIndex+1)+'.mp3')ifurlIndexnotinaliveThreadDict.values():t=DownloadThread(downUrl[urlIndex],save2path+str(urlIndex+1)+'.mp3')t.start()aliveThreadDict[t]=urlIndexfor(th,urlIndex)inaliveThreadDict.items():ifth.isAlive()isnotTrue:delaliveThreadDict[th]#deletethethreadslotdeldownloadingUrlDict[urlIndex]#deletetheurlfromurllistneededtodownloadprint'CompletedDownloadWork'
这样就可以了,让他尽情的下吧,咱还得码其他的项目去,哎>>>
</div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
Python多线程如何下载有声小说的详细内容,希望对您有所帮助,信息来源于网络。