无法抓取的视频,暴力破解之路

一、经历

1、末年末月末日在一个夜黑风高的夜晚,脑袋一热在网上花了大价钱买了某某的一个培训课程。开始时候该平台还没有对用户进行时间限制,突然某天在网页上显示剩余100天,然后一下子慌了,时间、时间、时间。。。。
2、接下来开始想着怎么把视频抓下来,在网上翻阅了大量的视频爬虫,有简单有难的,我这个是属于难的,一开始的时候基本上上每周网页策略都在变,还好现在稳定了。
3、视频采用的pcf文件加密传输,然后又是一顿找资料,好吧,放弃了~ 无解
4、最后突发奇想,用桌面录像工具,把想要的视频一个一个录制下来(也许以后就躺在硬盘里吃灰了。。。。)。后来发现数量多了,消耗时间多,有没有那个精力盯着电脑。吃力不讨好 ~~~~~~
5、某天突发奇想,用代码录屏。本想自己实现代码,东西多放弃;然后考虑用代码控制桌面录屏工具;ok,完美
6、撸代码呀撸代码 ~~~~~~~~
7、等我录完了再放毒 ~~~~~~~~

end、代码已经释放

二、构成

1、工具

a、selenium + chrome 用于模拟用户
b、scrapy 简单粗暴
d、EV录屏 工具

2、要点

a、scrapy模拟浏览器轮序播放
b、代码控制ev录像

三 代码

此处主要是对ev录像工具的控制(爬虫代码上传了,会被举报,毕竟签了协议,个人还是干不过集团的_),此文档主要是提供一些思路:对于一些实在无法抓取的视频,可以采用屏幕录制的。(温馨提醒:若是视频上带有个人信息的水印,为了避免不必要的纠纷,不建议上传到网上)

前提:运行代码前,先到打开ev录屏工具,调整好录取桌面的大小和声音来源

ev开始录制


                        # 切换Windows窗口,查找EV录屏软件 ;开始录制 (3秒准备延时)
                        Window.find_window_wildcard(".*EV.*")
                        Window.set_foreground()
                        # ctrl + F1  开始
                        win32api.keybd_event(17, 0, 0, 0)  # Control
                        win32api.keybd_event(112, 0, 0, 0)  # F1
                        win32api.keybd_event(112, 0, win32con.KEYEVENTF_KEYUP, 0)  # 释放按键
                        win32api.keybd_event(17, 0, win32con.KEYEVENTF_KEYUP, 0)  # 释放按键

                        # 点击 目录上的视频
                        ActionChains(driver).move_to_element(video).perform()
                        sleep(1)
                        ActionChains(driver).move_to_element(video).click().perform()
                        sleep(2)

                        # 播放视频
                        video_play = driver.find_element_by_class_name('xdyplayer')
                        ActionChains(driver).move_to_element(video_play).click().perform()
                        Window.find_window_wildcard(".*TTS.*")
                        Window.set_foreground()
                        win32api.keybd_event(32, 0, 0, 0)  # space
                        win32api.keybd_event(32, 0, win32con.KEYEVENTF_KEYUP, 0)  # 释放按键

ev完成录制

                                    # ctrl + F2  结束
                                    win32api.keybd_event(17, 0, 0, 0)  # Control
                                    win32api.keybd_event(113, 0, 0, 0)  # F2
                                    win32api.keybd_event(113, 0, win32con.KEYEVENTF_KEYUP, 0)  # 释放按键
                                    win32api.keybd_event(17, 0, win32con.KEYEVENTF_KEYUP, 0)  # 释放按键

完整代码

考虑再三,还是一起发布了,保证项目的完整性。(若是有心并且有账户代码是可以用的,但是爬虫一般都具有时效性,后面就不该了,此代码仅供学习参考)

	allowed_domains  = ['http://www.xxxx.cn/']   # 屏蔽了网站
	driver.get('http://www.xxxx.cn/')  # 打开网页,屏蔽了网站
	            driver.find_element_by_id("js_account_pm").send_keys("xxxxxxxxx@qq.com")  # 屏蔽了个人账户
	            sleep(1)
	            driver.find_element_by_id("js_password").send_keys("xxxxxxxx")	 # 屏蔽了账户密码

代码如下


# -*- coding: utf-8 -*-
import json
import os
from time import sleep

import scrapy
import win32api
import win32con
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

from tarena.control import WindowMgr, key_input

days_enumerate = ["day1", "day2", "day3", "day4", "day5", "day6", "day7", "day8"]

