Python爬取某拍短视频


Posted in Python onJune 11, 2021

一、抓取目标

目标网址:美拍视频

Python爬取某拍短视频

二、工具使用

开发环境:win10、python3.7
开发工具:pycharm、Chrome
工具包:requests、xpath、base64

三、重点学习内容

爬虫采集数据的解析过程
js代码调试技巧
js逆向解析代码
Python代码的转换

四、项目思路解析

进入到网站的首页
挑选你感兴趣的分类
根据首页地址获取到进入详情页面的超链接的跳转地址

Python爬取某拍短视频

找到对应加密的视频播放地址数据

Python爬取某拍短视频

这个数据是静态的网页数据,通过js代码进行解码的
找到对应的解析代码
先找到视频的播放地址
找到解析视频地址的加密js文件
点击播放的时候会触发文件

Python爬取某拍短视频

大致能看出来这个是base64加密之后的数据
在对应的js文件里搜索关键字
找到js的加密方式

Python爬取某拍短视频

js函数的一些函数的用法

# eplace()方法用于在字符串中用一些字符替换另一些字符
    # parseInt 数据转换成对应的整型
    # base64.atob   对base64编码过的字符串进行解码
    # substring 方法可在字符串中抽取从 start 下标开始的指定数目的字符

Python爬取某拍短视频

将js代码转换成Python代码

import base64

def decode(data):
    def getHex(a):
        return {
            'str': a[4:],
            'hex': ''.join(list(a[:4])[::-1]),
        }

    def getDec(a):
        b = str(int(a, 16))
        return {
            'pre': list(b[:2]),
            'tail': list(b[2:]),
        }

    def substr(a, b):
        c = a[0: int(b[0])]
        d = a[int(b[0]): int(b[0]) + int(b[1])]
        return c + a[int(b[0]):].replace(d, "")

    def getPos(a, b):
        b[0] = len(a) - int(b[0]) - int(b[1])
        return b

    b = getHex(data)
    c = getDec(b['hex'])
    d = substr(b['str'], c['pre'])
    return base64.b64decode(substr(d, getPos(d, c['tail'])))

print(decode("e121Ly9tBrI84RdnZpZGVvMTAubWVpdHVkYXRhLmNvbS82MGJjZDcwNTE3NGZieXBueG5udnRwMTA5N19IMjY0XzFfNWY3YThmM2U0MTEwNy5tc2JVjAu3EDQ="))

得出最终视频播放地址

Python爬取某拍短视频
Python爬取某拍短视频

五、简易源码分享

import requests
from lxml import etree
import base64

def decode_mp4(data):
    def getHex(a):
        return {
            'str': a[4:],
            'hex': ''.join(list(a[:4])[::-1]),
        }

    def getDec(a):
        b = str(int(a, 16))
        return {
            'pre': list(b[:2]),
            'tail': list(b[2:]),
        }

    def substr(a, b):
        c = a[0: int(b[0])]
        d = a[int(b[0]): int(b[0]) + int(b[1])]
        return c + a[int(b[0]):].replace(d, "")

    def getPos(a, b):
        b[0] = len(a) - int(b[0]) - int(b[1])
        return b

    b = getHex(data)
    c = getDec(b['hex'])
    d = substr(b['str'], c['pre'])
    return base64.b64decode(substr(d, getPos(d, c['tail'])))
# 运行主函数
def main():
    url = 'https://www.meipai.com'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36',
    }
    response = requests.get(url=url, headers=headers)
    html_data = etree.HTML(response.text)
    href_list = html_data.xpath('//div/a/@href')
    # print(href_list)
    for href in href_list:
        res = requests.get('https://www.meipai.com' + href, headers=headers)
        html = etree.HTML(res.text)
        name = html.xpath('//div[@id="detailVideo"]/img/@alt')[0]
        mp4_data = html.xpath('//div[@id="detailVideo"]/@data-video')[0]
        # print(name, mp4_data)
        mp4_url = decode_mp4(mp4_data).decode('utf-8')
        print(mp4_url)
        result = requests.get("http:" + mp4_url)
        with open(name + ".mp4", 'wb') as f:
            f.write(result.content)
            f.close()


