Python爬虫系列——爬取豆瓣音乐排行榜!

今天一个学妹来找我帮忙,她选修了爬虫课,老师给了爬豆瓣视频排行榜信息的代码,要求她们改写,然后学妹想改成爬音乐排行榜信息,结果出错了,然后代码出错了又自己改不了,所以就来找我小土豆啦~

后面附带她们老师给的爬取豆瓣电影排行榜信息的代码。

下面是我改过之后的完整代码,可正常运行的,如果不能正常爬取内容请注意该博客的发布时间,有可能豆瓣的代码换了!

from urllib import request
from chardet import detect
from bs4 import BeautifulSoup as bs
import re

def getSoup(url):
    with request.urlopen(url) as fp:
        byt=fp.read()
        det=detect(byt)
        return bs(byt.decode(det['encoding']),'lxml')

def getData(soup):
    data=[]
    div=soup.find('div',attrs={'class':'grid-16-8 clearfix'})
    data = []
    for width in div.findAll('table', {'width': '100%%'}):
        small_data = []
        
        small_data.append(width.find('a', {'class': 'nbg'})['title'])
        
        small_data.append(width.find('span', {'class': 'rating_nums'}).string)
        
        star_index = re.search('class="allstar', str(width)).span()[1]
        small_data.append(int(str(width)[star_index: star_index + 2]) / 10)
        
        data.append(small_data)
    return data

def nextUrl(soup):
    a=soup.find('a',text=re.compile("^后页"))
    if a:
        return a.attrs['href']
    else:
        return None

if __name__=='__main__':
    url="https://music.douban.com/top250"
    soup=getSoup(url)
    print(getData(soup))
    nt=nextUrl(soup)
    while nt:
        soup=getSoup(nt)
        print(getData(soup))
        nt=nextUrl(soup)

这部分是老师给的爬豆瓣电影排行榜信息的代码:

from urllib import request
from chardet import detect
from bs4 import BeautifulSoup as bs
import re

def getSoup(url):
    with request.urlopen(url) as fp:
        byt=fp.read()
        det=detect(byt)
        return bs(byt.decode(det['encoding']),'lxml')

def getData(soup):
    data=[]
    ol=soup.find('ol',attrs={'class':'grid_view'})
    for li in ol.findAll('li'):
        tep=[]
        titles=[]
        for span in li.findAll('span'):
            if span.has_attr('class'):
                if span.attrs['class'][0]=='title':
                    titles.append(span.string.strip())
                elif span.attrs['class'][0]=='rating_num':
                    tep.append(span.string.strip())
                elif span.attrs['class'][0]=='inq':
                    tep.append(span.string.strip())
        tep.insert(0,titles)
        data.append(tep)
    return data

def nextUrl(soup):
    a=soup.find('a',text=re.compile("^后页"))
    if a:
        return a.attrs['href']
    else:
        return None
    
if __name__=='__main__':
    url="https://movie.douban.com/top250"
    soup=getSoup(url)
    print(getData(soup))
    nt=nextUrl(soup)
    while nt:
        soup=getSoup(url+nt)
        print(getData(soup))
        nt=nextUrl(soup)

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
好的,以下是使用Python和Beautiful Soup爬取豆瓣音乐排行榜的代码和过程解析: 1. 导入所需的库 ``` import requests from bs4 import BeautifulSoup ``` 2. 通过requests库向网站发送请求,获取网页内容 ``` url = 'https://music.douban.com/chart' headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} response = requests.get(url, headers=headers) html = response.text ``` 3. 使用Beautiful Soup解析网页内容 ``` soup = BeautifulSoup(html, 'html.parser') ``` 4. 定位需要爬取的信息 豆瓣音乐排行榜中包含歌曲的排名、歌曲名称、歌手和评分等信息,我们需要定位到这些信息所在的HTML标签和类名。 ``` songs = soup.find_all('tr', class_='item') ``` 5. 提取信息并进行存储 ``` for song in songs: rank = song.find('span', class_='ranking_num').get_text().strip() title = song.find('a', class_='nbg').get_text().strip() artist = song.find('p', class_='pl').get_text().strip() rating = song.find('span', class_='rating_nums').get_text().strip() print(rank, title, artist, rating) ``` 完整代码如下: ``` import requests from bs4 import BeautifulSoup url = 'https://music.douban.com/chart' headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} response = requests.get(url, headers=headers) html = response.text soup = BeautifulSoup(html, 'html.parser') songs = soup.find_all('tr', class_='item') for song in songs: rank = song.find('span', class_='ranking_num').get_text().strip() title = song.find('a', class_='nbg').get_text().strip() artist = song.find('p', class_='pl').get_text().strip() rating = song.find('span', class_='rating_nums').get_text().strip() print(rank, title, artist, rating) ``` 此代码可爬取豆瓣音乐排行榜前100首歌曲的信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是土豆大叔啊!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值