class LoadSpider(scrapy.Spider):
    name = 'load'
    allowed_domains = ['http://www.xxxx.cn/']
    start_urls = ['http://www.baidu.com']

    def parse(self, response):
        if os.path.exists("video_info.text"):
            with open("video_info.text", "r") as f:
                data = f.readlines()

            if len(data) > 0:
                file_info = json.loads(data[0])
            else:
                file_info = {}
        else:
            file_info = {}
        Window = WindowMgr()

        chrome_options = webdriver.ChromeOptions()
        path_dir = r'E:\workspace\crawler\hilqiqi0\chrome\User Data'
        chrome_options.add_argument('--user-data-dir=' + path_dir)  # 设置成用户自己的数据目录
        driver = webdriver.Chrome(chrome_options=chrome_options)
        driver.get('http://www.xxxx.cn/')  # 打开网页

        try:
            target = driver.find_elements_by_xpath('//a[@οnclick="checkTtsUser()"]')[1]
            ActionChains(driver).move_to_element(target).perform()
            sleep(2)
            ActionChains(driver).move_to_element(target).click().perform()

            # 校验跳转
            sleep(5)
            driver.find_element_by_class_name('tree-box-x').find_elements_by_xpath('./div')[2:4]  #[4:5] # [1:5]
        except:
            # 登陆
            driver.find_element_by_id("login_xxw").click()
            sleep(1)
            driver.find_element_by_id("js_account_pm").clear()
            sleep(1)
            driver.find_element_by_id("js_password").clear()
            sleep(1)
            driver.find_element_by_id("js_account_pm").send_keys("xxxxxxxxx@qq.com")
            sleep(1)
            driver.find_element_by_id("js_password").send_keys("xxxxxxxx")
            sleep(1)
            driver.find_element_by_id("js_submit_login").click()

            # 等待登陆成功
            sleep(5)

            target = driver.find_elements_by_xpath('//a[@οnclick="checkTtsUser()"]')[1]
            ActionChains(driver).move_to_element(target).perform()
            sleep(2)
            ActionChains(driver).move_to_element(target).click().perform()

            # 等待加载网页
            sleep(5)

        home_handler = driver.current_window_handle

        # 大类:
        # 第二阶段
        # 第三阶段
        # 第四阶段
        # 完成
        majors = driver.find_element_by_class_name('tree-box-x').find_elements_by_xpath('./div')[2:4]  #[4:5] # [1:5]
        for major in majors:
            major_text = major.find_element_by_xpath('./div').text
            print(major_text)

            # 第一阶段 LINUX, PYTHON01, PYTHON02, PYTHON03, OOP,
            # 第二阶段 MYSQL, PYTHONTHREAD, PYTHONNET, MONGODB, PROJECT01,
            # 第三阶段 WEBBASIC01, WEBBASIC02, PYTHONWEB01, PYTHONWEB02, PYTHONWEB03,
            # 第四阶段 CRAWLER01, CRAWLER02, DATASCIENCE, AI01, AI02, PROJECT02,
            # 完成
            courses = major.find_elements_by_xpath('./ul')
            for course in courses:
                course_text = course.text
                print(course_text)

                course_target = course.find_element_by_class_name('course-name-x')
                ActionChains(driver).move_to_element(course_target).perform()
                sleep(2)
                ActionChains(driver).move_to_element(course_target).click().perform()

                # 视频目录
                days = driver.find_elements_by_class_name('clearfix')
                day_index = 0
                for day in days:
                    try:
                        day_target = day.find_element_by_class_name('day-class')
                    except:
                        continue
                    day_text = day_target.text

                    if day_text == "":
                        continue
                    # 点击进入播放页面
                    print(day_text)

                    day_enumerate = days_enumerate[day_index]
                    day_index += 1

                    day_target = day_target.find_element_by_xpath('./a')
                    ActionChains(driver).move_to_element(day_target).perform()
                    sleep(2)
                    ActionChains(driver).move_to_element(day_target).click().perform()

                    # 网页切换
                    all_handler = driver.window_handles
                    for handler in all_handler:
                        if handler != home_handler:
                            driver.switch_to.window(handler)

                    # 手动加载flash,谷歌需要点击一次
                    while True:
                        try:
                            while driver.find_element_by_xpath('//a[@href="http://www.adobe.com/go/getflash"]').text == "这里":
                                sleep(1)
                        except:
                            sleep(10)
                            break

                    # 视频页
                    videos = driver.find_element_by_class_name('video-list').find_elements_by_xpath('./p/a')
                    video_index = 0
                    for video in videos:
                        video_text = video.text
                        print(video_text)
                        video_index += 1

                        file_name = course_text + "_" + day_enumerate + "_" + str(video_index)
                        file_value = course_text + "_" + day_text + "_" + video_text
                        print(file_value)
                        if file_name in file_info:
                            continue

                        # 切换Windows窗口,查找EV录屏软件 ;开始录制 (3秒准备延时)
                        Window.find_window_wildcard(".*EV.*")
                        Window.set_foreground()
                        # ctrl + F1  开始
                        win32api.keybd_event(17, 0, 0, 0)  # Control
                        win32api.keybd_event(112, 0, 0, 0)  # F1
                        win32api.keybd_event(112, 0, win32con.KEYEVENTF_KEYUP, 0)  # 释放按键
                        win32api.keybd_event(17, 0, win32con.KEYEVENTF_KEYUP, 0)  # 释放按键

                        # 点击 目录上的视频
                        ActionChains(driver).move_to_element(video).perform()
                        sleep(1)
                        ActionChains(driver).move_to_element(video).click().perform()
                        sleep(2)

                        # 播放视频
                        video_play = driver.find_element_by_class_name('xdyplayer')
                        ActionChains(driver).move_to_element(video_play).click().perform()
                        Window.find_window_wildcard(".*TTS.*")
                        Window.set_foreground()
                        win32api.keybd_event(32, 0, 0, 0)  # space
                        win32api.keybd_event(32, 0, win32con.KEYEVENTF_KEYUP, 0)  # 释放按键

                        while True:
                            try:
                                if driver.find_element_by_class_name('tit').text == "重播":
                                    # ctrl + F2  结束
                                    win32api.keybd_event(17, 0, 0, 0)  # Control
                                    win32api.keybd_event(113, 0, 0, 0)  # F2
                                    win32api.keybd_event(113, 0, win32con.KEYEVENTF_KEYUP, 0)  # 释放按键
                                    win32api.keybd_event(17, 0, win32con.KEYEVENTF_KEYUP, 0)  # 释放按键

                                    sleep(1)

                                    print(file_name)
                                    key_input(file_name)

                                    file_info[file_name] = file_value
                                    with open("video_info.text", "w") as f:
                                        f.writelines(json.dumps(file_info))
                                    break

                            except Exception as e:
                                print(e)
                                sleep(2)
                                pass
                        #
                        # break
                    sleep(2)
                    driver.close()
                    # sleep(2)
                    driver.switch_to.window(home_handler)

                    # 向上拖拽
                    driver.execute_script("arguments[0].scrollIntoView();", day_target)
                    # break

                # 去除选择
                ActionChains(driver).move_to_element(course_target).perform()
                sleep(2)
                ActionChains(driver).move_to_element(course_target).click().perform()

                # 向上拖拽
                driver.execute_script("arguments[0].scrollIntoView();", course_target)
                # break
            # break

        driver.quit()  # 关闭Chrome浏览器,如果不写这句话浏览器就会停留在百度首页在后台运行不会关闭浏览器
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
Fiddler是一款功能强大的抓包工具,可以帮助我们抓取视频号。 首先,我们需要下载和安装Fiddler软件,并打开它。然后,我们需要在浏览器中打开需要抓取视频号的网页,比如在抖音APP中浏览视频页面。 接下来,我们需要在Fiddler的菜单栏中选择“Tools” - “Options”进入设置界面。在设置界面的左侧栏中选择“HTTPS”选项,并确保勾选上“Decrypt HTTPS traffic”复选框,这样才能正常抓取HTTPS协议的视频号。 然后,我们需要在Fiddler的工具栏中点击“Online”按钮,让Fiddler开始监听网络流量。此时,我们需要再次在浏览器中加载视频页面,可以看到Fiddler的界面中开始出现网络请求和响应的记录。 在Fiddler的界面中,我们可以看到各个网络请求的详情。找到加载视频的请求,可以通过筛选和搜索等功能来查找,一般会以包含视频号的参数或URL出现。根据不同的网站和视频平台,视频号的位置和格式可能会有所不同,我们需要根据具体情况来查找。 找到视频号后,我们可以将其复制下来,然后在浏览器中打开相应的视频链接,即可查看该视频的详细信息和相关内容。 总之,使用Fiddler抓取视频号需要通过监听网络流量,找到加载视频的请求,并从中提取视频号。然后,我们可以通过视频号来查看、分享或下载对应的视频内容。注意,使用Fiddler进行网络抓包需要遵守法律法规,不得用于非法用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值