鉴于某云某狗某q好的音乐都要收费,于是冲浪找了一个可以免费下载音乐的网站(说是免费,某些禁歌也需要钱,不过一般的都有,接下来我就通过这个网站,演示一下怎么通过selenium webdriver下载歌曲)
一、准备材料
- 1.python
2.pycharm编辑器(支持python的编辑器都可)
3.selenium
4.Chromedriver(下载当前浏览器的对应版本,放到python安装主目录文件夹里面)
5.被爬取的网站一个
6.一个歌曲单子txt
二、我的准备工作(可参考)
- 1.python版本以及chromedriver的存放地址
- 2.Chromedriver的下载地址:http://npm.taobao.org/mirrors/chromedriver/
3.查看google的版本:浏览器右上角-帮助-关于浏览器,查看版本,下载对应的即可
4.被爬取的网站:“http://www.fangpi.net/”
5.一个txt文档,里面的歌曲和歌手用英文字符的,隔开
三、开整
# coding = utf8
import selenium
import requests
import time
'''如果出现:SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 85
解决:
pip install webdriver-manager
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(ChromeDriverManager().install())
'''
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
import logging
logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')
*写一个主体方法,需要传入的参数有url和需要下载的歌曲的list,list是一个处理后的列表*
def get_music(url,get_music_list):
#防止浏览器自动关闭
global driver
# driver = webdriver.Chrome(executable_path='D:\python\chromedriver.exe')
driver = webdriver.Chrome(ChromeDriverManager().install())
# driver = webdriver.Chrome(executable_path="E:\Python3.9.0\chromedriver.exe")
print(get_music_list)
#循环列表中的元素(元素包含列表:歌曲和歌手)
for i in get_music_list:
#[['句号', 'G.E.M.邓紫棋'], ['孤独', 'G.E.M.邓紫棋']]
#i[0]是歌曲名字,i[1]是歌手
logging.info("开始搜索下载" + i[0])
driver.get(url)
time.sleep(2)
driver.find_element_by_id("s-input").send_keys(i[0])
time.sleep(0.5)
driver.find_element_by_id("s-btn").click()
time.sleep(2)
singer = driver.find_element_by_xpath("/html/body/div[1]/div[1]/div/div/table/tbody/tr[1]/td[2]").text
print(singer)
if singer == i[1]:
driver.find_element_by_xpath("/html/body/div[1]/div[1]/div/div/table/tbody/tr[1]/td[1]/a").click()
time.sleep(2)
# 这一步会打开新窗口
driver.find_element_by_id("btn-download-mp3").click()
time.sleep(3)
# 获取浏览器句柄
windowstabs = driver.window_handles
print(windowstabs)
# 如果下载歌曲打不开说明是收费的,就没有新窗口,长度就为1
if len(windowstabs) ==2:
# 获取当前浏览器的窗口的句柄
currenttab = driver.current_window_handle
print(currenttab)
# 切换到新窗口
driver.switch_to.window(windowstabs[1])
# 获取当前选项卡url
href_value = driver.current_url
#使用requests去访问地址,进行一个下载
response_value=requests.get(href_value)
music_name = "E:\Python_study\音乐下载" + '\\' + i[0] + ".mp3"
print(music_name)
with open(music_name,"wb") as m:
m.write(response_value.content)
m.close()
time.sleep(1)
#关闭当前下载窗口
driver.close()
# 获取浏览器句柄
windowstabs = driver.window_handles
print(windowstabs)
# 进入第一个句柄,因为之前关掉了一个窗口,浏览器失去焦点需要重新定位
driver.switch_to.window(windowstabs[0])
time.sleep(2)
else:
print("没打开新页面,这歌要钱:" + i[0])
else:
print("这首歌没有找到:" + i[0])
pass
#下载完了关闭整个浏览器
driver.close()
def open_list():
music_all = []
# 打开文件
with open("music_list.txt","r",encoding='utf8') as r:
# 循环每一行,获取每一个去除回车,每一个元素用逗号划分
for line in r.readlines():
lines = line.replace("\n", "").split(",")
# 写入列表
music_all.append(lines)
print(music_all)
return music_all
if __name__ == '__main__':
url="http://www.fangpi.net/"
get_music_list = open_list()
get_music(url,get_music_list)
四、运行后截图