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 socket.error: [Errno 98] Address already in use的原因和解决方法
Aug 25 Python
Python实现ssh批量登录并执行命令
Oct 25 Python
Python中with及contextlib的用法详解
Jun 08 Python
PyCharm安装第三方库如Requests的图文教程
May 18 Python
python寻找list中最大值、最小值并返回其所在位置的方法
Jun 27 Python
Python类和对象的定义与实际应用案例分析
Dec 27 Python
Jupyter notebook在mac:linux上的配置和远程访问的方法
Jan 14 Python
Python中如何使用if语句处理列表实例代码
Feb 24 Python
python字符串替换re.sub()实例解析
Feb 09 Python
Keras使用tensorboard显示训练过程的实例
Feb 15 Python
在Mac中PyCharm配置python Anaconda环境过程图解
Mar 11 Python
python playwrigh框架入门安装使用
Jul 23 Python
anaconda python3.8安装后降级
OpenCV-Python实现人脸美白算法的实例
Matplotlib可视化之添加让统计图变得简单易懂的注释
教你用Python matplotlib库制作简单的动画
PyQt5实现多张图片显示并滚动
pyqt5蒙版遮罩mask,setmask的使用
详解Python描述符的工作原理
You might like
PHP5/ZendEngine2的改进
2006/10/09 PHP
第十二节--类的自动加载
2006/11/16 PHP
PHP+MYSQL会员系统的开发实例教程
2014/08/23 PHP
php实现表单多按钮提交action的处理方法
2015/10/24 PHP
php中的依赖注入实例详解
2019/08/14 PHP
prototype 学习笔记整理
2009/07/17 Javascript
Jquery中显示隐藏的实现代码分析
2011/07/26 Javascript
javascript实现des解密加密全过程
2014/04/03 Javascript
基于Bootstrap+jQuery.validate实现Form表单验证
2014/12/16 Javascript
基于JS实现textarea中获取动态剩余字数的方法
2016/05/25 Javascript
JS封装的自动创建表格的实现代码
2016/06/15 Javascript
js实时获取窗口大小变化的实例代码
2016/11/18 Javascript
浅谈webpack对样式的处理
2018/01/05 Javascript
React 高阶组件入门介绍
2018/01/11 Javascript
关于ES6箭头函数中的this问题
2018/02/27 Javascript
vue-cli webpack 引入swiper的操作方法
2018/09/15 Javascript
详解在Node.js中发起HTTP请求的5种方法
2019/01/10 Javascript
webpack.DefinePlugin与cross-env区别详解
2020/02/23 Javascript
nodejs脚本centos开机启动实操方法
2020/03/04 NodeJs
python爬虫 模拟登录人人网过程解析
2019/07/31 Python
Python学习笔记之Break和Continue用法分析
2019/08/14 Python
解决echarts中饼图标签重叠的问题
2020/05/16 Python
基于Python中random.sample()的替代方案
2020/05/23 Python
python连接手机自动搜集蚂蚁森林能量的实现代码
2021/02/24 Python
欧缇丽美国官网:Caudalie美国
2016/12/31 全球购物
捷克原创男装和女装购物网站:Bolf.cz
2018/04/28 全球购物
来自南加州灵感的工作和娱乐服装:TravisMathew
2019/05/01 全球购物
BIFFI美国站:意大利BIFFI BOUTIQUES豪华多品牌时装零售公司
2020/02/11 全球购物
EJB的激活机制
2013/10/25 面试题
人事部岗位职责范本
2014/03/05 职场文书
学校门卫岗位职责
2014/03/16 职场文书
安全环保标语
2014/06/09 职场文书
毕业证委托书范文
2014/09/26 职场文书
假释思想汇报范文
2014/10/11 职场文书
解决pytorch 损失函数中输入输出不匹配的问题
2021/06/05 Python
html5 录制mp3音频支持采样率和比特率设置
2021/07/15 Javascript