澳门在线威尼斯官方 > 澳门在线威尼斯官方 > 教你一步一步用,非中文自动翻译

原标题:教你一步一步用,非中文自动翻译

浏览次数:115 时间:2019-11-05

 

转自:

声明:我写的所有文章都是发在博客园的,我看到其他复制粘贴过去的 连个出处也不写,直接打上自己的水印。。。真是没的说了。

开始

这个教程十分适合初学 Node.js 的初学者看(因为我也是一只初学的菜鸟~)

在这里,我就默认大家都已经在自己的电脑上搭建好 node.js,我就不再多讲了,如果你是第一次接触 Node.js 那么先请到可以到Node.js 中文网(英文) 上看看,里面有完整的安装教程。

想直接看源码的可以直接移步到 github imooc-video-download。

前言:前段时间搞了一些爬视频的项目,代码都写好了,这里写文章那就在来重新分析一遍吧。有不好的地方 莫见怪 : )

第一步

说到下载视频,首先我们要先有个大概思路:

  • 发送请求—>获取视频下载地址->发送下载请求下载视频—>把视频文件写入本地

  • 因为需要发起请求,在这里我用到 superagent 是个 http 方面的库,可以发起 get 或 post 请求。

  • 因为要解析网页,在这里我使用 cheerio 我们可以把它当做一个 Node.js 版的 jQuery,用来从网页中以 css selector 取数据,使用方式跟 jquery 一样的。

  • 写文件的话就用 Node.js 自带的 fs 文件模块。

环境:python2.7 + win10

第二步

既然思路有了,那就开始上代码吧~

 

新建一个项目:

$ cd ~/Documents/NodeJs
$ mkdir immoc-video-download
$ cd immoc-video-download
$ npm init

ps:接下来会让你填很多信息,全部直接回车就可以(也可以认真写写),最后需要输入 yes 加回车结束。

我解释一下一步,npm init 是初始化一个项目,互动式帮我们生成一个最简单的 package.json 文件,而这个 package.json 文件包含我们项目名,作者,项目依赖等等信息。

开始先说一下,访问youtube需要科学上网,请自行解决,最好是全局代理。

安装项目模块

$ npm install superagent cheerio --save

--save 是个可选参数,加了它之后会自动帮我们把上面安装的两个模块自动写入到 package.json 里面。

ok,现在开始,首先打开网站观察

新建入口文件

$ touch app.js #新建一个名为 app.js 的文件

到这一步,这个爬虫项目所需要的环境和依赖的都已经准备好了。


 

第三步

图片 1

引入模块依赖:

用编辑器打开 app.js 这个文件,在里面输入

var superagent = require('superagent');
var cheerio = require('cheerio');
var fs = require('fs');

 

搭好基本框架

var superagent = require('superagent');
var cheerio = require('cheerio');
var fs = require('fs');

var url = '慕课网课程'
var savePath = '保存文件路径'

superagent
    .get(url)
    .end(function(err, res) {

    })

// 获取视频 url
var getVideoUrl = function() {

}

// 下载视频
var downloadVideo = function() {

}

基本框架已经没问题了,不过里面啥都没,怎么办?

别慌,爬虫嘛,当然是在网页上爬数据。

 网站很干净清爽,这次做的是基于关键字搜索来爬那些相关视频,这样就能很好的分类了,若输入中文搜索,那结果也一般都是国内视频,英文的话 那就是国外的。

第四步

这里先来测试中文的 ,输入''搞笑'',搜出来很多视频,也可以根据条件筛选,YouTube视频链接很有规律,都是这种 v值不一样,这里就叫id吧。

分析慕课网

 

源码解析

先上图!

图片 2

imooc 源码

  • 看这里!!

  • 我们来看看慕课网的网站源码,发现没?每个视频都有一个视频的id,再来看看课程的 URL 课程也有一个课程 ID 。

  • 我们都知道这个网站的视频是需要登录之后才可以看观看的,这就代表我们在请求的时候要在 headers 里做些手脚,把 cookies 放进去

图片 3

请求头分析

先上图!

图片 4

imooc headers

看完这些我们应该有个大概清晰的思路了吧,废话不多说,完善代码。

 

解析视频 id 和 filename

ok,先从最简单的开始,查看网页源代码看看这些视频链接是否都是在里面,我睁大了我的24k单身狗的眼睛找出来了。。。看了一下,视频信息全在这个<script>标签里面。

看看核心代码

 

先写一个请求头:
var headers = {
    "Cache-Control": "max-age=0",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
    "Referer": "http://www.imooc.com/",
    "Accept-Encoding": "gzip, deflate, sdch",
    "Accept-Language": "zh-CN,zh;q=0.8",
    "Cookie": cookies // 在外面定义一个 cookies 变量存放自己的 cookies
};

