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 RuntimeError: thread.__init__() not called解决方法
Apr 28 Python
Python中实现三目运算的方法
Jun 21 Python
python实现输入数字的连续加减方法
Jun 22 Python
windows下python虚拟环境virtualenv安装和使用详解
Jul 16 Python
python 公共方法汇总解析
Sep 16 Python
Python爬虫库requests获取响应内容、响应状态码、响应头
Jan 25 Python
django项目中新增app的2种实现方法
Apr 01 Python
Python figure参数及subplot子图绘制代码
Apr 18 Python
通过python调用adb命令对App进行性能测试方式
Apr 23 Python
如何将PySpark导入Python的放实现(2种)
Apr 26 Python
【超详细】八大排序算法的各项比较以及各自特点
Mar 31 Python
Python装饰器的练习题
Nov 23 Python
anaconda python3.8安装后降级
OpenCV-Python实现人脸美白算法的实例
Matplotlib可视化之添加让统计图变得简单易懂的注释
教你用Python matplotlib库制作简单的动画
PyQt5实现多张图片显示并滚动
pyqt5蒙版遮罩mask,setmask的使用
详解Python描述符的工作原理
You might like
espresso double下 咖啡粉超细时 饼压力对咖啡的影响
2021/03/03 冲泡冲煮
php修改NetBeans默认字体的大小
2013/07/02 PHP
PHP基于yii框架实现生成ICO图标
2015/11/13 PHP
PHP加密解密类实例代码
2016/07/20 PHP
发现的以前不知道的函数
2006/09/19 Javascript
在js中使用"with"语句中跨frame的变量引用问题
2007/03/08 Javascript
Javascript 按位左移运算符使用介绍(
2014/02/04 Javascript
jquery取消选择select下拉框示例代码
2014/02/22 Javascript
jQuery如何取id有.的值一般的方法是取不到的
2014/04/18 Javascript
JavaScript中跨域调用Flash的方法
2014/08/11 Javascript
js创建对象的方式总结
2015/01/10 Javascript
使用javascript实现雪花飘落的效果
2015/01/13 Javascript
JavaScript实现带缓冲效果的随屏滚动漂浮广告代码
2015/11/06 Javascript
angular.js指令中的controller、compile与link函数的不同之处
2017/05/10 Javascript
Koa 使用小技巧(小结)
2018/10/22 Javascript
Node.js+ELK日志规范的实现
2019/05/23 Javascript
django js 实现表格动态标序号的实例代码
2019/07/12 Javascript
Element Collapse 折叠面板的使用方法
2020/07/26 Javascript
[02:54]DOTA2英雄基础教程 撼地者
2014/01/14 DOTA
[18:16]sakonoko 2017年卡尔集锦
2018/02/06 DOTA
[01:09:23]KG vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
[01:29:17]RNG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.23
2019/09/05 DOTA
python批量下载图片的三种方法
2013/04/22 Python
Python中获取网页状态码的两个方法
2014/11/03 Python
DJANGO-ALLAUTH社交用户系统的安装配置
2014/11/18 Python
Python删除windows垃圾文件的方法
2015/07/14 Python
python利用不到一百行代码实现一个小siri
2017/03/02 Python
django 常用orm操作详解
2017/09/13 Python
python使用__slots__让你的代码更加节省内存
2018/09/05 Python
django数据模型(Model)的字段类型解析
2019/12/25 Python
Python虚拟环境venv用法详解
2020/05/25 Python
Python使用tkinter实现摇骰子小游戏功能的代码
2020/07/02 Python
浅谈python锁与死锁问题
2020/08/14 Python
初二物理教学反思
2014/01/29 职场文书
物业工程部主管岗位职责
2015/04/16 职场文书
乱世佳人观后感
2015/06/08 职场文书