题记:

  作为一个业余程序猿,最大的爱好就是电影和音乐了,听音乐当然要来点有档次的。落网的音乐的逼格有点高,一听听了10年。学习python一久了,于是想用python技术把落网的音乐爬下来随便听。

目的:

  将每一期的落网音乐下载到电脑上。

=====================================================================================

版本一:

  刚开始,学习了爬虫技术中的urllib,urllib2,httplib,然后学习了用requests + beautifulsoup获取数据(python理念:能简单为啥还要复杂)。

于是,就有了这个版本。

图1:

  

图2:

  

图3:

  

缺点:

  1、从html元素查找title,再从request请求查看每一首音乐的url,这个半手动的违背了自动下载的初衷。

  2、这个音乐url是规律的命名,如果不规律的话,便不能用了。

  3、单线程下载,速度慢。

需要改进的地方:

  1、音乐url应能自动在网页里搜索,而不需要手动查看request请求的header。

  2、使用多线程。提高下载速度。

=================================================================

版本二:

分析:

  1、打开落网每一期音乐的页面,查看源代码中,不能看到音乐的url,那判定该音乐是由js发起的请求。

  2、要查看web页面中js发起的请求时,用requests模块只能获取静态的url,如果是动态的就没办法了。

  3、通过搜索查阅,找到一款神器,selenium + phantomjs。

    selenium是web自动化测试包,测试直接运行在浏览器中,就像真正的用户在操作一样,详见官网 http://www.seleniumhq.org。

    phantomjs是基于webkit的javascript API,可以编译解释执行JavaScript代码。详见:官网 http://phantomjs.org。

    webdriver api 见 http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.remote.webdriver。

  4、Time fly,just do it。

  在分析过程中,开始一直是requests模块的思维,由于落网的js是压缩过的,想到解压js,再查找相关的dom元素,再进行webElement的click提交,查看请求,但是这种方法一直没有结果。用了chrome 及 opera 的开发者工具,仍然无果。

  换个思路,用了firefox的firebug试试。打开页面后,发现这个东西:

  

  看了看内容,这就是js对象呀。再仔细查看,找到了这个:

  

  

  哎哟,这不就是我要找的东西么,真是破铁鞋无觅处、得来全不费工夫呀。。。

  但是,如果通过代码得到这个东西呢,一直没想到好的办法(业余菜鸟,对http请求了解太少)。

  偶然看到这篇帖子:http://blog.csdn.net/pushiqiang/article/details/51290509

  里面有一句代码得到启发:

  

  这是返回js变量,那我需要的代码变量应用就是firebug里的luooPlayer了。

  测试:

  

  得到结果:

  

  终于,主要的内容搞定。那接下来就是download每一期了,再加上多线程,就能下载了。

代码:

 #coding:utf-8
'''
Auth:daivlin
Date:2016-12-22
''' import os
import time
import urllib
import threading
from selenium import webdriver class Luoo(object):
def __init__(self,issue):
''' init ,参数为期数 '''
self.issue_url = r"http://www.luoo.net/music/" + "%03d"%issue
driver = webdriver.PhantomJS()
driver.get(self.issue_url) #每期名称如: VOL666 欢迎来到巴黎
self.issue_name = "VOL." + "%03d"%issue + " " + driver.title
luooPlayer = driver.execute_script("return luooPlayer") #读取js变量 #音乐列表为元组:(name,url)
self.music_list = []
var = 1
for i in luooPlayer["playlist"]:
self.music_list.append(("%02d"%var,i["mp3"]))
var += 1
driver.quit() def get_issue_name(self):
''' 获取期刊号 '''
return self.issue_name def get_music_list(self):
''' 获取音乐列表 '''
return self.music_list class DownloadThread(threading.Thread):
''' 下载线程'''
def __init__(self,dirname,name,url):
super(DownloadThread,self).__init__()
self.dirname = dirname
self.name = name
self.url = url def run(self):
''' 下载音乐 '''
ABSPATH = os.path.dirname(os.path.realpath(__file__))
DOWNDIR = os.path.join(os.path.join(ABSPATH,"Luoo"),"%s"%self.dirname)
MUSICPATH = os.path.join(DOWNDIR,"%s.mp3"%self.name)
try:
os.mkdir(DOWNDIR)
except:
pass
if not os.path.exists(MUSICPATH):
urllib.urlretrieve(self.url, MUSICPATH)
print "%s.mp3 was downloaded"%self.name for i in range(867,888):
r = Luoo(i)
name = r.get_issue_name()
tds = []
for j in r.get_music_list():
tds.append(DownloadThread(name,j[0],j[1]))
print "start download %s"%name
for td in tds:
td.start()
for tj in tds:
tj.join()
print "%s download complate"%name
print "=========================" print "All have downloaded"

下载效果:

  

待改进的地方:

  1、因为编码问题报错,文件名称用序号代替,需改为真实音乐名称。

==============================================================================

webdriver执行js代码,得到返回的值代码如下:

