您好,登录后才能下订单哦!
这篇文章跟大家分析一下“Python多线程如何下载有声小说”。内容详细易懂,对“Python多线程如何下载有声小说”感兴趣的朋友可以跟着小编的思路慢慢深入来阅读一下,希望阅读后能够对大家有所帮助。下面跟着小编一起深入学习“Python多线程如何下载有声小说”的知识吧。
我特地买了大屏幕的Note II 以便看pdf,另外耳朵也不能闲着,不过咱不是听英语而是听小说,我在读书的时候就喜欢听广播,特别是说书、相声等,所以我需要大量的有声小说,现在网上这些资源多的很,但是下载页记为麻烦,为了挣取更多的流量和广告点击,这些网站的下载链接都需要打开至少两个以上的网页才能找到真正的链接,甚是麻烦,为了节省整体下载时间,我写了这个小程序,方便自己和大家下载有声小说(当然,还有任何其他类型的资源)
先说明一下,我不是为了爬很多资料和数据,仅仅是为了娱乐和学习,所以这里不会漫无目的的取爬取一个网站的所有链接,而是给定一个小说,比方说我要下载小说《童年》,我会在我听评书网上找到该小说的主页然后用程序下载所有mp3音频,具体做法见下面代码,所有代码都在模块crawler5tps中:
1. 先设定一下start url 和保存文件的目录
#-*-coding:GBK-*- import urllib,urllib2 import re,threading,os baseurl = 'http://www.5tps.com' #base url down2path = 'E:/enovel/' #saving path save2path = '' #saving file name (full path)
2. 从start url 解析下载页面的url
def parseUrl(starturl): ''''' parse out download page from start url. eg. we can get 'http://www.5tps.com/down/8297_52_1_1.html' from 'http://www.5tps.com/html/8297.html' ''' global save2path rDownloadUrl = re.compile(".*?<A href=\'(/down/\w+\.html)\'.*") #find the link of download page #rTitle = re.compile("<TITILE>.{4}\s{1}(.*)\s{1}.*</TITLE>") #<TITLE>有声小说 闷骚1 播音:刘涛 全集</TITLE> f = urllib2.urlopen(starturl) totalLine = f.readlines() ''''' create the name of saving file ''' title = totalLine[3].split(" ")[1] if os.path.exists(down2path+title) is not True: os.mkdir(down2path+title) save2path = down2path+title+"/" downUrlLine = [ line for line in totalLine if rDownloadUrl.match(line)] downLoadUrl = []; for dl in downUrlLine: while True: m = rDownloadUrl.match(dl) if not m: break downUrl = m.group(1) downLoadUrl.append(downUrl.strip()) dl = dl.replace(downUrl,'') return downLoadUrl
3. 从下载页面解析出真正的下载链接
def getDownlaodLink(starturl): ''''' find out the real download link from download page. eg. we can get the download link '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('<a href=\"(.*)\"><font color=\"blue\">'+gbk_ClickWord+'.*</a>') #find the real download link for url in downloadUrl: realurl = baseurl+url print realurl for line in urllib2.urlopen(realurl).readlines(): m = rDownUrl.match(line) if m: downUrl.append(m.group(1)) return downUrl
4. 定义下载函数
def download(url,filename): ''''' download mp3 file ''' print url urllib.urlretrieve(url, filename)
5. 创建用于下载文件的线程类
class DownloadThread(threading.Thread): ''''' dowanload thread class ''' def __init__(self,func,savePath): threading.Thread.__init__(self) self.function = func self.savePath = savePath def run(self): download(self.function,self.savePath)
6. 开始下载
if __name__ == '__main__': starturl = 'http://www.5tps.com/html/8297.html' downUrl = getDownlaodLink(starturl) aliveThreadDict = {} # alive thread downloadingUrlDict = {} # downloading link i = 0; while i < len(downUrl): ''''' Note:我听评说网 只允许同时有三个线程下载同一部小说,但是有时受网络等影响,\ 为确保下载的是真实的mp3,这里将线程数设为2 ''' while len(downloadingUrlDict)< 2 : downloadingUrlDict[i]=i i += 1 for urlIndex in downloadingUrlDict.values(): #argsTuple = (downUrl[urlIndex],save2path+str(urlIndex+1)+'.mp3') if urlIndex not in aliveThreadDict.values(): t = DownloadThread(downUrl[urlIndex],save2path+str(urlIndex+1)+'.mp3') t.start() aliveThreadDict[t]=urlIndex for (th,urlIndex) in aliveThreadDict.items(): if th.isAlive() is not True: del aliveThreadDict[th] # delete the thread slot del downloadingUrlDict[urlIndex] # delete the url from url list needed to download print 'Completed Download Work'
这样就可以了,让他尽情的下吧,咱还得码其他的项目去,哎 >>>
关于Python多线程如何下载有声小说就分享到这里啦,希望上述内容能够让大家有所提升。如果想要学习更多知识,请大家多多留意小编的更新。谢谢大家关注一下亿速云网站!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。