if 'mp3' not in song_url: continue print(f"正在下载歌曲:{song_name},链接:{song_url}") response = requests.get(song_url, headers=headers) with open(f"music/{song_name}.mp3", 'wb') as f: f.write(response.content)优化这段代码,不是MP3的歌曲也能下载
时间: 2024-01-11 09:02:17 浏览: 18
可以将判断语句改为判断文件后缀是否为mp3,如果不是则直接跳过下载过程。代码如下:
```python
for song_name, song_url in song_dict.items():
if not song_url.endswith('.mp3'):
continue
print(f"正在下载歌曲:{song_name},链接:{song_url}")
response = requests.get(song_url, headers=headers)
with open(f"music/{song_name}.mp3", 'wb') as f:
f.write(response.content)
```
这样就可以避免非mp3文件的下载,并且不会影响已有的下载逻辑。
相关问题
# 抓取网站信息并使用etree预处理数据 response = requests.get(url=url, headers=headers) html = etree.HTML(response.text) # 原始id、name列表(包含无关信息) raw_id_list = html.xpath('//a[contains(@href, "song?")]/@href') raw_name_list = html.xpath('//a[contains(@href, "song?")]/text()') id_list = [] name_list = [] # 过滤无关信息,得到纯净列表 for id in raw_id_list: music_id = id.split('=')[1] if '$' not in music_id: id_list.append(music_id) for music_name in raw_name_list: if '{' not in music_name: name_list.append(music_name) # 遍历所有歌曲 for i in range(len(id_list)): # 完整下载链接 music_url = url_base + id_list[i] # 对应歌曲名称 music_name = name_list[i] # 获取每首歌取得具体信息 music = requests.get(url=music_url, headers=headers) # 以二进制形式写入到本文件夹的 with open('D:/360安全浏览器下载/网易云热歌榜/%s.mp3' % music_name, 'wb') as file: file.write(music.content) print('<%s>下载成功...' % music_name)解释一下没一句代码的意思
好的,下面逐行解释这段代码的意思:
1. 发送HTTP请求并获取响应
```
= requests.get(url=url, headers=headers)
```
使用requests库发送HTTP GET请求,获取指定url的响应内容,并将响应对象保存在response变量中。
2. 预处理HTML文本
```
html = etree.HTML(response.text)
```
使用etree库的HTML方法解析响应文本,返回Element对象,方便后续进行XPath表达式的提取。
3. 获取歌曲ID和名称
```
raw_id_list = html.xpath('//a[contains(@href, "song?")]/@href')
raw_name_list = html.xpath('//a[contains(@href, "song?")]/text()')
```
使用XPath表达式从HTML文本中提取出包含“song?”字符串的链接的href属性和对应的文本信息,分别保存在raw_id_list和raw_name_list列表中。
4. 过滤无关信息
```
for id in raw_id_list:
music_id = id.split('=')[1]
if '$' not in music_id:
id_list.append(music_id)
for music_name in raw_name_list:
if '{' not in music_name:
name_list.append(music_name)
```
对于每个歌曲ID,使用split方法将其按照“=”分割,取得第二部分,即为纯净的id字符串,如果其中不包含“$”字符,则将其添加到id_list列表中。对于每个歌曲名称,如果其中不包含“{”字符,则将其添加到name_list列表中。
5. 遍历所有歌曲并下载
```
for i in range(len(id_list)):
music_url = url_base + id_list[i]
music_name = name_list[i]
music = requests.get(url=music_url, headers=headers)
with open('D:/360安全浏览器下载/网易云热歌榜/%s.mp3' % music_name, 'wb') as file:
file.write(music.content)
print('<%s>下载成功...' % music_name)
```
对于每个歌曲,根据其ID构造完整的下载链接,使用requests库发送HTTP GET请求,获取对应歌曲的具体信息,并以二进制形式写入到本地文件夹中,文件名为歌曲名称+“.mp3”。最后在控制台输出下载成功的信息。
import requests from bs4 import BeautifulSoup import re import pandas as pd url = 'https://music.163.com/discover/toplist?id=19723756' 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) soup = BeautifulSoup(response.text, 'html.parser') song_list = soup.find('ul', {'class': 'f-hide'}) song_items = song_list.find_all('li') data = [] for song_item in song_items: song_title = song_item.find('a') if song_title: song_title = song_title.text.strip() else: song_title = '' song_id = song_item.find('a') if song_id: song_id = song_id['href'].split('=')[1] else: song_id = '' song_url = f'https://music.163.com/song/media/outer/url?id={song_id}.mp3' song_artists = song_item.find('span', {'class': 's-fc3'}) if song_artists: song_artists = song_artists.text.strip() song_artists = re.sub('\s+', ' ', song_artists) song_artists = re.sub('/', ', ', song_artists) else: song_artists = '' data.append([song_title, song_url, song_artists]) df = pd.DataFrame(data, columns=['Title', 'URL', 'Artists']) df.to_excel('song_list.xlsx', index=False)
好的,根据您提供的代码,可以按照以下方式进行修改:
1. 首先,在获取歌曲信息时,需要找到包含歌曲时长和歌手名称的元素。
2. 在获取歌曲时长和歌手名称时,需要分别从该元素中提取出对应的信息。
以下是修改后的代码:
```
import requests
from bs4 import BeautifulSoup
import re
import pandas as pd
url = 'https://music.163.com/discover/toplist?id=19723756'
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)
soup = BeautifulSoup(response.text, 'html.parser')
song_list = soup.find('ul', {'class': 'f-hide'})
song_items = song_list.find_all('li')
data = []
for song_item in song_items:
song_title = song_item.find('a')
if song_title:
song_title = song_title.text.strip()
else:
song_title = ''
song_id = song_item.find('a')
if song_id:
song_id = song_id['href'].split('=')[1]
else:
song_id = ''
song_url = f'https://music.163.com/song/media/outer/url?id={song_id}.mp3'
song_info = song_item.find('span', {'class': 'song-list-item-info'})
if song_info:
song_info = song_info.text.strip().split('-')
song_artists = song_info[0].strip()
song_duration = song_info[1].strip()
else:
song_artists = ''
song_duration = ''
data.append([song_title, song_url, song_artists, song_duration])
df = pd.DataFrame(data, columns=['Title', 'URL', 'Artists', 'Duration'])
df.to_excel('song_list.xlsx', index=False)
```
在修改后的代码中,我添加了以下内容:
1. 在获取歌曲信息时,使用 `song_item.find('span', {'class': 'song-list-item-info'})` 获取包含歌曲时长和歌手名称信息的元素。
2. 在获取歌手名称和歌曲时长时,使用 `song_info = song_info.text.strip().split('-')` 将元素的文本内容以 `-` 分隔,得到包含歌手名称和歌曲时长的列表。
3. 根据列表中的元素顺序,使用 `song_artists = song_info[0].strip()` 和 `song_duration = song_info[1].strip()` 分别获取歌手名称和歌曲时长。
4. 在 `data.append()` 中添加了 `song_duration`,它会作为歌曲信息的第四个元素保存到 `data` 列表中。
5. 修改了 `df = pd.DataFrame(data, columns=['Title', 'URL', 'Artists'])` 为 `df = pd.DataFrame(data, columns=['Title', 'URL', 'Artists', 'Duration'])`,将 `Duration` 列添加到了 DataFrame 中。
希望这个修改后的代码可以帮助到您!