if __name__ == '__main__':
    main()

到此这篇关于Python爬取某拍短视频的文章就介绍到这了,更多相关Python爬取视频内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
在Python中使用成员运算符的示例
May 13 Python
Python中使用OpenCV库来进行简单的气象学遥感影像计算
Feb 19 Python
Python使用matplotlib绘制多个图形单独显示的方法示例
Mar 14 Python
python使用turtle绘制分形树
Jun 22 Python
Flask框架学习笔记之模板操作实例详解
Aug 15 Python
Python 元组拆包示例(Tuple Unpacking)
Dec 24 Python
python框架Django实战商城项目之工程搭建过程图文详解
Mar 09 Python
python实现飞机大战项目
Mar 11 Python
详解python 内存优化
Aug 17 Python
安装pyinstaller遇到的各种问题(小结)
Nov 20 Python
Python进阶学习之带你探寻Python类的鼻祖-元类
May 08 Python
python区块链实现简版工作量证明
May 25 Python
anaconda python3.8安装后降级
OpenCV-Python实现人脸美白算法的实例
Matplotlib可视化之添加让统计图变得简单易懂的注释
教你用Python matplotlib库制作简单的动画
PyQt5实现多张图片显示并滚动
pyqt5蒙版遮罩mask,setmask的使用
详解Python描述符的工作原理
You might like
php入门教程 精简版
2009/12/13 PHP
php自动注册登录验证机制实现代码
2011/12/20 PHP
PHP sprintf() 函数的应用(定义和用法)
2012/06/29 PHP
php对关联数组循环遍历的实现方法
2015/03/13 PHP
CodeIgniter框架实现的整合Smarty引擎DEMO示例
2019/03/28 PHP
常用的javascript function代码
2008/05/23 Javascript
JQuery魔力之$("tagName")与selector
2012/03/05 Javascript
基于jQuery Tipso插件实现消息提示框特效
2016/03/16 Javascript
JavaScript跨域调用基于JSON的RESTful API
2016/07/09 Javascript
jQuery操作复选框(CheckBox)的取值赋值实现代码
2017/01/10 Javascript
js canvas实现适用于移动端的百分比仪表盘dashboard
2017/07/18 Javascript
JS 中LocalStorage和SessionStorage的使用
2017/08/17 Javascript
vue2.0 子组件改变props值,并向父组件传值的方法
2018/03/01 Javascript
用ES6写全屏滚动插件的示例代码
2018/05/02 Javascript
Javascript迭代、递推、穷举、递归常用算法实例讲解
2019/02/01 Javascript
用 js 写一个 js 解释器过程详解
2019/08/02 Javascript
js与jquery获取input输入框中的值实例讲解
2020/02/27 jQuery
基于canvas实现手写签名(vue)
2020/05/21 Javascript
js里面的变量范围分享
2020/07/18 Javascript
Pyqt实现无边框窗口拖动以及窗口大小改变
2018/04/19 Python
Python反爬虫技术之防止IP地址被封杀的讲解
2019/01/09 Python
python使用百度文字识别功能方法详解
2019/07/23 Python
Python字符串的修改方法实例
2019/12/19 Python
佛罗里达州印第安河新鲜水果:Hale Groves
2017/02/20 全球购物
毕业生造价工程师求职信
2013/10/17 职场文书
俄语专业毕业生推荐信
2013/10/28 职场文书
硅酸盐工业控制专业应届生求职信
2013/11/02 职场文书
大学生毕业自我鉴定
2013/11/06 职场文书
招聘专员岗位职责
2014/03/07 职场文书
应聘编辑自荐信范文
2014/03/12 职场文书
2014年质检工作总结
2014/11/26 职场文书
综合管理员岗位职责
2015/02/11 职场文书
2015年新农合工作总结
2015/03/30 职场文书
欠条样本
2015/07/03 职场文书
Pytorch 中net.train 和 net.eval的使用说明
2021/05/22 Python
tomcat默认最大连接数及相关调整方法
2022/05/06 Servers