Rerence: http://www.liuhao.me/2016/09/20/selenium_browsermob_sniff_bilibili_video/

日常生活中,用电脑看视频是非常频繁的事情。最常上去的网站,莫过于B站了。经常在看到一些精彩的视频的时候,想下载下来。当然,少量的视频,我们可以用一些浏览器插件来进行下载。但是如果我们同时想下载成百上千个视频,就需要借助程序来实现了。

我们先来看看我们准备要下载的视频,B站鬼畜区月排名前100的视频列表网页。我们的任务就是要把这100个视频下载下来。

下图是下载下来的视频文件截图。

如果不愿意看代码可以直接看视频:

爬取100个视频的网页并存储

我们第一步要做的就是要讲这100个视频的网址爬取下来。打开排名网页,查看其网页源文件,我们发现源文件中并没有视频列表的信息。这是因为这个视频列表的页面是由http://static.hdslb.com/js/core-v5/page.ranking.js这个javascript文件生成的。这时候,如果用urllib或者requests这样的工具,就需要解析js文件才能爬取到索要的信息。这里我们也不用费劲去解析这个js文件。直接利用Selenium包。Selenium包由于是打开了浏览器,进行了渲染,所以得到的page_source是渲染之后的网页源文件,这个源文件中包含了这100个视频列表的信息。

得到的视频列表的信息,接下来就可以直接用regex正则表达式找到所需要的信息,这里我们提取三个信息。1,视频排名,2,视频链接,3,视频名称。整个爬取的过程代码如下:

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import re
from selenium import webdriver
 
#############找到要下载的链接#############
browser = webdriver.Firefox()
#如果不想看到浏览器,可以用无痕浏览器phantomJS
# browser = webdriver.PhantomJS(executable_path="/Users/Hao/anaconda/bin/PhantomJS")
# 这边我们取B站鬼畜区排名页面,得到网页源代码
rank_url = "http://www.bilibili.com/ranking#!/origin/119/0/30/"
 
# 用Selnium的好处还在于返回的页面是js执行之后的页面。
browser.get(rank_url)
content = browser.page_source
browser.quit()
 
# 找到排名前100的视频页面
pattern = re.compile('<div class="rank-item"><div class="num">(.*?)'
                     '</div>.*?href="(.*?)"><div class="preview">.*?div class="title">(.*?)</div>', re.S)
item = re.findall(pattern, content)

运行这段程序,我们能够得到如下的结果。这样我们就得到了所有视频的链接地址。注意,如果我们只想让代码静静的运行,而不想看到浏览器打开、关闭的画面。那么可以不使用Firefox和Chrome,可以使用PhantomJS,这个浏览器是无头浏览器,也即浏览器运行的时候是没有界面的。

视频文件地址的嗅探与下载

在得到所有的视频链接之后,接下来就到了这篇文章最重要的部分了。给定一个视频页面的地址,例如http://www.bilibili.com/video/av6108496/ ,我们怎么下载这个页面的视频呢?

最传统的做法是,用尽各种办法,来分析、解析以及猜测视频的源地址。这样的做法有两个缺点。第一个缺点是,每个视频网站的视频源地址规则差别巨大,代码难以复用。第二个缺点是,一旦视频网站有所改版,又得重新分析、解析以及猜测源地址。

这里面,我们使用一个比较少用的办法。由于我们使用的是Selenium,也就是说实际上是发生了网页的加载和渲染的,因此就一定有Network Traffic。我们只要利用工具来嗅探到这个Network Traffic就行。幸运的是,目前有一款从JAVA上移植过来的工具可以做到这一点,这就是BrowserMob。我们利用BrowserMob建立监控,监控Selenium打开网页所产生的Network Traffic,再从众多的Network Traffic中找到视频链接地址。

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#####################视频嗅探及下载#####################
# 导入嗅探包BrowserMob
import time
import requests
from browsermobproxy import Server
 
 
# 设置网路监控代理
server = Server("/Users/Hao/anaconda/bin/browsermob/bin/browsermob-proxy")
server.start()
proxy = server.create_proxy()
 
# 设置浏览器
profile = webdriver.FirefoxProfile()
profile.set_proxy(proxy.selenium_proxy())
driver = webdriver.Firefox(firefox_profile=profile)
 
##得到监控
proxy.new_har("bilibili")
# 得到网页源代码
#这里我们只打开第一个视频
driver.get(base_url + item[0][1])
 
