简易Python Selenium爬虫实现歌曲免费下载
最近发现越来越多的歌曲下载都需要缴费了,对维护正版是好事。但有的时候也想钻个空子,正好最近在学习python,随手写了一个建议爬虫,用来爬取某播放软件的在线音乐。
(本文仅代表作者观点, 思路与技术供参考、探讨,FreeBuf 依然鼓励维护正版。)
主要思路就是爬取播放页里的播放源文件的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
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 main(): print***********************欢迎使用GREY音乐下载器******************************** print directed by GreyyHawk print************************************************************************** time.sleep(1) while True: url = geturl() result = show_results(url) if result == quit: print/n continue else: local = d://%s.mp3%mname print download start time.sleep(1) urllib.urlretrieve(result, local, cbk) print finish downloading %s.mp3%mname + /n/n
当网页包含大量js的时候,selenium就会非常的方便,但经过实践发现好像phantomjs解析js的效率没有世纪浏览器的高,还会出错,后来换成调用火狐就好了,,不知道为啥,,也许是脸黑吧,,总之selenium真的是一款非常强大的框架,对爬虫有兴趣的同学一定要了解一下。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/54727.html
FireFoxpython
相关文章
- Python获取时间戳_python爬虫时间戳
- 苹果电脑python官网下载步骤-Python下载和安装图文教程[超详细]
- python大数据分析实例-用Python整合的大数据分析实例
- python中bool函数_bool()函数以及Python中的示例
- 【python】秀人集-写真集-爬虫-1.0「建议收藏」
- 【说站】python下划线的作用
- 【说站】python Fixture类级的介绍
- python 爬虫学习笔记
- 【Python】Jupyter在PyCharm中的使用
- python中字符串转成数字的几种方法[通俗易懂]
- Python学生信息管理系统课程设计报告_python做的项目管理系统
- 携程 爬虫_python自动化和爬虫先学哪个
- pycharm如何调试python程序_Pycharm断点调试Python程序的步骤方法
- Python 爬虫进阶必备 | 某网络广播电视台 header 加密参数逻辑分析
- 【测试开发】python系列教程:Python 推导式
- Python之xpath、JsonPath、bs4基本使用
- Python爬虫|人教版小初高教材下载及PDF电子书合成附可用工具!
- Python多线程爬虫编程中queue.Queue和queue.SimpleQueue的区别和应用
- Python操作系统
- 使用Python和Selenium库实现饭圈自动化投票
- python-数据库编程-如何在Python中连接到数据库
- python-Python与MySQL数据库-处理MySQL查询结果
- Python类型转换,Python数据类型转换函数大全
- TIOBE 2017年度榜单揭晓!C夺冠,Python紧随其后详解编程语言
- Python + PyQt5 实现美剧爬虫可视工具详解编程语言
- python操作redis详解编程语言
- 用Python仿写MSSQL 编程体验更有趣(python仿mssql)
- python网络编程示例(客户端与服务端)
- 2款Python内存检测工具介绍和使用方法
- Python原始字符串(rawstrings)用法实例
- 使用Python编写简单网络爬虫抓取视频下载资源
- 零基础写python爬虫之神器正则表达式