利用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 - ...
随机推荐
- vue数据源转json问题
开发过程中使用到了vue框架进行前端批量数据的处理,将批量数据转换为json格式进行ajax传参时需要注意将vue数据源得到的json结果进行如下处理,webservice接收json数据时无法有效的 ...
- mysql导出表结构
在命令行下mysql的数据导出有个很好用命令mysqldump,它的参数有一大把,可以这样查看: mysqldump 最常用的: mysqldump -uroot -pmysql databasefo ...
- HDU 1251 统计难题(字典树计算前缀数量)
字典树应用,每个节点上对应的cnt是以它为前缀的单词的数量 #include<stdio.h> #include<string.h> struct trie { int cnt ...
- oracle 主键自动增长
oracle 主键自动增长 2009-12-11 16:07:00| 分类: 数据库资料|字号 订阅 这几天搞Oracle,想让表的主键实现自动增长,查网络实现如下: create tabl ...
- Bundle versions string, short与Bundle version
在提交更新的app至appstore中时,需要在**.plist中设置app的version信息.Bundle versions string, short --- CFBundleShortVers ...
- 在js中如何得到上传文件的大小。
<html> <head> <script language="javascript"> function getSize() { ...
- Email:2017
Hi, 2017,我对自己有一个小小的期望:写写文字,安安心. Enjoy a simple life. 如我所愿吧! 明年再来问候你.
- unity3d之在屏幕上画线
如何在屏幕上画线,简单的代码如下: using UnityEngine; public class Test : MonoBehaviour { void OnGUI() { GL.LoadOrtho ...
- windows服务器下IIS7 安装URL Rewrite(URL重写)模块
URL Rewrite Module是一个基于规则的URL重写引擎,用于在URL被Web服务器处理之前改变请求的URL.对于动态Web应用程序,它可以为用户和seo/seo.html" ta ...
- hibernate---一对一单向主键关联(不重要)
比如, husband的id参考wife的id husband.java: package com.bjsxt.hibernate; import javax.persistence.Entity; ...