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

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介:

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

最近发现越来越多的歌曲下载都需要缴费了,对维护正版是好事。但有的时候也想钻个空子,正好最近在学习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()下载即可

代码如下:


  
  
  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()    

效果:

总结:

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


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

本文作者:GreyyHawk

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

相关文章
|
2天前
|
数据采集 JSON 数据格式
Python爬虫:京东商品评论内容
京东商品评论接口为商家和消费者提供了重要工具。商家可分析评论优化产品,消费者则依赖评论做出购买决策。该接口通过HTTP请求获取评论内容、时间、点赞数等数据,支持分页和筛选好评、中评、差评。Python示例代码展示了如何调用接口并处理返回的JSON数据。应用场景包括产品优化、消费者决策辅助、市场竞争分析及舆情监测。
|
13天前
|
数据采集 供应链 API
Python爬虫与1688图片搜索API接口:深度解析与显著收益
在电子商务领域,数据是驱动业务决策的核心。阿里巴巴旗下的1688平台作为全球领先的B2B市场,提供了丰富的API接口,特别是图片搜索API(`item_search_img`),允许开发者通过上传图片搜索相似商品。本文介绍如何结合Python爬虫技术高效利用该接口,提升搜索效率和用户体验,助力企业实现自动化商品搜索、库存管理优化、竞品监控与定价策略调整等,显著提高运营效率和市场竞争力。
49 3
|
24天前
|
数据采集 存储 缓存
如何使用缓存技术提升Python爬虫效率
如何使用缓存技术提升Python爬虫效率
|
25天前
|
数据采集 Web App开发 监控
Python爬虫:爱奇艺榜单数据的实时监控
Python爬虫:爱奇艺榜单数据的实时监控
|
1月前
|
数据采集 JSON API
如何利用Python爬虫淘宝商品详情高级版(item_get_pro)API接口及返回值解析说明
本文介绍了如何利用Python爬虫技术调用淘宝商品详情高级版API接口(item_get_pro),获取商品的详细信息,包括标题、价格、销量等。文章涵盖了环境准备、API权限申请、请求构建和返回值解析等内容,强调了数据获取的合规性和安全性。
|
1月前
|
数据采集 存储 API
利用Python爬虫获取1688关键词接口全攻略
本文介绍如何使用Python爬虫技术合法合规地获取1688关键词接口数据,包括环境准备、注册1688开发者账号、获取Access Token、构建请求URL、发送API请求、解析HTML及数据处理存储等步骤,强调遵守法律法规和合理使用爬虫技术的重要性。
|
1月前
|
数据采集 JSON 开发者
Python爬虫京东商品详情数据接口
京东商品详情数据接口(JD.item_get)提供商品标题、价格、品牌、规格、图片等详细信息,适用于电商数据分析、竞品分析等。开发者需先注册账号、创建应用并申请接口权限,使用时需遵循相关规则,注意数据更新频率和错误处理。示例代码展示了如何通过 Python 调用此接口并处理返回的 JSON 数据。
|
2月前
|
数据采集 存储 JSON
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第27天】本文介绍了Python网络爬虫Scrapy框架的实战应用与技巧。首先讲解了如何创建Scrapy项目、定义爬虫、处理JSON响应、设置User-Agent和代理,以及存储爬取的数据。通过具体示例,帮助读者掌握Scrapy的核心功能和使用方法,提升数据采集效率。
147 6
|
2月前
|
数据采集 前端开发 中间件
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第26天】Python是一种强大的编程语言,在数据抓取和网络爬虫领域应用广泛。Scrapy作为高效灵活的爬虫框架,为开发者提供了强大的工具集。本文通过实战案例,详细解析Scrapy框架的应用与技巧,并附上示例代码。文章介绍了Scrapy的基本概念、创建项目、编写简单爬虫、高级特性和技巧等内容。
122 4
|
5月前
|
数据采集 存储 中间件
Python进行网络爬虫:Scrapy框架的实践
【8月更文挑战第17天】网络爬虫是自动化程序,用于从互联网收集信息。Python凭借其丰富的库和框架成为构建爬虫的首选语言。Scrapy作为一款流行的开源框架,简化了爬虫开发过程。本文介绍如何使用Python和Scrapy构建简单爬虫:首先安装Scrapy,接着创建新项目并定义爬虫,指定起始URL和解析逻辑。运行爬虫可将数据保存为JSON文件或存储到数据库。此外,Scrapy支持高级功能如中间件定制、分布式爬取、动态页面渲染等。在实践中需遵循最佳规范,如尊重robots.txt协议、合理设置爬取速度等。通过本文,读者将掌握Scrapy基础并了解如何高效地进行网络数据采集。
287 6