# 打开视频
# driver.find_element_by_name("pause_button").click()
time.sleep(1)
# 得到网络监控数据,json数据
content = proxy.har  # returns a HAR JSON blob
server.stop()
driver.quit()
 
# 视频链接分析
video_box = []
data = content['log']['entries']
for j in range(len(data)):
    url = data[j]['request']['url']
    if url.find("mp4") != -1:
        print(url)
        video_box.append(url)
 
 
 
# 视频下载,存储到data文件夹
if len(video_box) >= 2:
    hd_video_url = video_box[1]
    video = requests.get(hd_video_url, timeout=10)
    string = "../data/" + item[i][0] + item[i][2] + '.mp4'
    fp = open(string, 'wb')
    fp.write(video.content)
else:
    print("视频下载出现问题,视频页面不存在")

上面这段代码的作用是,首先获得加载页面后的Network Traffic数据,从这些数据中获取视频源地址的链接。再利用requests将视频下载到电脑中去。。

完整的代码如下。这个代码实现了下载这个页面的100个视频的任务。

 
 
 
 
 
 

Python

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
 
import re
from selenium import webdriver
 
#############找到要下载的链接#############
browser = webdriver.Firefox()
#如果不想看到浏览器,可以用无痕浏览器phantomJS
# browser = webdriver.PhantomJS(executable_path="/Users/Hao/anaconda/bin/PhantomJS")
# 这边我们取B站鬼畜区排名页面,得到网页源代码
rank_url = "http://www.bilibili.com/ranking#!/origin/119/0/30/"
 
# 用Selnium的好处还在于返回的页面是js执行之后的页面。
browser.get(rank_url)
content = browser.page_source
browser.quit()
 
# 找到排名前100的视频页面
pattern = re.compile('<div class="rank-item"><div class="num">(.*?)'
                     '</div>.*?href="(.*?)"><div class="preview">.*?div class="title">(.*?)</div>', re.S)
item = re.findall(pattern, content)
 
base_url = "http://www.bilibili.com"
 
#####################视频嗅探及下载#####################
# 导入嗅探包BrowserMob
import time
import requests
from browsermobproxy import Server
 
for i in range(len(item)):
    # 设置网路监控代理
    server = Server("/Users/Hao/anaconda/bin/browsermob/bin/browsermob-proxy")
    server.start()
    proxy = server.create_proxy()
 
    # 设置浏览器
    profile = webdriver.FirefoxProfile()
    profile.set_proxy(proxy.selenium_proxy())
    driver = webdriver.Firefox(firefox_profile=profile)
 
    ##得到监控
    proxy.new_har("bilibili")
    # 得到网页源代码
    driver.get(base_url + item[i][1])
 
    # 打开视频
    # driver.find_element_by_name("pause_button").click()
    time.sleep(1)
    # 得到网络监控数据,json数据
    content = proxy.har  # returns a HAR JSON blob
    server.stop()
    driver.quit()
 
    # 视频链接分析
    video_box = []
    data = content['log']['entries']
    for j in range(len(data)):
        url = data[j]['request']['url']
        if url.find("mp4") != -1:
            print(url)
            video_box.append(url)
 
 
    # 视频下载,存储到data文件夹
    if len(video_box) >= 2:
        hd_video_url = video_box[1]
        video = requests.get(hd_video_url, timeout=10)
        string = "../data/" + item[i][0] + item[i][2] + '.mp4'
        fp = open(string, 'wb')
        fp.write(video.content)
    else:
        print("视频下载出现问题,视频页面不存在")