这里就是直接把上一个截图里的 request headers 里面的所有数据都 copy 进去。

图片 5

解析 html:
superagent
    .get('www.imooc.com/learn/' + courseId) // 在外面设置一个 courseId 的参数
    .set(headers)
    .end(function(err, res) {

        // res.text 通过请求获取的 html 页面
        var $ = cheerio.load(res.text);

        // 获取课程的名称
        $('.course-infos .hd').find('h2').each(function(item) {
            courseTitle = $(this).text();
        })

        // .chapter 是包含所有 video 的容器,这是 jquery 语法,为了获取所有的视频 id 和 filename
        $('.chapter').each(function(item) {

            var videos = $(this).find('.video').children('li')

            videos.each(function(item) {
                var video = $(this).find('a')
                var filename = video.text().replace(/(^\\\\s+)|(\\\\s+$)/g,"");
                var id = video.attr('href').split('video/')[1]

                // 视频 id 和 视频文件名字
                console.log(id, filename);
            })
        })
    })

上面那段代码帮我们获取了每个视频的 id 和 它的文件名,那么接下来我们只需要获取它的视频下载地址就 ok。

 

获取下载地址:

这时候我们还得到视频播放页面去抓取一下网站播放视频请求的地址:

图片 6

imooc headers

在过滤器中输入视频的格式 mp4 过滤一下(找不到的话试试 flv 之类的),看到出现了我们想要的 mp4 文件,是不是特别激动!!

看一下头文件,什么鬼?!这串东西什么??可以肯定,这不是我们想要的。

我们试试输入视频 id 作过滤条件

图片 7

imooc headers

点那个 preview(response显示的东西太长很难截图) 看看它给我们返回什么:

图片 8

imooc headers

看!出来了。

我们可以看到这是 ajax 请求的一个地址,没关系,既然给我们找到了,那就拼接一下就 ok 了。

上代码!

var getVideoUrl = function(id, callback) {
    superagent.get('http://www.imooc.com/course/ajaxmediainfo/?mid=' + id + '&mode=flash')
        .end(function(err, res) {
            var url = JSON.parse(res.text);

            if(url.result == 0) {
                url = url.data.result.mpath[0];
                callback(url);
            }
        })
}

 既然如此,那就直接上正则表达式来匹配

下载视频

有了上面的 url 接下来我们的功夫就简单多了。

直接上代码:

var downloadVideo = function(url, filename, callback) {

    // 去掉文件名后面的时间
    // 2-1 登录动画-冒泡 (10:53) —> 2-1 登录动画-冒泡.mp4
    filename = filename.replace(/\\\\(.*\\\\)/,'') + '.mp4';

    // 创建一个以课程名字命名的目录存放视频
    var dirPath = savePath + courseTitle + '/'
    if (!fs.existsSync(dirPath)) {
        fs.mkdirSync(dirPath);
    }

    console.log('开始下载第' + courseTotalCount + '个视频' + filename + ' 地址: ' + url);
    var writeStream = fs.createWriteStream(dirPath + filename);
    writeStream.on('close', function() {

        callback(filename);
    })

    var req = superagent.get(url)
    req.pipe(writeStream);

}

看到这里是不是特别兴奋!!!

别急,接着我们再加入这行代码。

var courseId = process.argv.splice(2, 1);

ok!大功告成!

"url":"/watch?v=(.*?)","webPageType"

第五步

我们下载视频的时候只需要在终端执行下面这行命令就可以了。

$ node app courseId # 你想下载的视频 id

这个项目已上传到 github imooc-video-download

 

文/laizw(简书作者)
原文链接:
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

这样就能匹配出ID来。但是 这好像只有第一页的视频,那第二页的呢,经常观察,此方法不行,视频翻页是基于ajax请求来的,源码里面的信息始终都是第一页的数据,ok 那既然这样,我们来分析ajax请求,我喜欢用谷歌浏览器,打开开发者工具,network,来抓包。

鼠标一直往下拉,会自动请求,是个post请求,一看就是返回的视频信息。

图片 9

 

 看到这里很高兴,离胜利已经不远了。但,我们先来看下headers 以及发送的post参数,看了之后 就一句 wtf。。。

 

本文由澳门在线威尼斯官方发布于澳门在线威尼斯官方,转载请注明出处:教你一步一步用,非中文自动翻译

关键词:

上一篇:澳门在线威尼斯官方Smobiler能让你在Visual

下一篇:第三方库安装,python软件包安装