利用python爬取豆瓣音乐_python爬虫之豆瓣音乐top250

本文介绍了使用Python爬虫抓取豆瓣音乐Top250榜单的过程,包括设置请求头、解析HTML、获取音乐名称、作者、风格、发行时间和简介,并将数据存储到MongoDB中。作者分享了遇到的问题和解决方案,还进行了简单的数据分析,发现大部分音乐属于流行、摇滚和民谣风格。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

回家很久了,实在熬不住,想起来爬点数据玩一玩,之前自己笔记本是win7加ubuntu16.04双系统,本打算在ubuntu里写代码的,可是回到家ubuntu打开一直是紫屏,百度知乎方法用了也没解决,厉害的兄弟可以教下我哦,过年有红包哦!!然后就还是在win7下开始写代码了(电脑太卡,一直不想装Python),今天爬的是豆瓣音乐top250,比较简单,主要是练练手。

代码import requestsimport refrom bs4 import BeautifulSoupimport timeimport pymongo

client = pymongo.MongoClient('localhost', 27017)

douban = client['douban']

musictop = douban['musictop']

headers = {    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}

urls = ['https://music.douban.com/top250?start={}'.format(str(i)) for i in range(0,250,25)]def get_url_music(url):

wb_data = requests.get(url,headers=headers)

soup = BeautifulSoup(wb_data.text,'lxml')

music_hrefs = soup.select('a.nbg')    for music_href in music_hrefs:

get_music_info(music_href['href'])

time.sleep(2)def get_music_info(url):

wb_data = requests.get(url,headers=headers)

soup = BeautifulSoup(wb_data.text,'lxml')

names = soup.select('h1 > span')

authors = soup.select('span.pl > a')

styles = re.findall('流派: (.*?)
',wb_data.text,re.S)

times = re.findall('发行时间: (.*?)
',wb_data.text,re.S)

contents = soup.select('span.short > span')    if len(names) == 0:

name = '缺失'

else:

name = names[0].get_text()    if len(authors) == 0:

author = '佚名'

else:

author = authors[0].get_text()    if len(styles) == 0:

style = '未知'

else:

style = styles[0].split('\n')[0]    if len(times) == 0:

time = '未知'

else:

time = times[0].split('-')[0]    if len(contents) == 0:

content = '无'

else:

content = contents[0].get_text()

info = {        'name':name,        'author':author,        'style':style,        'time':time,        'content':content

}

musictop.insert_one(info)for url in urls:

get_url_music(url)

1加了请求头(本来没加,调试几次突然没数据了,加了请求头开始也没好,后来又好了,可能是网络原因)

2这次是进入信息页爬的数据(上次爬电影没采用这种方法,缺少了部分数据)

3数据的预处理用了很多if函数,厉害的兄弟有什么优化的方法。

数据分析

1部分数据可以见上图

2中国音乐作者还是很多的,哈哈。

3随着音乐设备和网络的普及,流行音乐的发展,可以看出2000年后作品越来越多,到2010年又积极下滑(经典就是经典,无法吐槽现在的音乐)

4风格大家可以看出流行,摇滚,民谣占了一大半。

5最后弄了一首周董的《不能说的秘密》做词云,想想小时候都是回忆啊。

问题import requestsimport refrom bs4 import BeautifulSoupimport timeimport pymysql

conn = pymysql.connect(host='localhost', user='root', passwd='123456', db='test', port=3306, charset='utf8')

cursor = conn.cursor()

headers = {    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}

urls = ['https://music.douban.com/top250?start={}'.format(str(i)) for i in range(0,225,25)]def get_url_music(url):

wb_data = requests.get(url,headers=headers)

soup = BeautifulSoup(wb_data.text,'lxml')

music_hrefs = soup.select('a.nbg')    for music_href in music_hrefs:

get_music_info(music_href['href'])

time.sleep(2)def get_music_info(url):

wb_data = requests.get(url,headers=headers)

soup = BeautifulSoup(wb_data.text,'lxml')

names = soup.select('h1 > span')

authors = soup.select('span.pl > a')

styles = re.findall('流派: (.*?)
',wb_data.text,re.S)

times = re.findall('发行时间: (.*?)
',wb_data.text,re.S)

contents = soup.select('span.short > span')    if len(names) == 0:

name = '缺失'

else:

name = names[0].get_text()    if len(authors) == 0:

author = '佚名'

else:

author = authors[0].get_text()    if len(styles) == 0:

style = '未知'

else:

style = styles[0].split('\n')[0]    if len(times) == 0:

time = '未知'

else:

time = times[0].split('-')[0]    if len(contents) == 0:

content = '无'

else:

content = contents[0].get_text()

info = {        'name':name,        'author':author,        'style':style,        'time':time,        'content':content

}

cursor.execute("use test")

cursor.execute("insert into doubanmusic250 (name,author,style,time,content) values(%s,%s,%s,%s,%s)", (name,author,style,time,content))

conn.commit()for url in urls:

get_url_music(url)

最近再学mysql,想用Python连接MySQL的,可是出错,附上代码,大牛们前来指导。代码出错图:

祝福

在这里住大家新年快乐,鸡年大吉。

作者:罗罗攀

链接:https://www.jianshu.com/p/1f40c00cc233

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值