独书先生 Menu

Viewing all items for tag Selenium

Python一键下载视频脚本分享

需求

小编通常会上一些专业的视频网站比如腾讯视频、优酷,在上面看电影、电视剧。这些网站有个优点,可以缓存视频,在通勤路上比如地铁就可以愉快的刷剧了,因为地铁上的网速通常不怎么好。

但是有一些经典电影或者电视剧,这些视频并没有提供,那么我们只能上一些小电影网站看了,资源是有了,但是问题来了,这些小电影网站大多数都没有视频下载功能,那在地铁上就没法看了。

如果可以把这些视频下载下来,再传输到手机里不就可以离线看了吗?

接下来小编就演示下如何用 python 脚本来实现一键下载小电影网站的视频。

以下脚本可以学习到

  • python selenium 的使用
  • python requests 的使用
  • 分片下载视频存储本地
  • 实时输出视频下载进度

注意:

  1. 这里的脚本主要用于测试学习目的,切勿用于生产环境等商业目的

  2. 推荐大家访问官方指定平台或专业视频网站,支持正版

解决方案

小编以经常看的在线之家为例,这个网站可以找到很多美剧资源。

首先,我们用谷歌浏览器打开一个视频地址,比如https://www.zxzj.fun/video/1529-1-1.html,按F12或者右击“检查”打开浏览器控制台

video url

然后,点击控制台最左边的选择元素按钮,或者按Ctrl + Shift + C,选择网页的视频区域,就能看到video标签

<video
  class="dplayer-video dplayer-video-current"
  webkit-playsinline=""
  playsinline=""
  preload="metadata"
  src="https://vod.pipi.cn/8f6897d9vodgzp1251246104/1881b495387702292624167851/f0.mp4"
></video>

可以发现src属性值就是视频链接,并且是采用单独的.mp4视频地址,这种地址原理上可以直接从浏览器下载的,直接复制这个地址在浏览器打开,就可以右击下载。但是电视剧通常有很多集,每次都手动打开网页-打开控制台-复制视频地址-再打开视频-最后下载视频,就很繁琐。这时候就是脚本排上用场的时候了,可以把这个流程自动化,简化重复操作的过程。

脚本的整体思路

  • 使用selenium打开网页
  • 通过selenium元素选择器找到video标签所在的iframe,切换到iframe
  • 通过video标签,获取到视频地址,然后请求视频内容
  • 采用分片下载的方式拼接视频存储到本地

代码

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import requests
# 谷歌浏览器驱动
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# sleep模块,让程序停止往下运行
from time import sleep

# 设置谷歌浏览器驱动
driver = webdriver.Chrome()

# 手动改为想要下载的视频所在网页地址
url = 'https://www.zxzj.fun/video/1529-1-1.html'

# 打开网页
driver.get(url)

try:
  # 通过元素选择器找到iframe
    iframe = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located(
            (By.CSS_SELECTOR, '#playleft iframe'))
    )
except:
    driver.quit()

# 获取到网页title,便于直观看到当前下载的视频标题
title = driver.find_elements(By.TAG_NAME, 'title')[
    0].get_attribute('innerHTML')

# 切换到iframe
driver.switch_to.frame(iframe)

# 通过video标签获取视频地址
video = driver.find_elements(By.TAG_NAME, 'video')[0]
video_url = video.get_attribute('src')
print('video', video_url)

# 已经获取到视频地址,可以关闭浏览器
driver.quit()

# 设置请求头信息
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 Edg/96.0.1054.62'
}

# 请求视频内容
video_content = requests.get(video_url, headers=headers, stream=True)

print("开始下载")

# 视频大小
contentLength = int(video_content.headers['content-length'])

line = '大小: %.2fMB'

# 大小换算
line = line % (contentLength/1024/1024)

# 打印视频总长度
print(line)

# 存储已经下载的长度
downSize = 0

print('video_name', title)

# 分片下载
with open(title+'.mp4', "wb") as mp4:
    for chunk in video_content.iter_content(chunk_size=1024 * 1024):
        if chunk:
            mp4.write(chunk)

            # 记录已下载视频长度,实时输出下载进度
            downSize += len(chunk)
            print('进度:{:.2%}'.format(downSize / contentLength), end='\r')

print("下载结束")

总结

以上简单展示了使用 python 的requestsselenium库来下载一个mp4视频,可以当做一个学习案例。

其中还有很多待改进的地方

  • 每次运行脚本只能解析下载一个视频,或许可以改进为批量解析出一个视频列表来下载
  • 换视频地址下载,需要手动改源码的url地址,可以改进做一个界面交互来让用户输入
  • 当前只适配了特定网站的视频地址解析,其他地址不支持,可以改进针对不同的网站单独出解析函数来匹配

后续有时间再来分享更多有趣实用的 python 脚本。

参考

Python + Selenium 自动化测试《人生重开模拟器》

背景

最近有一款小游戏特别火,叫《人生重开模拟器》,这款游戏用黑色幽默的调侃形式,随机生成你的人生大事件列表,开场还能抽取天赋加点,趣味性十足。

因为官网访问流量过大,有的朋友出现访问白屏、网页失效的情况,小编在这里发一个最新的人生重开模拟器在线链接:

https://dushusir.com/life/

不停地重开自己的人生之后,小编想着能不能写个脚本来自动化运行这款游戏,因为是纯网页操作,所以可以使用Python和Selenium组合的自动化测试神器来测试下。

思路

因为本质上这个游戏是一系列的网页操作,所以实现起来比较简单,就当是复习下Selenium的基本元素操作。想入门Python的童鞋可以看下,

