如何爬取JOOX音乐榜单并去重导出为Excel文件
解决JOOX香港音乐榜单爬取与结构化导出问题
问题分析
你原代码直接抓取带有jsx-2493651356类的所有元素,导致结果重复混乱——因为这个类被歌曲名标签、链接标签等多个元素复用。正确的做法是先定位单首歌曲的完整容器,再从容器内精准提取排名、歌手、歌曲名。
完整解决方案代码
import requests from bs4 import BeautifulSoup import pandas as pd # 模拟浏览器请求头,避免被反爬拦截 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' } # 请求榜单页面 url = 'https://www.joox.com/hk/chart/1' response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') # 存储结构化数据的列表 chart_data = [] # 定位每首歌曲的容器(注意:动态类名可能随网站更新变化,需定期验证) song_items = soup.find_all('div', class_='jsx-3835762193 chart-item') for item in song_items: # 提取排名 rank = item.find('div', class_='jsx-3835762193 rank').get_text(strip=True) # 提取歌曲名 song_name = item.find('b', class_='jsx-2493651356 SongName').find('a').get_text(strip=True) # 提取歌手名 artist = item.find('span', class_='jsx-2493651356 singer-name').get_text(strip=True) # 添加到列表 chart_data.append({ 'Ranking': rank, 'Artist': artist, 'Song': song_name }) # 转换为DataFrame并导出到Excel df = pd.DataFrame(chart_data) df.to_excel('joox_hk_chart.xlsx', index=False) print("数据已成功导出到joox_hk_chart.xlsx")
关键说明
- 请求头设置:添加
User-Agent模拟浏览器请求,避免被网站的反爬机制拦截。 - 容器定位:通过歌曲条目容器(如
chart-item类)确保每首歌的信息只被抓取一次,避免重复。 - 动态类名注意:JOOX的类名是动态生成的(如
jsx-3835762193),如果后续代码失效,需打开浏览器开发者工具,重新查看当前页面的元素类名。 - Excel导出:使用
pandas的to_excel方法快速完成结构化数据的导出,需提前安装依赖包:pip install pandas openpyxl。
内容的提问来源于stack exchange,提问作者Hello Apple
相关产品推荐
相关产品推荐

