# -*- coding: utf-8 -*-
import selenium
from selenium import webdriver
import time
import urllib.request
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import re class WeiBoVdeioDown(object):
def __init__(self, url, fileName):
# 设置下载某一个人相册中的视频地址
self.url = url
# 设置下载文件本地地址
self.fileName = fileName def __get_fileName_and_down_url(self):
"""
获得下载视频名称与视频地址
:return:
"""
self.driver = webdriver.Firefox()
self.driver.get(self.url)
WebDriverWait(self.driver, 200, 0.5).until(
EC.presence_of_element_located((By.CLASS_NAME, 'photo_module')))
# 指定像素 var c = document.getElementsByClassName('WB_frame')[0].scrollHeight=1000
# js_code = "document.getElementsByClassName('WB_frame')[0].scrollHeight=8000"
# self.driver.execute_script(js_code)
# print("拖动滑动条到底部...")
# time.sleep(60)
self.li = self.driver.find_elements_by_class_name('photo_module')
# 遍历li得到视频说明与视频连接,并保存
video_inf = {}
# 得到第一个窗口的句柄值
self.fu_handle = self.driver.current_window_handle
for i in self.li:
file_name = i.find_element_by_xpath('./a/div').text
video_url = i.find_element_by_xpath('./a').get_attribute('href')
print("视频名称:", file_name, "视频连接地址:", video_url)
# 此处的视频连接地址不是最终的需要在此请求爬取
if video_url.find("http://video.weibo.com") != -1:
new_url = self.__get_final_video_url(video_url)
video_inf[file_name] = new_url
return video_inf def __get_final_video_url(self, url):
"""
得到最终的视频地址
:param url:
:return:
"""
# 根据url打开新的窗口
js = "window.open('{}')".format(url)
self.driver.execute_script(js) # 输出当前窗口的句柄
# print("当前窗口的句柄:", self.driver.current_window_handle, "ddd:", self.fu_handle)
# 获取当前窗口句柄集合(列表类型) # 得到新的窗口的句柄
child_handle = None
handles = self.driver.window_handles
for handle in handles:
if handle != self.fu_handle:
child_handle = handle
# print("子窗口句柄值:", child_handle)
# print(handles) # 输出句柄集合
# 切换窗口
self.driver.switch_to.window(child_handle)
try:
WebDriverWait(self.driver, 200, 0.5).until(
EC.presence_of_element_located((By.ID, 'playerRoom')))
time.sleep(3)
temp = re.findall(r'<video src="(.*)"', self.driver.page_source)
if len(temp) > 0:
final_url = temp[0].replace("amp;", "")
print("新的地址:ee", "html:" + final_url)
else:
final_url = ""
print("无地址")
time.sleep(3)
self.driver.close()
# 切换回主窗口
self.driver.switch_to.window(self.fu_handle)
except:
final_url = "" return "http:" + final_url def download(self, url):
"""
视频下载
:return:
"""
msg = self.__get_fileName_and_down_url()
for file_name, url in msg.items():
print("fileName:", file_name, "url:", url)
if len(url) > 0:
print("正在下载视频{}".format(file_name))
print("路径:", '{}{}.mp4'.format(self.fileName, file_name))
urllib.request.urlretrieve(url, '{}{}.mp4'.format(self.fileName, file_name))
# //f.us.sinaimg.cn/001S2GEdlx07rpeAv93O01041200q03A0E010.mp4?label=mp4_hd&template=844x480.25.0&Expires=1550404650&ssig=kTARYMkU1Y&KID=unistore,video if __name__ == '__main__':
url = "https://weibo.com/p/1005052420864952/photos?type=video#place" # 个人主页相册中的视频地址(自己可以更改,也可以添加程序来自动爬取)
aa = WeiBoVdeioDown(url, 'E:\玉面小嫣然') # 创建对象,输入下载地址和本地保存地址,默认保存文件名是微博上面名称
url1 = "//f.us.sinaimg.cn/001S2GEdlx07rpeAv93O01041200q03A0E010.mp4?label=mp4_hd&template=844x480.25.0&Expires=1550404650&ssig=kTARYMkU1Y&KID=unistore,video"
# aa.down_url(url)
aa.download(url)

出现问题: 1、可能会出现异常,这里程序对异常处理不是很合适,可以通过后期对函数中的url地址进行判断,
      2、滑动条自动加载,向下滑动,自动加载内容,查看网上解释可以通过以下实现
      # js_code = "document.getElementsByClassName('WB_frame')[0].scrollHeight=8000"
# self.driver.execute_script(js_code)
其中js_code 是要执行的代码,scrollHeight=10000是滑动到底部,这里测试没有成功,其他页面有些可以成功,似乎是元素找错了,需要找到这个滚动条的真正属于的容器才可以,有兴趣的可以自己去试试

第一次实现,不喜勿
#  下载视频,音乐和图片还可以通过如下实现
import re
url= 'https://m10.music.126.net/20190218085252/d95768f7ab127a67ba24c1f6cba652e3/ymusic/015f/0f52/0f0b/65259539178803971cd18a5de46cfb76.mp3'
import requests
r = requests.get(url, stream=True)
with open('E:\\a.mp3', 'wb') as f:
for i in r.iter_content(1024):
f.write(i) url = 'http://f.us.sinaimg.cn/001R971olx07re2bg08g01041203HWqe0E020.mp4?label=mp4_720p&template=1268x720.20.0&Expires=1550453293&ssig=CZ7K3Algxi&KID=unistore,video'
r = requests.get(url, stream=True)
with open('E:\\a.mp4', 'wb') as f:
for i in r.iter_content(1024):
f.write(i)

