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 第一步 hello world
Sep 25 Python
Python+Wordpress制作小说站
Apr 14 Python
python3获取两个日期之间所有日期,以及比较大小的实例
Apr 08 Python
python PrettyTable模块的安装与简单应用
Jan 11 Python
python使用wxpy轻松实现微信防撤回的方法
Feb 21 Python
Python基础之条件控制操作示例【if语句】
Mar 23 Python
Python (Win)readline和tab补全的安装方法
Aug 27 Python
详解Django admin高级用法
Nov 06 Python
Python 私有化操作实例分析
Nov 21 Python
Python如何基于rsa模块实现非对称加密与解密
Jan 03 Python
python中sys模块是做什么用的
Aug 16 Python
Python的flask接收前台的ajax的post数据和get数据的方法
Apr 12 Python
anaconda python3.8安装后降级
OpenCV-Python实现人脸美白算法的实例
Matplotlib可视化之添加让统计图变得简单易懂的注释
教你用Python matplotlib库制作简单的动画
PyQt5实现多张图片显示并滚动
pyqt5蒙版遮罩mask,setmask的使用
详解Python描述符的工作原理
You might like
PHP进程同步代码实例
2015/02/12 PHP
CI(Codeigniter)的Setting增强配置类实例
2016/01/06 PHP
JS是否可以跨文件同时控制多个iframe页面的应用技巧
2007/12/16 Javascript
浅析JavaScript中的类型和对象
2013/11/29 Javascript
jQuery中index()的用法分析
2014/09/05 Javascript
jQuery多级弹出菜单插件ZoneMenu
2014/12/18 Javascript
使用javascript获取页面名称
2014/12/23 Javascript
JavaScript去除数组里重复值的方法
2015/07/13 Javascript
jquery.cookie.js用法实例详解
2015/12/25 Javascript
JS组件Form表单验证神器BootstrapValidator
2016/01/26 Javascript
初识angular框架后的所思所想
2016/02/19 Javascript
JS中setTimeout和setInterval的最大延时值详解
2017/02/13 Javascript
深入理解Node module模块
2018/03/26 Javascript
小程序外卖订单界面的示例代码
2019/12/30 Javascript
JavaScript中的this基本问题实例小结
2020/03/09 Javascript
[01:02:25]2014 DOTA2华西杯精英邀请赛5 24 NewBee VS VG
2014/05/25 DOTA
全面解析Python的While循环语句的使用方法
2015/10/13 Python
Python 功能和特点(新手必学)
2015/12/30 Python
python计算两个地址之间的距离方法
2018/06/09 Python
Python中pymysql 模块的使用详解
2019/08/12 Python
django创建简单的页面响应实例教程
2019/09/06 Python
Python3爬虫中Ajax的用法
2020/07/10 Python
Python+Kepler.gl实现时间轮播地图过程解析
2020/07/20 Python
捷克电器和DJ设备网上商店:Electronic-star
2017/07/18 全球购物
JD Sports丹麦:英国领先的运动时尚零售商
2020/11/24 全球购物
初中三好学生事迹材料
2014/01/13 职场文书
请假条的格式
2014/04/11 职场文书
《生命 生命》教学反思
2014/04/19 职场文书
企业文明单位申报材料
2014/05/16 职场文书
数学兴趣小组活动总结
2014/07/08 职场文书
2015年五一劳动节活动总结
2015/02/09 职场文书
简历自我评价优缺点
2015/03/11 职场文书
2015年员工工作表现评语
2015/03/25 职场文书
办公室主任岗位竞聘书
2015/09/15 职场文书
2016党员入党决心书
2015/09/22 职场文书
MySQL中的引号和反引号的区别与用法详解
2021/10/24 MySQL