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


Python Selenium爬虫实现歌曲免费下载_第1张图片

最近发现越来越多的歌曲下载都需要缴费了,对维护正版是好事。但有的时候也想钻个空子,正好最近在学习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′))效果一样),否则如果有中文会乱码。。(来自被深深困扰的我)

Python Selenium爬虫实现歌曲免费下载_第2张图片

步骤二:

查看元素里每首歌的路径,发现每首歌的路径只有

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

    Python Selenium爬虫实现歌曲免费下载_第3张图片

    步骤三:

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

    Python Selenium爬虫实现歌曲免费下载_第4张图片

    代码如下:

    
    
    1. #coding=utf-8 
    2. from selenium.webdriver.remote.webelement import WebElement 
    3. from selenium import webdriver 
    4. from selenium.webdriver import ActionChains 
    5. from selenium.common.exceptions import NoSuchElementException 
    6. from selenium.common.exceptions import StaleElementReferenceException 
    7. from selenium.webdriver.common.desired_capabilities import DesiredCapabilities 
    8. from selenium.webdriver.common.by import By 
    9. import time 
    10. import urllib 
    11.  
    12. #歌曲名 
    13. mname = '' 
    14.  
    15. #JS重定向 
    16. def wait(driver): 
    17.     elem = driver.find_element_by_tag_name('html'
    18.     count = 0 
    19.     while True
    20.         count += 1 
    21.         if count > 20: 
    22.             print('chao shi le'
    23.             return 
    24.         time.sleep(.5) 
    25.         try: 
    26.             elem == driver.find_element_by_tag_name('html'
    27.         except StaleElementReferenceException: 
    28.             return 
    29.  
    30. #获取url 
    31. def geturl(): 
    32.     input_string = raw_input('>>>please input the search key:'
    33.     driver = webdriver.Chrome() 
    34.     url = 'http://www.kugou.com/' 
    35.     driver.get(url) 
    36.     a=driver.find_element_by_xpath('html/body/div[1]/div[1]/div[1]/div[1]/input') #输入搜索内容 
    37.     a.send_keys(input_string.decode('gb18030')) 
    38.     driver.find_element_by_xpath('html/body/div[1]/div[1]/div[1]/div[1]/div/i').click() #点击搜索 
    39.     result_url = driver.current_url 
    40.     driver.quit() 
    41.     return result_url 
    42.  
    43.  
    44. #显示搜索结果 
    45. def show_results(url): 
    46.     driver = webdriver.Chrome() 
    47.     driver.get(url) 
    48.     time.sleep(3) 
    49.     for i in range(1,1000): 
    50.         try: 
    51.             print '%d. '%i + driver.find_element_by_xpath(".//*[@id='search_song']/div[2]/ul[2]/li[%d]/div[1]/a"%i).get_attribute('title')  #获取歌曲名 
    52.         except NoSuchElementException as msg: 
    53.             break 
    54.     choice = input(">>>Which one do you want(you can input 'quit' to goback(带引号)):"
    55.     if choice == 'quit':   #从下载界面退回 
    56.         result = 'quit' 
    57.     else
    58.         global mname 
    59.         mname = driver.find_element_by_xpath(".//*[@id='search_song']/div[2]/ul[2]/li[%d]/div[1]/a"%choice).get_attribute('title'
    60.         a = driver.find_element_by_xpath(".//*[@id='search_song']/div[2]/ul[2]/li[%d]/div[1]/a"%choice) 
    61.         actions = ActionChains(driver) 
    62.         actions.move_to_element(a) 
    63.         actions.click(a) 
    64.         actions.perform() 
    65.         #wait(driver) 
    66.         driver.switch_to_window(driver.window_handles[1])  #跳转到新打开的页面 
    67.         result = driver.find_element_by_xpath(".//*[@id='myAudio']").get_attribute('src') #获取播放元文件url 
    68.         driver.quit() 
    69.     return result 
    70.  
    71.  
    72. #下载回调 
    73. def cbk(a, b, c): 
    74.     per = 100.0 * a * b / c   
    75.     if per > 100: 
    76.         per = 100 
    77.     print '%.2f%%' % per 
    78.      
    79.  
    80. def main(): 
    81.     print'***********************欢迎使用GREY音乐下载器********************************' 
    82.     print'                                                      directed by GreyyHawk' 
    83.     print'**************************************************************************' 
    84.     time.sleep(1) 
    85.     while True
    86.         url = geturl() 
    87.         result = show_results(url) 
    88.         if result == 'quit'
    89.             print'\n' 
    90.             continue 
    91.         else
    92.             local = 'd://%s.mp3'%mname 
    93.             print 'download start' 
    94.             time.sleep(1) 
    95.             urllib.urlretrieve(result, local, cbk) 
    96.             print 'finish downloading %s.mp3'%mname + '\n\n' 
    97.  
    98.  
    99.  
    100. if __name__ == '__main__'
    101.   main()    

    效果:

    Python Selenium爬虫实现歌曲免费下载_第5张图片

    总结:

    当网页包含大量js的时候,selenium就会非常的方便,但经过实践发现好像phantomjs解析js的效率没有世纪浏览器的高,还会出错,后来换成调用火狐就好了,,不知道为啥,,也许是脸黑吧,,总之selenium真的是一款非常强大的框架,对爬虫有兴趣的同学一定要了解一下。  


    原文发布时间为:2017-10-26

    本文作者:GreyyHawk

    本文来自云栖社区合作伙伴“51CTO”,了解相关信息可以关注。

  • 你可能感兴趣的:(Python Selenium爬虫实现歌曲免费下载)