抓取豆瓣fm华语频道音乐列表

最近在学习Python,攻略说要多多练习才能学有成效,所以刚好非常喜欢听豆瓣FM的华语频道,有把里面的歌全下载下来的冲动,所以就拿他练手了,连学边写,果然学了不少东东,在此感谢搜索网站及QQ群,还有哪些乐于分享和讨论Python的人啊,不然我上哪模仿都不知道去哪啊,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# -*- coding:utf-8 -*-
# Filename : ex38.py
# https://s5s5.me
# 抓取豆瓣fm华语频道音乐列表
 
import os
import urllib
import json
import time
 
def get_music_json():
    # 抓取json并写入临时txt
    url = 'http://douban.fm/j/mine/playlist?type=n&channel=1'   # 定义json地址
    music_json = urllib.urlopen(url)    # urllib去抓json回来
    base_json = json.load(music_json)   # json把json解析
    output = open('tempfje_-83838399wfjefie.txt', 'a')  # 增量写入txt
    for i in base_json['song']:     # 找到json中的相关元素
        title = i['title'].encode('utf8')   # 写入txt用utf8码
        artist = i['artist'].encode('utf8')
        output.write(('%s\t%s' % (artist, title)) + '\n')   # 一行一首歌的写
    output.close()  # 关了文件
 
def no_repeat():
    # 对临时txt去重并排序
    read_txt = file('tempfje_-83838399wfjefie.txt', 'r')    # 读临时txt
    write_txt = file('songlist.txt', 'w')   # 要写入的txt
    s = set()   # 用set去重
    for i in read_txt:  # 把txt写到set过的变量中
        s.add(i)
    s = list(s)     # 先转成列表才能排序
    s.sort()        # 排序
    for i in s:     # 写入txt
        i = i.replace('/', '&')     # 替换/为&
        write_txt.write(i)
    os.remove('tempfje_-83838399wfjefie.txt')   # 删除临时txt
 
def main():
    for i in range(0, 100):   # 抓它100次,因为每条json只有10首歌左右
        get_music_json()
        print i     # 显示一下进度
        time.sleep(1)   # 延时1秒去抓,抓太快会被封IP
    no_repeat()     # 去重排序
    print '抓取豆瓣fm华语频道音乐列表完成'
 
main()


代码中是抓取100次,其实我自己抓取了1000次,还被豆瓣封了IP一个,嘿嘿~~~
其实只有206首歌,点击查看

正所谓“人生苦短,我用Python!”,国庆老婆回老家去了,孤身一人没事干,还好写写Python时光过的飞快啊,今晚虽然可能有雨,但我还是想出去吃串,哈哈哈……

发布者:s5s5

https://s5s5.me

“抓取豆瓣fm华语频道音乐列表”上的16条回复

  1. 好想法。拿到的json里还有mp3的ID。可以写个小工具。
    douban_music_crawler.get_music(channel, limit)
    不知道听什么了,就去抓个20首。够听一会儿了~~

  2. 朋友麻烦你帮忙弄一下豆瓣FM日文MHz的歌曲列表好吗。我有一首歌找不到。都翻烂了。豆瓣说我像机器人。麻烦你了。。876119588@qq.com 给发一下列表 麻烦了。。日文的数量太多。而且我找歌还得用耳朵。。

  3. 读取回来得数据放在内存就可以了,没必要生成临时文件,试试用队列多线程读取,把所有的音乐列表都下载回来,下一步应该试试把mp3文件都下载回来。

评论已关闭。