利用Selenium和Browsermob批量嗅探下载Bilibili网站视频
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网站视频的更多相关文章
- 爬虫练习二:GUI+下载百思不得姐网站视频
环境 python2.7 pycharm 课题:Python爬取视频(桌面版)---爬虫,桌面程序应用 优点:语法简洁,入门快,代码少,开发效率高,第三方库 1.图形用户界面---GUI 2.爬虫,爬 ...
- Python 批量下载BiliBili视频 打包成软件
文章目录 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这三类人,我给大家 ...
- 利用python爬虫关键词批量下载高清大图
前言 在上一篇写文章没高质量配图?python爬虫绕过限制一键搜索下载图虫创意图片!中,我们在未登录的情况下实现了图虫创意无水印高清小图的批量下载.虽然小图能够在一些移动端可能展示的还行,但是放到pc ...
- Python爬虫下载Bilibili番剧弹幕
本文绍如何利用python爬虫下载bilibili番剧弹幕. 准备: python3环境 需要安装BeautifulSoup,selenium包 phantomjs 原理: 通过aid下载bilibi ...
- 用selenium自动加载浏览器下载图片
上一篇用requests这个库进行图片的批量下载,只所以可以这样做,是因为豆瓣提供的XHR的接口API,而且接口返回的数据类型为json格式,所以使用起来非常的方便,但是有时候我们需要分析html格式 ...
- 利用Selenium自动化web测试
简介: Selenium 是一个没有正式指导手册的开源项目,这让测试人员的问题调查很费时间.本文为基于 Selenium 1.0(发布于 2009 年 6 月)的测试期间的常见问题提供最佳实践. 简介 ...
- python利用selenium库识别点触验证码
利用selenium库和超级鹰识别点触验证码(学习于静谧大大的书,想自己整理一下思路) 一.超级鹰注册:超级鹰入口 1.首先注册一个超级鹰账号,然后在超级鹰免费测试地方可以关注公众号,领取1000积分 ...
- Python爬虫实战八之利用Selenium抓取淘宝匿名旺旺
更新 其实本文的初衷是为了获取淘宝的非匿名旺旺,在淘宝详情页的最下方有相关评论,含有非匿名旺旺号,快一年了淘宝都没有修复这个. 可就在今天,淘宝把所有的账号设置成了匿名显示,SO,获取非匿名旺旺号已经 ...
- 【python爬虫】利用selenium和Chrome浏览器进行自动化网页搜索与浏览
功能简介:利用利用selenium和Chrome浏览器,让其自动打开百度页面,并设置为每页显示50条,接着在百度的搜索框中输入selenium,进行查询.然后再打开的页面中选中“Selenium - ...
随机推荐
- jq判断元素是否显示
为了判断元素是否显示,jquery中用is()来实现, $(function(){ $(obj).bind('click',function(){ if(obj.is(:visible)){ //编写 ...
- 高性能web开发:如何加载js,,js的存放位置
外部JS的阻塞下载 所有浏览器在下载JS的时候,会阻止一切其他活动,比如其他资源的下载,内容的呈现等等.至到JS下载.解析.执行完毕后才开始继续并行下载其他资源并呈现内容. 有人会问:为什么JS不能像 ...
- zf-关于分页必写的代码
1 存储过程 ALTER PROCEDURE [dbo].[getStatForXXGKWeb] ), ), ), @page int, -- 必写的 @pageRows int,-- 必写的 @al ...
- 关于自定义jar包(tomcat)的添加
1 鼠标右击工程 选择 properties 或者 Ait + Enter 2 选择Libraries 3 点击Add Library... 4 选择User Library 点击 Next 5 如 ...
- 【转】在 2016 年做 PHP 开发是一种什么样的体验?(一)
原文: https://www.v2ex.com/t/312651 在 2016 年做 PHP 开发是一种什么样的体验?(一) 嘿,我最近接到一个网站开发的项目,不过老实说,我这两年没怎么接触编程,听 ...
- js中将 整数转成字符,,将unicode 编码后的字符还原出来的方法。
一.将整数转成字符: String.fromCharCode(17496>>8,17496&0xFF,19504>>8,19504&0xFF,12848> ...
- java dom4j解析xml实例
java利用dom4j解析xml 需要的jar包: dom4j官方网站在 http://www.dom4j.org/ 下载dom4j-1.6.1.zip 解开后有两个包,仅操作XML文档的话把dom4 ...
- SMB/CIFS协议解析
1.SMB协议与CIFS协议的区别 139端口是一种TCP端口,该端口在通过网上邻居访问局域网中的共享文件或共享打印机时就能发挥作用.445端口也是一种TCP端口,该端口在 Windows 2 ...
- 第一个元素<flout>写了,想在他的旁边加一个元素.IE6会出现缝隙. 不要用margin撑开,要用flout
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- N层架构实现的一个小例子
主要用到了[单例,抽象工厂,缓存,N层,反射]等知识.架构图如下: 解决方案用到的项目列表如下: 在接口项目中,定义一个IUER接口. namespace IDAL { public interfac ...