您现在的位置是:亿华云 > 应用开发

Python Selenium爬虫实现歌曲免费下载

亿华云2025-10-02 09:01:53【应用开发】4人已围观

简介最近发现越来越多的歌曲下载都需要缴费了,对维护正版是好事。但有的时候也想钻个空子,正好最近在学习python,随手写了一个建议爬虫,用来爬取某播放软件的在线音乐。主要思路就是爬取播放页里的播放源文件的

最近发现越来越多的爬虫歌曲下载都需要缴费了,对维护正版是实现好事。但有的歌曲时候也想钻个空子,正好最近在学习python,免费随手写了一个建议爬虫,下载用来爬取某播放软件的爬虫在线音乐。

主要思路就是实现爬取播放页里的播放源文件的url,程序可以读取用户输入并返回歌单,歌曲,免费,下载因为在线网站包含大量js,爬虫requests就显得很无奈,实现又懒得手动解析js,歌曲于是免费寄出selenium大杀器。

selnium是下载一款很强大的浏览器自动化测试框架,直接运行在浏览器端,模拟用户操作,目前selenium支持包括IE,Firefox,Chrome等主流浏览器及PhantomJS之类的无头浏览器,selenium+phantomjs也是现在很火的一个爬虫框架。香港云服务器

代码不长,做的有些简陋,以后可以加个GUI。。。。

步骤一:

进入酷狗主页,F12查看元素,,通过selenium.webdriver的send_keys()方法给send_input类传参,即用作用户的输入,然后通webdriver.click()方法点击搜索按钮,得到搜索结果列表。这里会有一个js重定向,通过webdriver.current_ur就可以了,,切记一点!传入的参数需要经过unicode编码(.decode(‘gb18030′))效果一样),否则如果有中文会乱码。。(来自被深深困扰的我)

 

步骤二:

查看元素里每首歌的路径,发现每首歌的路径只有<li>不同,于是通过对li的迭代来获取每一首歌的xpath,云服务器提供商并输出歌曲名字的元素,然后依旧通过webdriver的click()方法点击歌曲链接,得到歌曲播放页面,这里没有什么难点,都是常规操作。需要注意的是,这里的歌曲链接也包含一个js的重定向,但不一样的是浏览器会打开一个新的页面(至少火狐会),可以在click()方法后通过webdriver.switch_to_window()方法跳转到新打开的页面

 

步骤三:

进入播放页面后通过xpath找到播放源文件链接(强推firepath,xpath神器啊)但发现这里依然有一个js渲染,来生成播放源链接,直接提取<src>标签会显示为空,于是继续webdriver,调用的浏览器会自动解析js脚本,解析完成后提取<src>得到歌曲链接,使用urllib的urlretrueve()下载即可

 

代码如下:

#coding=utf-8 from selenium.webdriver.remote.webelement import WebElement from selenium import webdriver from selenium.webdriver import ActionChains from selenium.common.exceptions import NoSuchElementException from selenium.common.exceptions import StaleElementReferenceException from selenium.webdriver.common.desired_capabilities import DesiredCapabilities from selenium.webdriver.common.by import By import time import urllib #歌曲名 mname =  #JS重定向 def wait(driver):     elem = driver.find_element_by_tag_name(html)     count = 0     while True:         count += 1         if count > 20:             print(chao shi le)             return         time.sleep(.5)         try:             elem == driver.find_element_by_tag_name(html)         except StaleElementReferenceException:             return #获取url def geturl():     input_string = raw_input(>>>please input the search key:)     driver = webdriver.Chrome()     url = http://www.kugou.com/     driver.get(url)     a=driver.find_element_by_xpath(html/body/div[1]/div[1]/div[1]/div[1]/input) #输入搜索内容     a.send_keys(input_string.decode(gb18030))     driver.find_element_by_xpath(html/body/div[1]/div[1]/div[1]/div[1]/div/i).click() #点击搜索     result_url = driver.current_url     driver.quit()     return result_url #显示搜索结果 def show_results(url):     driver = webdriver.Chrome()     driver.get(url)     time.sleep(3)     for i in range(1,1000):         try:             print %d. %i + driver.find_element_by_xpath(".//*[@id=search_song]/div[2]/ul[2]/li[%d]/div[1]/a"%i).get_attribute(title)  #获取歌曲名         except NoSuchElementException as msg:             break     choice = input(">>>Which one do you want(you can input quit to goback(带引号)):")     if choice == quit:   #从下载界面退回         result = quit     else:         global mname         mname = driver.find_element_by_xpath(".//*[@id=search_song]/div[2]/ul[2]/li[%d]/div[1]/a"%choice).get_attribute(title)         a = driver.find_element_by_xpath(".//*[@id=search_song]/div[2]/ul[2]/li[%d]/div[1]/a"%choice)         actions = ActionChains(driver)         actions.move_to_element(a)         actions.click(a)         actions.perform()         #wait(driver)         driver.switch_to_window(driver.window_handles[1])  #跳转到新打开的页面         result = driver.find_element_by_xpath(".//*[@id=myAudio]").get_attribute(src) #获取播放元文件url         driver.quit()     return result #下载回调 def cbk(a, b, c):     per = 100.0 * a * b / c       if per > 100:         per = 100     print %.2f%% % per def main():     print高防服务器

很赞哦!(39)