文章目录
个人博客传送门: |我是门|
一、事情的详细经过
就是有一天我和队友rushB的时候,哎,就发现队友的MVP音乐针不戳。于是,我就让队友多放几次听一听。然而…
敌人:GTMD电竞梦
好吧,并不是队友不想给我听动感的MVP音乐,而是实力不允许(找个班上吧)
我就在网上找CSGO音乐盒的试听网站,一下就让我找到了CSGO官方网站 音乐盒试听。但是,我想把音乐文件保存到本地,就可以在本地听,也可以发给别人。我找啊找啊,找到了这个CSGO音乐盒曲目打包下载试听,还是缺了几个最新的音乐盒。
于是,回到CSGO官方网站 音乐盒试听,然后F12
有了资源链接,就轮到爬虫登场了。
二、selenium爬取所有资源链接并下载
注意到音乐盒试听页面是需要点击试听
按钮才弹出的,并且点击前后,页面链接没有发生变化,所以不能用?music=xxx
的形式获取试听页面。这个时候就需要用到selenium库来模拟用户行为。
selenium:Selenium框架测试直接运行在浏览器中,就像真正的用户在操作一样
导入selenium库
pip install selenium
下载浏览器驱动
Selenium调用浏览器必须有一个webdriver驱动文件
Chrome驱动文件下载:http://npm.taobao.org/mirrors/chromedriver/
Firefox驱动文件下载:https://github.com/mozilla/geckodriver/releases
驱动文件解压后,放到文件夹下,如:
配置环境变量
我的电脑–>属性–>系统设置–>高级–>环境变量–>系统变量–>Path,将驱动文件所在文件夹路径添加到Path的值中。
如:
爬取所有链接并下载
具体过程不写了,总之就是使用F12查看源代码,定位元素,模拟点击,爬取链接,然后用requests下载文件保存
完整代码:
from selenium import webdriver
import requests as req
import os
import time
oldtime = time.time() #开始时间
option = webdriver.ChromeOptions()
option.add_argument('--headless') #*面模式
page = webdriver.Chrome(chrome_options=option)# 创建一个webdriver对象
page.get('https://www.csgo.com.cn/data/music_box.html')
album = page.find_element_by_id('album')
dls = album.find_elements_by_tag_name('dl')
if os.path.exists('music')==False:
os.mkdir('music')
count = 0
for i in range(len(dls)):
count += 1
p = dls[i].find_element_by_tag_name('p')
p.click() #模拟点击"试听"
time.sleep(1)
prompt_music = page.find_element_by_id('prompt_music')
name_ch = prompt_music.find_element_by_class_name('name_ch')
albumName = name_ch.get_attribute('textContent')
albumName = albumName.replace(':', '-')
albumName = albumName.replace('*', '-')
if os.path.exists('music\\'+albumName)==False:
os.mkdir('music\\'+albumName)
lis = prompt_music.find_elements_by_tag_name('li')
print(albumName)
print('开始下载...')
for j in range(len(lis)):
musicName = str(lis[j].get_attribute('textContent'))
span = lis[j].find_element_by_tag_name('span')
musicSrc = span.get_attribute('musicsrc')
down = req.get(musicSrc)
fp = open('music\\'+albumName+'\\'+musicName+'.mp3', 'wb')
#保存MP3文件到磁盘
for data in down.iter_content(chunk_size=1024):
if data:
fp.write(data)
fp.close()
print('...下载完成')
close = prompt_music.find_element_by_class_name('close')
close.click() #模拟点击"X"关闭
time.sleep(1)
newtime = time.time()
to = newtime - oldtime
print('全部下载完成,共计%d个音乐盒,耗时%.2f秒'%(count, to))
结果:
三、听着音乐盒在沙二RushB
最喜欢的音乐盒:
EZ4ENCE
很遗憾,csdn不能嵌入iframe