设为首页 收藏本站
查看: 991|回复: 0

[经验分享] python写的批量下载baidu mp3的程序 至少到09-9-18仍然可用

[复制链接]

尚未签到

发表于 2015-4-22 02:07:29 | 显示全部楼层 |阅读模式
  windows平台下的Py2.6 移植到linux应该也很容易
默认10线程下载

  其中多线程下载部分 是参考 http://hi.baidu.com/zjw0358/blog

DSC0000.gif DSC0001.gif mydown.py
#!/usr/bin/env python
# coding=utf-8
import httplib,urllib,urllib2
import re,os
from downmp3 import GetSize,DownMp3
def BaiduUrlDecode(enurl):
    import string
    from urllib import unquote
    k = u'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
    decoded = ''
    # print enurl
    try:
        key = k.index(u't') - k.index(enurl[1])
        for i in range(enurl.__len__()):
            char = enurl
            if char in k:
                decoded += k[(k.index(char) + key) % 62]
            else:
                decoded += char
    except IndexError:
        print 'enurl IndexError:',enurl,'$'
        # print 'enurl[1]',enurl[1]
    return unquote(decoded.encode('gbk'))
def BadiuUrlProcess(baidu_url):
    import re
    from urllib import quote
    match_CHchar = r'([^:._,~`!@#\|{}\^\*\(\);%/\"\'\[\]\+\=\?\-\$\&\\\w]+)' #匹配中文
    ch_pattern = re.compile(match_CHchar)
    page_url = baidu_url
    if ch_pattern.search(baidu_url):
        page_url = ch_pattern.sub(quote(ch_pattern.search(baidu_url).groups()[0].encode('gbk')),baidu_url)
    return page_url
   

if __name__ == "__main__":
   
    print """   支持百度MP3的大部分列表音乐的下载,默认采用10线程下载
   
        [1] 新歌top100
        [2] 歌曲top500
        [3] 歌手top200 (暂不支持下载)
        [4] 中文金曲榜
        [5] 经典老歌
        [6] 热舞dj
        [7] 流金岁月
        [8] 电视金曲
        [9] 歌曲列表
        [0] 退出
                                --by auxten auxtenwpc[at]gmail[dot]com
    """.decode('utf-8').encode('gbk')
    id = int(raw_input('输入你想下载的list的编号: '.decode('utf-8').encode('gbk')))
    if id == 1: topid = '/list/newhits.html?id=1?top1'
    elif id == 2: topid = '/topso/mp3topsong.html?id=1?top2'
    elif id == 3: topid = '/list/tvs.html?id=1?top5';exit(1)
    elif id == 4: topid = '/list/bangping.html?id=1'#;exit(1)
    elif id == 5: topid = '/list/oldsong.html?top6'
    elif id == 6: topid = '/list/dj.html'
    elif id == 7: topid = '/list/liujinsuiyue.html'
    elif id == 8: topid = '/list/tvs.html?id=1?top5'
    elif id == 9: topid = '/list/tvs.html?id=1?top5'#;exit(1)
    elif id == 0: exit(1)
# topid = '/list/oldsong.html?top6'
    # topid = '/list/tvs.html?id=1?top5'
    print "Processing please wait DSC0002.gif .:)"
    errorlist = []
    conn = httplib.HTTPConnection('list.mp3.baidu.com')
    conn.request("GET",topid)
    response = conn.getresponse()
    html = response.read().decode('gb18030')
    # print html.encode('gbk')
    conn.close()
    match_type1 = r'">(\d{,3})\.' #编号
    match_type2 = r'">(\d{,3})\.[\s\S]*?(.*?)[^)].*' #no url songname for 流金岁月
    match_type3 = r'">(\d{,3})\.[\s\S]*?(.*?)[^)].*">(.*)\)' #name+author
    match_type4 = r'[\s]*?(\d{,3})[\s\S]*?(.*?)[\s\S]*?target="_blank">(.*?)' #no url songname singer 中文金曲榜
    list_number = re.findall(match_type1, html)
    list_all = re.findall(match_type3, html)
    if list_all == []:
        # print 'list_all empty1!'
        list_all = re.findall(match_type2, html)
    if list_all == []:
        # print 'list_all empty2!'
        list_all = re.findall(match_type4, html)
    # print 'list_all',list_all
    # print 'list_all__len__',list_all.__len__()
    conn = httplib.HTTPConnection('mp3.baidu.com')
    songnumlst = range(0,list_all.__len__())
   
    for num in songnumlst:
        try:
            try: authorname = '-'+list_all[num][3]
            except IndexError:
                authorname = ''
            print list_all[num][0].encode('gbk'),list_all[num][2].encode('gbk'),authorname.encode('gbk')        
    #        print num
            conn.request("GET",BadiuUrlProcess(list_all[num][1]))
            # print "URL!",BadiuUrlProcess(list_all[num][1]).encode('gbk')
            response = conn.getresponse()
            html = response.read().decode('gb18030')
            conn.close()
            # print html.encode('gbk')
            html = re.search(r'

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-59289-1-1.html 上篇帖子: Python基础教程笔记——使用字符串 下篇帖子: 使用PDB调试python程序
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表