最近发现越来越多的歌曲下载需要付费,这对维护原版是个好事。但有时也想钻空子。最近刚好在学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'))效果相同),否则如果有中文会乱码。.(来自深感困扰的我)第二步:查看element中每首歌曲的路径,发现每首歌曲的路径仅与
不同,于是在li上迭代得到每首歌曲的xpath,并输出歌曲名称的元素,然后仍然通过webdriver的click()方法点击歌曲链接,得到歌曲播放页面。这里没有难度,属于常规操作。需要注意的是,这里的歌曲链接也包含了一个js重定向,但是不同的是浏览器会打开一个新的页面(至少Firefox会),可以在click()之后通过webdriver.switch_to_window()方法方法跳转到新打开的页面第三步:进入播放页面后,通过xpath找到播放源文件链接(强推firepath,xpath神器)但是发现这里还有js渲染生成播放源链接,并且直接提取标签会显示为空,所以继续webdriver,调用的浏览器会自动解析js脚本,解析后提取得到歌曲链接,使用urllib的urlretrueve()下载代码如下如下:#coding=utf-8fromselenium。webdriver.remote.webelementimportWebElementfromseleniumimportwebdriverfromselenium.webdriverimportActionChainsfromselenium.common.exceptionsimportNoSuchElementExceptionfromselenium.common.exceptionsimportStaleElementReferenceExceptionfromselenium.webdriver.common.desired_capabilitiesimportDesiredCapabilitiesfromselenium.webdriver.common.byimportByimporttimeimporturllib#歌曲名mname=''#JS重定向defwait(driver):elem=driver.find_element_by_tag_name('html')count=0whileTrue:count+=1ifcount>20:print('chaoshile')returntime.sleep(.5)try:elem==driver.find_element_by_tag_name('html')exceptStaleElementReferenceException:return#Geturldefgeturl():input_string=raw_input('>>>请输入搜索关键字:')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_urldriver.quit()returnresult_url#显示搜索结果defshow_results(网址):driver=webdriver.Chrome()driver.get(url)time.sleep(3)foriinrange(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')#获取歌曲名称exceptNoSuchElementExceptionasmsg:breakchoice=input(">>>Whichonedoyouwant(youcaninput'quit'togoback(带引号)):")ifchoice=='quit':#从下载界面返回result='quit'else:globalmnamemname=driver.find_element_by_xpath(".//*[@id='search_song']/div[2]/ul[2]/li[%d]/div[1]/a"%choice".get_attribute('itle')a=driver.find_eelement_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')#获取播放元文件urldriver.quit()returnresult#下载回调defcbk(a,b,c):per=100.0*a*b/cifper>100:per=100print'%.2f%%'%perdefmain():print'***************************欢迎使用GREY音乐下载器**********************************由GreyyHawk执导的“打印”**********************************************************************************'time.sleep(1)whileTrue:url=geturl()result=show_results(url)ifresult=='quit':print'\n'continueelse:local='d://%s.mp3'%mnameprint'downloadstart'time.sleep(1)urllib.urlretrieve(result,local,cbk)print'finishdownloading%s.mp3'%mname+'\n\n'if__name__=='__main__':main()作用:总结:当网页中包含大量js时,selenium会很方便,但经过实践,似乎phantomjs效率不高在解析js世纪浏览器高,会出错。以后调用火狐就好了。我不知道为什么。也许这是一张黑脸。简而言之,selenium确实是一个非常强大的框架。我对爬虫很感兴趣。学生必须明白