文档章节

下载极客学院的视频

 蜗牛奔跑
发布于 2016/11/01 17:25
字数 764
阅读 30
收藏 0
# !/usr/bin/python
# coding:utf-8

import urllib, os, urllib2, cookielib, re

# 下载极客学院的视频
# 需要一个vip账号(验证邮箱和手机会有体验vip)
class DownCourse(object):
	# 给urllib2添加cookie支持
	# path: 下载的视频要保存的文件夹
	def __init__(self,path):
		# 初始化一个CookieJar来处理Cookie
		cookieJar = cookielib.CookieJar()
		# 实例化一个全局opener
		opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookieJar))
		# 把这个cookie处理机制装上去,大概是这个意思-.-
		urllib2.install_opener(opener)
		
		self.folderPath = path
		# 判断文件夹是否存在
		folderExists = os.path.exists(self.folderPath)
		if not folderExists:
			os.mkdir(self.folderPath)
		
	# 登陆函数
	def login(self):
		# 从登录页面获取登陆参数
		login_url = 'http://passport.jikexueyuan.com/sso/login'
		# 登陆信息发送到这个地址
		passport_url = 'http://passport.jikexueyuan.com/submit/login?is_ajax=1'
		verifyCode_url = 'http://passport.jikexueyuan.com/sso/verify'
		
		# 获取登陆页面源码
		request = urllib2.urlopen(login_url)
		html = request.read()
		request.close()
		
		# 获取登陆要post的数据
		expire = re.search(r"(?s)value='(.*?)' name='expire",html)
		# 验证码
		verifyCodeGifPath = '/tmp/jikexueyuan.gif'
		request = urllib2.urlopen(verifyCode_url)
		gif = request.read()
		request.close()
		fGif = open(verifyCodeGifPath,'w')
		fGif.write(gif)
		fGif.close()
		# 读取保存到本地的验证码图片
		os.system('eog ' + verifyCodeGifPath)
		verify = raw_input("请输入图中的验证码:")
		
		data = {
			'expire': expire.group(1),
			'referer': 'http%3A%2F%2Fwww.jikexueyuan.com%2F',
			'uname': 用户名,
			'password': 密码,
			'verify': verify,
		}
		post_data = urllib.urlencode(data)
		
		request = urllib2.Request(passport_url,post_data)
		# 给一个useragent,防止被认为是爬虫程序
		request.add_header('User-Agent', 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36')
		# 发送登录请求
		request = urllib2.urlopen(request)
		request.close()
		print '登陆完成'

	# courseUrl: 课程地址首页,例如:http://www.jikexueyuan.com/course/989.html
	def download(self, courseUrl):
		# 获取课程名称
		request = urllib2.urlopen(courseUrl)
		coursePageHtml = request.read()
		request.close()
		courseName = re.search(r'(?s)<title>(.*?)-',coursePageHtml).group(1)
		# 课程数量
		courseCount = int(re.search(r'(?s)class="timebox"><span>(.*?)课时',coursePageHtml).group(1))
		# 存储视频的文件夹路径
		folderPath = self.folderPath + courseName + '/'
		# 判断文件夹是否存在
		folderExists = os.path.exists(folderPath)
		if not folderExists:
			os.mkdir(folderPath)
		
		print '课程名:' + courseName + ' 课程数量:' + str(courseCount)
		# 课程的编号,构建课程的页面地址
		i = 0
		while i < courseCount:
			i += 1
			pageUrl = courseUrl.split('.html')[0] + '_' + str(i) + '.html?ss=1'
			# 本节课程的html代码
			request = urllib2.urlopen(pageUrl)
			pageHtml = request.read()
			request.close()
			# 本节课程的名称
			name = re.search(r'(?s)<title>(.*?)-',pageHtml).group(1)
			# 本节课程的视频地址
			videoUrl = re.search(r'<source src="(.*?)"',pageHtml)
			# 有的页面写的课时比实际课时多,会匹配不到视频地址
			if videoUrl == None:
				continue
			else:
				videoUrl = videoUrl.group(1)
			print '正在下载' + name + '...'
			# 存储视频的Path: 总路径/课程名/每一节的名称
			urllib.urlretrieve(videoUrl,folderPath + str(i) + name + '.mp4',self.cbk)
		print '下载完成'
	
	# 从网上下载的可以显示下载进度的函数
	# \b是我加的,产生了很奇特的显示效果,还行
	def cbk(self,a, b, c): 
	    '''回调函数
	    @a: 已经下载的数据块
	    @b: 数据块的大小
	    @c: 远程文件的大小
	    ''' 
	    per = 100.0 * a * b / c 
	    if per > 100: 
	        per = 100 
	    print '%.2f%%\b\b\b\b\b\b' % per,
		
# 建立下载对象,参数是即将下载的这些视频放的目录,程序会根据课程名在这个文件夹里面再建文件夹
down = DownCourse('/home/geekgao/视频/SpringMVC/')
down.login()

# 下载一个页面中的所有课程
request = urllib2.urlopen('http://www.jikexueyuan.com/course/springmvc/')
html = request.read()
request.close()
courseUrls = re.findall(r'class="lesson-info-h2"><a href="(.*?)"',html)

for courseUrl in courseUrls:
	down.download(courseUrl)

 

© 著作权归作者所有

下一篇: zabbix_api.py
粉丝 38
博文 615
码字总数 118352
作品 0
海淀
私信 提问
极客学院新版抢鲜看 注册即送VIP会员

hi,兄弟。在学习编程时你是不是也遇到过这些问题? 基础差,底子薄,自学压力大? 每天代码bug一大堆,回家倒头就想睡? 新技术更迭太快,不知道学习哪些? 今天,在极客学院,先送福利,再...

极客学院
2014/05/26
5.8K
58
极客学院年VIP卡原价260的F码,200出售

F码是中国最大的IT职业在线教育平台——极客学院推出的VIP时间兑换码,凭此可在极客学院官网兑换年VIP,畅享平台上所有IT技术课程。 购买请点击 http://www.bejson.com/other/jikefma/ 这个会...

废柴大叔
2015/09/22
110
0
关于node.js或者安卓学习简单介绍。

1、node.js 系列。 环境:node安装,mongodb安装,rebomongo可视化mongodb工具使用,webstrom使用。NPM模块使用。 学习基础后,学习express框架以及mongoose。然后实现一个学生增删改查。 多...

761218914
2016/09/28
13
0
来自IOS开发工程师的零基础自学HTML5经验分享

移动互联网的火爆,而Html具有跨平台、开发快的优势,越来越受到开发者的青睐。感谢IOS开发工程师“小木_Boy”’带来的HTML5学习经验分享。 一、学习途径 1、很多视频网站 比如慕课、和极客学...

inw3cschool
2017/03/21
0
0
【极客学院免费直播课】第二期 Android draw9patch切图工具的使用

极客学院android免费网络直播课(第二期) 用户手中漂亮的的UI界面,并非直接来自于设计师呕心沥血创作的效果图,而是由多个单独的切图经由开发同学用技术重新拼贴渲染而来。切图作为设计师与开...

jikexueyuan
2014/04/23
512
1

没有更多内容

加载失败,请刷新页面

加载更多

nginx学习笔记

中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。 是连接两个独立应用程序或独立系统的软件。 web请求通过中间件可以直接调用操作系统,也可以经过中间件把请求分发到多...

码农实战
今天
5
0
Spring Security 实战干货:玩转自定义登录

1. 前言 前面的关于 Spring Security 相关的文章只是一个预热。为了接下来更好的实战,如果你错过了请从 Spring Security 实战系列 开始。安全访问的第一步就是认证(Authentication),认证...

码农小胖哥
今天
9
0
JAVA 实现雪花算法生成唯一订单号工具类

import lombok.SneakyThrows;import lombok.extern.slf4j.Slf4j;import java.util.Calendar;/** * Default distributed primary key generator. * * <p> * Use snowflake......

huangkejie
昨天
12
0
PhotoShop 色调:RGB/CMYK 颜色模式

一·、 RGB : 三原色:红绿蓝 1.通道:通道中的红绿蓝通道分别对应的是红绿蓝三种原色(RGB)的显示范围 1.差值模式能模拟三种原色叠加之后的效果 2.添加-颜色曲线:调整图像RGB颜色----R色增强...

东方墨天
昨天
11
1
将博客搬至CSDN

将博客搬至CSDN

算法与编程之美
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部