jscode = '''
var img_src = $("img.vol-cover");
return img_src.attr("src");
'''
img_cover = driver.execute_script(jscode)

==============================================================================

  爬虫只供参考

  做个厚道的程序猿

  别增加人家的服务器压力

==============================================================================

  人生苦短,我用python!

selenium + phantomjs 爬取落网音乐的更多相关文章

  1. Python3.x:Selenium+PhantomJS爬取带Ajax、Js的网页

    Python3.x:Selenium+PhantomJS爬取带Ajax.Js的网页 前言 现在很多网站的都大量使用JavaScript,或者使用了Ajax技术.这样在网页加载完成后,url虽然不改变但 ...

  2. selenium+phantomjs爬取京东商品信息

    selenium+phantomjs爬取京东商品信息 今天自己实战写了个爬取京东商品信息,和上一篇的思路一样,附上链接:https://www.cnblogs.com/cany/p/10897618. ...

  3. selenium+phantomjs爬取bilibili

    selenium+phantomjs爬取bilibili 首先我们要下载phantomjs 你可以到 http://phantomjs.org/download.html 这里去下载 下载完之后解压到 ...

  4. python+selenium+PhantomJS爬取网页动态加载内容

    一般我们使用python的第三方库requests及框架scrapy来爬取网上的资源,但是设计javascript渲染的页面却不能抓取,此时,我们使用web自动化测试化工具Selenium+无界面浏览 ...

  5. selenium + PhantomJS 爬取js页面

    from selenium import webdriver import time _url="http://xxxxxxxx.com" driver = webdriver.P ...

  6. Selenium+PhantomJs 爬取网页内容

    利用Selenium和PhantomJs 可以模拟用户操作,爬取大多数的网站.下面以新浪财经为例,我们抓取新浪财经的新闻版块内容. 1.依赖的jar包.我的项目是普通的SSM单间的WEB工程.最后一个 ...

  7. Python3.x:Selenium+PhantomJS爬取带Ajax、Js的网页及获取JS返回值

    前言 现在很多网站的都大量使用JavaScript,或者使用了Ajax技术.这样在网页加载完成后,url虽然不改变但是网页的DOM元素内容却可以动态的变化.如果处理这种网页是还用requests库或者 ...

  8. 看我怎么扒掉CSDN首页的底裤(python selenium+phantomjs爬取CSDN首页内容)

    这里只是学习一下动态加载页面内容的抓取,并不适用于所有的页面. 使用到的工具就是python selenium和phantomjs,另外调试的时候还用了firefox的geckodriver.exe. ...

  9. selenium+phantomjs爬取动态页面数据

    1.安装selenium pip/pip3 install selenium 注意依赖关系 2.phantomjs for windows 下载地址:http://phantomjs.org/down ...

随机推荐

  1. 使用qmake构建程序(有关.pro和.vcproj编译选项对应关系)

    houjinxin 为了方便统一构建,准备使用qmake构建所有的vc工程,无论是否使用了Qt库,可是在网上找了几天,有几个选项根本就不知道怎么在pro里面配置,才能生成预期的vcproj文件... ...

  2. Binary Tree Preorder Traversal

    Given a binary tree, return the preorder traversal of its nodes' values. For example:Given binary tr ...

  3. Python实例2

    2.企业发放的奖金根据利润提成.利润(I)低于或等于10万元时,奖金可提10%:利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%:20万到40万之间 ...

  4. C#的类及应用

    1.int i=x.Length;//Length(获取字符串的长度,返回一个int类型的值) 2.x=x.Trim();(去掉字符串前后的空格) trimStart();(去掉前面的空格) Trim ...

  5. 论SCRM系统对传统行业的冲击

    SCRM(Social Customer Relationship Management)顾名思义是社会型客户关系管理系统,这在当前的电子商务领域是一个创新的概念,由于社交媒体(Social Medi ...

  6. Google Java编程风格指南

    出处:http://hawstein.com/posts/google-java-style.html 声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Comm ...

  7. IOS上解决内存越界访问问题

    IOS经常会混合使用C代码,而在C中,对内存的读写是很频繁的操作. 其中,内存越界读写 unsigned char* p =(unsigned char*)malloc(10); unsigned c ...

  8. 解决Oracle 11g ORA-01017错误代码

    在oracle的之前版本时, 你的用户名密码是大小写不敏感的, 但在11g中, 数据库默认密码的大小写是敏感的, 于是我们就知道了一个事实, 那就是jdbc在给oracle密码时, 会将其变成大写,真 ...

  9. jquery中$.ajax方法提交表单

    function postdata(){                        //提交数据函数 $.ajax({                                //调用jqu ...

  10. 改进:js修改iOS微信浏览器的title

    问题简介 前端入门没多久,可能连入门也不算,最近网上流行各自书籍改名,什么<前端开发,从入门到放弃>,<Android开发,从入门到改行>之类的,程序员真是个爱自嘲的群体,但我 ...