利用Selenium和Browsermob批量嗅探下载Bilibili网站视频的更多相关文章

  1. 爬虫练习二:GUI+下载百思不得姐网站视频

    环境 python2.7 pycharm 课题:Python爬取视频(桌面版)---爬虫,桌面程序应用 优点:语法简洁,入门快,代码少,开发效率高,第三方库 1.图形用户界面---GUI 2.爬虫,爬 ...

  2. Python 批量下载BiliBili视频 打包成软件

    文章目录 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这三类人,我给大家 ...

  3. 利用python爬虫关键词批量下载高清大图

    前言 在上一篇写文章没高质量配图?python爬虫绕过限制一键搜索下载图虫创意图片!中,我们在未登录的情况下实现了图虫创意无水印高清小图的批量下载.虽然小图能够在一些移动端可能展示的还行,但是放到pc ...

  4. Python爬虫下载Bilibili番剧弹幕

    本文绍如何利用python爬虫下载bilibili番剧弹幕. 准备: python3环境 需要安装BeautifulSoup,selenium包 phantomjs 原理: 通过aid下载bilibi ...

  5. 用selenium自动加载浏览器下载图片

    上一篇用requests这个库进行图片的批量下载,只所以可以这样做,是因为豆瓣提供的XHR的接口API,而且接口返回的数据类型为json格式,所以使用起来非常的方便,但是有时候我们需要分析html格式 ...

  6. 利用Selenium自动化web测试

    简介: Selenium 是一个没有正式指导手册的开源项目,这让测试人员的问题调查很费时间.本文为基于 Selenium 1.0(发布于 2009 年 6 月)的测试期间的常见问题提供最佳实践. 简介 ...

  7. python利用selenium库识别点触验证码

    利用selenium库和超级鹰识别点触验证码(学习于静谧大大的书,想自己整理一下思路) 一.超级鹰注册:超级鹰入口 1.首先注册一个超级鹰账号,然后在超级鹰免费测试地方可以关注公众号,领取1000积分 ...

  8. Python爬虫实战八之利用Selenium抓取淘宝匿名旺旺

    更新 其实本文的初衷是为了获取淘宝的非匿名旺旺,在淘宝详情页的最下方有相关评论,含有非匿名旺旺号,快一年了淘宝都没有修复这个. 可就在今天,淘宝把所有的账号设置成了匿名显示,SO,获取非匿名旺旺号已经 ...

  9. 【python爬虫】利用selenium和Chrome浏览器进行自动化网页搜索与浏览

    功能简介:利用利用selenium和Chrome浏览器,让其自动打开百度页面,并设置为每页显示50条,接着在百度的搜索框中输入selenium,进行查询.然后再打开的页面中选中“Selenium - ...

随机推荐

  1. 上传Android或Java库到Maven central repository(转载)

    主要介绍利用Sonatype将jar或aar提交到Maven的中央仓库. 是不是希望将自己的jar或是aar传到maven官方库中,在The Central Repository中可以被其他人搜索使用 ...

  2. Junit单元测试的简单使用(主要是在spring框架下的项目)

    首先是解释什么是单元测试,单元测试是指对于一个大型项目里,对于单一模块或者单一接口的测试. 然后解释为什么要写单元测试,首先对于一个大型的项目,如果你每次都要重启一遍服务器调页面或者接口的bug,那就 ...

  3. scroll、scrollBy和 scrollTo三种方法定位滚动条位置

    在默认情况下,页面加载完后默认滚动在最顶端,有些时候我们需要在页面打开后,定位滚动条的位置,比如,横向和纵向滚动条居中,实现页面滚动的方法有三种:scroll.scrollBy和 scrollTo,三 ...

  4. css脱离文档流

    作者:张秋怡链接:http://www.zhihu.com/question/24529373/answer/29135021来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出 ...

  5. Not a million dollars ——a certain kind of ingenuity, discipline, and proactivity that most people seem to lack

    原文:http://ryanwaggoner.com/2010/12/you-dont-really-want-a-million-dollars/a certain kind of ingenuit ...

  6. jQuery常用及基础知识总结(一)

    Attribute: $(”p”).addClass(css中定义的样式类型); 给某个元素添加样式$(”img”).attr({src:”test.jpg”,alt:”test Image”}); ...

  7. 2016沈阳网络赛 QSC and Master

    QSC and Master Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

  8. ARMs3c2440开发板挂接NFS服务

    1.修改IP地址,使虚拟机,电脑PC机.开发板位于同一个网段,开发板网线与电脑网络接口连接,如PC:ip 192.168.0.112 255.255.255.0 虚拟机 192.168.0.8 255 ...

  9. win8 explorer 进程频繁奔溃的原因及处理

    最近  ,  win8 系统中的 explorer 进程总是频繁奔溃    ,    想想可能是最近新装或更新了什么软件引起的 . 查看了记录奔溃的详细信息 ,  果不其然 , 是最近更新的快播新版本 ...

  10. c# 动态产生控件 注册动态控件事件

    用CheckEdit演示 其他控件类推 CheckEdit AllSele = new CheckEdit(); AllSele.Location = new System.Drawing.Point ...