1 """
2 典型的分页型网站——咪咕音乐榜3 有时候运行会报错,有时候正常,原因不知道4 """
5 importrequests6 from bs4 importBeautifulSoup as bs7 importtime8
9 headers ={10 'User-Agent':'User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
11 }12
13 #获取每一个歌曲的网址,参数是分页url
14 defget_link(url):15 html_data = requests.get(url, headers =headers)16 soup = bs(html_data.text, 'lxml')#bs4推荐使用的的解析库
17 #print(soup.prettify()) #标准化输出url中的源代码(有可能跟网页查看中的不一致,网页中有可能标签书写不规范)以此为基础抓取,如果抓取失败,用此命令查看源代码
18 links = soup.select('#js_songlist > div > div.song-name > span > a')#注意循环点!!!
19 ranks = soup.select('#js_songlist > div > div.song-number')#因为歌曲详情里没有排名信息,因此需要在这部分获取详情信息
20 #print(ranks)
21 for rank, link in zip(ranks,links):#打包循环,主要为了输出配套的rank和link
22 rank =rank.get_text()23 link = 'http://music.migu.cn' + link.get('href')#观察每个歌曲的详细网页发现,前面部分需要手动添加http://music.migu.cn
24 #print(rank,link)
25 get_info(rank,link)26
27 #获取每一个歌曲的详细信息,排名、歌名、歌手和专辑名,参数url是每个歌曲的网址
28 defget_info(rank,url):29 html_data = requests.get(url, headers =headers)30 soup = bs(html_data.text, 'lxml')#bs4推荐使用的的解析库
31 #print(soup.prettify()) #标准化输出url中的源代码(有可能跟网页查看中的不一致,网页中有可能标签书写不规范)以此为基础抓取,如果抓取失败,用此命令查看源代码
32 title = soup.select('div.container.pt50 > div.song-data > div.data-cont > div.song-name > span.song-name-text')[0].string.strip()33
34 #用网页copy过来的全部是“body > div.wrap.clearfix.con_bg > div.con_l > div.pho_info > h4 > em”,但是使用这个爬不出来数据(我也不知道why),把body去掉或者用下面最简短的方式(只使用最近的且唯一的div)
35 #title = soup.select('div.pho_info > h4 > em ')
36 #查询结果title格式是一维列表,需要继续提取列表元素(一般就是[0]),列表元素是前后有标签需要继续提取标签内容,使用get_text()或者string
37 singer = soup.select('div.container.pt50 > div.song-data > div.data-cont > div.song-statistic > span > a')[0].string.strip()38 cd = soup.select('div.container.pt50 > div.song-data > div.data-cont > div.style-like > div > span > a')[0].string.strip() #获取标签的属性值
39
40 #将详细数据整理成字典格式
41 data ={42 '排名':rank,43 '歌名':title,44 '歌手':singer,45 '专辑':cd46 }47 print(data)48
49
50 #程序主入口
51 if __name__=='__main__':52 for number in range(1,3):53 url = 'http://music.migu.cn/v2/music/billboard/?_from=migu&page={}'.format(number) #构造分页url(不是歌曲详情的url)
54 get_link(url)55 time.sleep(1)