赞
踩
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'
}
这里设置了一个自定义请求头,特别是User-Agent。它用于模拟浏览器访问,因为一些网站可能会基于用户代理(User-Agent)来区分请求是由真实用户的浏览器发出还是由爬虫发出。
songs = []
for page in range(1, 24):
songs.extend(match_songs(page))
因为top500每页22个所以是500/22+1=23页。这里我们做了一个循环用来爬取这么多页,然后将爬取的内容使用extend函数扩展保存起来。
而match_songs就是我们定义的爬取函数
url = f'https://www.kugou.com/yy/rank/home/{page}-8888.html'
response = requests.get(url, headers=headers)
html_content = response.text
定义了连接,因为是不不同页数就把页数的部分改为输入的值page
使用requests.get发送一个GET请求到上述URL,并传入之前设置的headers。
response.text包含了网页的HTML内容。
soup = BeautifulSoup(html_content, 'html.parser')
这里使用BeautifulSoup解析获取到的HTML内容。
'html.parser’是用于解析HTML的解析器。
page_songs = []
for li in soup.find_all('li', {'title': True}):
rank = li.find('span', class_='pc_temp_num').get_text(strip=True).strip('.')
full_title = li.get('title')
初始化一个空列表songs来存储歌曲信息。
使用find_all方法查找所有具有title属性的li标签。
对于每个li标签:
提取排名(位于类名为pc_temp_num的span标签内)。
提取完整的歌曲标题。
if '8' in rank:
如果排名中包含数字“8”,则进行进一步处理。
parts = full_title.split(' - ')
if len(parts) >= 2:
artist = parts[0]
song = ' - '.join(parts[1:])
page_songs.append({"排名": rank, "歌曲": song, "歌手": artist})
return page_songs
使用split方法以“-”为分隔符分割标题。
第一部分被认为是艺术家(歌手)的名字,剩余部分合并为歌曲名称。
将提取的数据添加到songs列表中,并返回歌曲列表
csv_file = '酷狗排行榜含8的歌曲.csv'
with open(csv_file, 'w', newline='', encoding='utf-8-sig') as file:
writer = csv.DictWriter(file, fieldnames=["排名", "歌曲","歌手"])
writer.writeheader()
for song in songs:
writer.writerow(song)
定义CSV文件的名称。
打开文件并创建一个csv.DictWriter对象,用于写入数据。
写入表头,然后遍历songs列表,将每首歌的信息写入文件。
完整代码
import csv from bs4 import BeautifulSoup import requests def match_songs(page): url = f'https://www.kugou.com/yy/rank/home/{page}-8888.html' response = requests.get(url, headers=headers) html_content = response.text soup = BeautifulSoup(html_content, 'html.parser') page_songs = [] for li in soup.find_all('li', {'title': True}): rank = li.find('span', class_='pc_temp_num').get_text(strip=True).strip('.') full_title = li.get('title') if '8' in rank: parts = full_title.split(' - ') if len(parts) >= 2: artist = parts[0] song = ' - '.join(parts[1:]) page_songs.append({"排名": rank, "歌曲": song, "歌手": artist}) return page_songs 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' } songs = [] for page in range(1, 24): songs.extend(match_songs(page)) csv_file = '酷狗排行榜含8的歌曲.csv' with open(csv_file, 'w', newline='', encoding='utf-8-sig') as file: writer = csv.DictWriter(file, fieldnames=["排名", "歌曲", "歌手"]) writer.writeheader() for song in songs: writer.writerow(song)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。