对于小文件还可以是使用如下下载
with open('E:\\a.mp4', 'wb') as f:
  f.write(r.raw.read()

基于selenium微博个人主页视频下载的更多相关文章

  1. 基于selenium的pyse自动化测试框架

    WebUI automation testing framework based on Selenium 介绍: pyse基于selenium(webdriver)进行了简单的二次封装,比seleni ...

  2. TestNG测试框架在基于Selenium进行的web自动化测试中的应用

    转载请注明出自天外归云的博客园:http://www.cnblogs.com/LanTianYou/ TestNG+Selenium+Ant TestNG这个测试框架可以很好的和基于Selenium的 ...

  3. 转载 基于Selenium WebDriver的Web应用自动化测试

    转载原地址:  https://www.ibm.com/developerworks/cn/web/1306_chenlei_webdriver/ 对于 Web 应用,软件测试人员在日常的测试工作中, ...

  4. 基于Xilinx FPGA的视频图像采集系统

    本篇要分享的是基于Xilinx FPGA的视频图像采集系统,使用摄像头采集图像数据,并没有用到SDRAM/DDR.这个工程使用的是OV7670 30w像素摄像头,用双口RAM做存储,显示窗口为320x ...

  5. 基于selenium+phantomJS的动态网站全站爬取

    由于需要在公司的内网进行神经网络建模试验(https://www.cnblogs.com/NosenLiu/articles/9463886.html),为了更方便的在内网环境下快速的查阅资料,构建深 ...

  6. 视频下载四大神器—如何下载优酷/爱奇艺/腾讯/B站超清无水印视频

      视频下载四大神器—如何下载优酷/爱奇艺/腾讯/B站超清无水印视频  2018-07-11 |  标签»下载, 下载工具, 视频 又是视频下载,老生常谈的话题.阿刚同学已在乐软博客多次与大家分享推荐 ...

  7. YouTube视频下载的12个软件(Win和Mac)

    如今,观看视频已经成为人们生活中重要的一部分.很多时候,我们都需要用到视频,比如教育用途.会议报告.休闲娱乐以及广告宣传等.如果你觉得有时候资源不好找的话,不放去看下YouTube.YouTube是世 ...

  8. 如何把手机app的视频下载到手机上?网页上的视频怎么下载?

    手机上小视频怎么下载?求推荐不需要安装软件的下载方法? 如何把手机app的视频下载到手机上?比如把快手上的视频下载到手机上? 如何免费下载视频? ... 答案当然是用iiiLab提供的在线视频解析下载 ...

  9. YouTube视频下载方法汇总

    YouTube是一个视频共享网站,YouTuber们自己拍摄并制作视频,上传到YouTube,然后用户观看.分享并评论这些内容.虽然在线观看很方便,但是有些时候你却只能处于离线的状态,比如出差.旅游. ...

随机推荐

  1. python 产生随机函数random

    random是内建(built-in)函数,作用是产生随机数 导入模块: 接着就可以调用random模块下的函数了使用 dir(random)可以查看random模块下有哪些函数,结果如下: 最常用的 ...

  2. Jmeter之接口依赖

    一.应用场景 1.现在有两个接口,一个是登录,一个查询,但查询接口必须要依赖登录接口的token,那么通过正则表达式提取器提取登录接口的响应结果 2.现在有两个接口,A接口返回列表数据,另一个查询接口 ...

  3. 【组合计数】visit

    题目大意 从 \((0,0)\) 开始,每次只可走上下左右一个单位长度,可走重复路,求第 \(T\) 步正好走到 \((n,m)\) 的方案数. 答案要求对 \(MOD\) 取模,\(MOD\) 保证 ...

  4. HDU-1051 Wooden Sticks--线性动归(LIS)

    题目大意:有n根木棍(n<5000),每根木棍有一个长度l和重量w(l,w<10000),现在要对这些木头进行加工,加工有以下规则: 1.你需要1分钟来准备第一根木头. 2.如果下一根木头 ...

  5. spring cloud:搭建基于consul的服务提供者集群(spring cloud hoxton sr8 / spring boot 2.3.4)

    一,搭建基于consul的服务提供者集群 1,consul集群,共3个实例: 2, 服务提供者集群:共2个实例: 3,服务消费者:一个实例即可 4,consul集群的搭建,请参考: https://w ...

  6. swoft 切面AOP尝试

    官网文档 https://www.swoft.org/documents/v2/basic-components/aop/ 视频教程 https://www.bilibili.com/video/BV ...

  7. spring boot:用rocketmq消息订阅实现删除购物车商品功能(spring boot 2.3.3)

    一,为什么要使用消息队列实现删除购物车商品功能? 消息队列主要用来处理不需要立刻返回结果的业务, 常见的例子: 用户在下单后,要清除原购物车中的商品, 这个处理过程不需要马上实现也不需要返回结果给用户 ...

  8. spring boot:spring security实现oauth2授权认证(spring boot 2.3.3)

    一,oauth2的用途? 1,什么是oauth2? OAuth2 是一个开放标准, 它允许用户让第三方应用访问该用户在某一网站上存储的私密资源(如头像.照片.视频等), 在这个过程中无须将用户名和密码 ...

  9. phpexcel导出数据 出现Formula Error的解决方案

    phpexcel导出数据报错 Uncaught exception 'Exception' with message 'Sheet1!A1364 -> Formula Error: Unexpe ...

  10. 后羿:我射箭了快上—用MotionLayout实现王者荣耀团战

    前言 昨晚跟往常一样,饭后开了一局王者荣耀,前中期基本焦灼,到了后期一波决定胜负的时候,我果断射箭,射中对面,配合队友直接秒杀,打赢团战一波推完基地.那叫一个精彩,队友都发出了666666的称赞,我酷 ...