以前小编写过一个 Python+Selenium自动化测试合成大西瓜一样可以作为学习。

注意:这不是一个智能的提高游戏分数的脚本,只是一个演示自动化测试学习案例,帮助大家更好的理解selenium的用法。

开发环境

  1. 下载Python并安装
  2. 安装pip
  3. 安装Selenium和浏览器webdriver

mac平台和windows平台有所不同,安装时注意下环境。细节问题这里就不列出了,大家多用户谷歌。

如果下载Python或者pip安装比较慢的,可以参考下这篇博文进行加速。

安装py模块神器

代码

环境准备好之后,直接复制以下代码到.py文件里,比如main.py,执行
python main.py即可启动webdriver运行自动化人生重开模拟器。

#!/usr/bin/python
# -*- coding: UTF-8 -*-

# 谷歌浏览器驱动
from selenium import webdriver


# sleep模块,让程序停止往下运行
from time import sleep

# 导入 random(随机数) 模块
import random

# 手机模式加载谷歌浏览器
mobile_emulation = {'deviceName': 'iPhone 5'}
options = webdriver.ChromeOptions()
options.add_experimental_option("mobileEmulation", mobile_emulation)


driver = webdriver.Chrome(chrome_options=options)

# 设置浏览器大小
driver.set_window_rect(0,0,700,700)

sleep(1)
# 打开设定的网址
driver.get('https://dushusir.com/life')

# 隐式等待
driver.implicitly_wait(5)

# 点击 立即重开
restart = driver.find_element_by_id('restart')
restart.click()

sleep(1)

# 点击 10连抽
driver.find_element_by_id('random').click()

sleep(1)

# 随机1-10数字,用于抽中天赋卡

randomOne = random.randint(1,3)
randomTwo = random.randint(4,6)
randomThree = random.randint(7,10)

# 找到三张天赋卡按钮并点击
driver.find_element_by_css_selector("#talents li:nth-of-type("+ str(randomOne) +")").click()
driver.find_element_by_css_selector("#talents li:nth-of-type("+ str(randomTwo) +")").click()
driver.find_element_by_css_selector("#talents li:nth-of-type("+ str(randomThree) +")").click()

# 点击确认:“请选择3个”
driver.find_element_by_css_selector("#next").click()

sleep(1)

# 点击随机分配
driver.find_element_by_css_selector("#random").click()

sleep(2)

# 开始新人生
driver.find_element_by_css_selector("#start").click()

# 持续点击人生大事件列表区域,直到列表区域内容不再增加,即表明人生结束
isOver = False # 结束标识
life = 0 # 前一个life长度

while(not isOver):

    # 点击列出人生大事件
    driver.find_element_by_css_selector("#lifeTrajectory").click()
    print('点击一次'+str(life))

    sleep(1)

    # 注意必须使用find_elements,不是find_element,否则len方法会报错
    li = driver.find_elements_by_css_selector("#lifeTrajectory li")

    currt_life = len(li)

    # 如果列表在继续增加,则继续点击;一旦不再增加,表明你挂了
    if currt_life > life:
        life = currt_life
    else:
        isOver = True
        print('结束')

# 点击人生总结
driver.find_element_by_id('summary').click()

sleep(5)
driver.quit()

总结

程序写的比较粗略,很多细节还没有完善,不过可以作为小案例参考,也欢迎大家批评指出问题。后续有时间再分享更多有用的测试脚本和好玩的游戏。

参考

Python+Selenium自动化测试合成大西瓜

问题

最近想要试一下玩合成大西瓜小游戏,就想能不能自动化运行这个游戏。相当于写一个自动化测试合成大西瓜的脚本,随机点击位置然后触发点击即可。

解决方案

直接采用自动化测试工具Python+Selenium,环境安装方法请参考 Selenium+Python自动化测试(一)

注意:这不是自动完成合成大西瓜的脚本,只是一个演示随机点击的自动化测试学习案例,帮助大家更好的理解selenium的用法。

合成大西瓜小游戏链接:https://dushusir.com/xigua/

(手机端使用微信或者自带浏览器打开即可开始游戏,PC端打开后用F12开启移动调试功能试玩)
适当游戏,娱乐中学习。

视频演示效果

代码

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 谷歌浏览器驱动
from selenium import webdriver

# sleep模块,让程序停止往下运行
from time import sleep

# 操作链
from selenium.webdriver.common.action_chains import ActionChains


# 导入 random(随机数) 模块
import random

# 手机模式加载谷歌浏览器
mobile_emulation = {'deviceName': 'iPhone 5'}
options = webdriver.ChromeOptions()
options.add_experimental_option("mobileEmulation", mobile_emulation)
driver = webdriver.Chrome(chrome_options=options)

# 设置浏览器大小
driver.set_window_rect(0,0,700,700)

sleep(1)
# 打开设定的网址
driver.get('https://dushusir.com/xigua')

# 隐式等待
driver.implicitly_wait(5)

while(True):
    
    # 随机取位置
    randomX = random.randint(20,300)
    randomY = random.randint(200,300)

    print('click')
    # 设定点击位置  
    ActionChains(driver).move_by_offset(randomX, randomY).click().perform()

    # move_by_offset会累计上一次的位置,点击完重置
    ActionChains(driver).move_by_offset(-randomX, -randomY).perform()
    sleep(1)

# driver.quit()

更多

后续关注公众号:技术分社,获取最新脚本和小游戏动态

Selenium+Python自动化测试(一)

1.selenium安装

pip install selenium

2.下载chromedriver

下载得到的exe文件放到python的安装目录下

Continue reading…