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中字典(dict)和列表(list)的排序方法实例
Jun 16 Python
Python多线程下载文件的方法
Jul 10 Python
对numpy 数组和矩阵的乘法的进一步理解
Apr 04 Python
Python如何计算语句执行时间
Nov 22 Python
结束运行python的方法
Jun 16 Python
解析Python 偏函数用法全方位实现
Jun 26 Python
记录一下scrapy中settings的一些配置小结
Sep 28 Python
用Python 执行cmd命令
Dec 18 Python
提取视频中的音频 Python只需要三行代码!
May 10 Python
Pytorch实现图像识别之数字识别(附详细注释)
May 11 Python
python 常用的异步框架汇总整理
Jun 18 Python
Python操作CSV格式文件的方法大全
Jul 15 Python
anaconda python3.8安装后降级
OpenCV-Python实现人脸美白算法的实例
Matplotlib可视化之添加让统计图变得简单易懂的注释
教你用Python matplotlib库制作简单的动画
PyQt5实现多张图片显示并滚动
pyqt5蒙版遮罩mask,setmask的使用
详解Python描述符的工作原理
You might like
php header示例代码(推荐)
2010/09/08 PHP
PHP正确配置mysql(apache环境)
2011/08/28 PHP
PHP会话控制:Session与Cookie详解
2014/09/27 PHP
Zend Framework入门教程之Zend_Config组件用法详解
2016/12/09 PHP
php实现微信支付之企业付款
2018/05/30 PHP
PHP使用pdo连接access数据库并循环显示数据操作示例
2018/06/05 PHP
prototype与jquery下Ajax实现的差别
2009/09/13 Javascript
javascript 哈希表(hashtable)的简单实现
2010/01/20 Javascript
一个简单的JavaScript数据缓存系统实现代码
2010/10/24 Javascript
js实现带圆角的两级导航菜单效果代码
2015/08/24 Javascript
jQuery实现简易的天天爱消除小游戏
2015/10/16 Javascript
jquery事件的ready()方法使用详解
2015/11/11 Javascript
Javascript学习之谈谈JS的全局变量跟局部变量(推荐)
2016/08/28 Javascript
jQuery 移动端拖拽(模块化开发,触摸事件,webpack)
2016/10/28 Javascript
Javascript数组中push方法用法分析
2016/10/31 Javascript
微信小程序显示下拉列表功能【附源码下载】
2017/12/12 Javascript
JavaScript使用prototype原型实现的封装继承多态示例
2018/08/31 Javascript
Vue axios全局拦截 get请求、post请求、配置请求的实例代码
2018/11/28 Javascript
微信小程序 弹窗输入组件的实现解析
2019/08/12 Javascript
python基础教程之基本数据类型和变量声明介绍
2014/08/29 Python
Python 中 list 的各项操作技巧
2017/04/13 Python
go和python变量赋值遇到的一个问题
2017/08/31 Python
python中的内置函数max()和min()及mas()函数的高级用法
2018/03/29 Python
python使用 zip 同时迭代多个序列示例
2019/07/06 Python
解决python多行注释引发缩进错误的问题
2019/08/23 Python
Python使用uuid库生成唯一标识ID
2020/02/12 Python
Django 项目通过加载不同env文件来区分不同环境
2020/02/17 Python
将数据集制作成VOC数据集格式的实例
2020/02/17 Python
canvas绘制文本内容自动换行的实现代码
2019/01/14 HTML / CSS
Europcar美国/加拿大:预订汽车或卡车租赁服务
2018/11/13 全球购物
Nike俄罗斯官方网站:Nike RU
2021/03/05 全球购物
商场开业庆典策划方案
2014/06/02 职场文书
科学育儿宣传标语
2014/10/08 职场文书
学生党员检讨书范文
2014/12/27 职场文书
2015年班级工作总结范文
2015/04/03 职场文书
Python基础详解之描述符
2021/04/28 Python