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中使用logging模块代替print(logging简明指南)
Jul 09 Python
跟老齐学Python之数据类型总结
Sep 24 Python
Saltstack快速入门简单汇总
Mar 01 Python
Python+微信接口实现运维报警
Aug 27 Python
Win7下Python与Tensorflow-CPU版开发环境的安装与配置过程
Jan 04 Python
用Python实现筛选文件脚本的方法
Oct 27 Python
python如何使用Redis构建分布式锁
Jan 16 Python
Python线程条件变量Condition原理解析
Jan 20 Python
Python unittest 自动识别并执行测试用例方式
Mar 09 Python
python 实现读取csv数据,分类求和 再写进 csv
May 18 Python
基于python tkinter的点名小程序功能的实例代码
Aug 22 Python
详解python对象之间的交互
Sep 29 Python
anaconda python3.8安装后降级
OpenCV-Python实现人脸美白算法的实例
Matplotlib可视化之添加让统计图变得简单易懂的注释
教你用Python matplotlib库制作简单的动画
PyQt5实现多张图片显示并滚动
pyqt5蒙版遮罩mask,setmask的使用
详解Python描述符的工作原理
You might like
S900/ ETON E1-XM 收音机
2021/03/02 无线电
把PHP安装为Apache DSO
2006/10/09 PHP
window+nginx+php环境配置 附配置搭配说明
2010/12/29 PHP
php源码分析之DZX1.5加密解密函数authcode用法
2015/06/17 PHP
php把字符串指定字符分割成数组的方法
2018/03/12 PHP
javascript中的有名函数和无名函数
2007/10/17 Javascript
编写针对IE的JS代码两种编写方法
2013/01/30 Javascript
JavaScript栏目列表隐藏/显示简单实现
2013/04/03 Javascript
将json当数据库一样操作的javascript lib
2013/10/28 Javascript
jQuery实现可展开合拢的手风琴面板菜单
2015/09/15 Javascript
每天一篇javascript学习小结(Date对象)
2015/11/13 Javascript
jQuery操作css样式
2017/05/15 jQuery
基于js 字符串indexof与search方法的区别(详解)
2017/12/04 Javascript
JavaScript多线程运行库Nexus.js详解
2017/12/22 Javascript
解析Vue.js中的组件
2018/02/02 Javascript
浅谈FastClick 填坑及源码解析
2018/03/02 Javascript
小程序指纹验证的实现代码
2018/12/04 Javascript
Vue源码中要const _toStr = Object.prototype.toString的原因分析
2018/12/09 Javascript
如何制作一个Node命令行图像识别工具
2018/12/12 Javascript
vue组件定义,全局、局部组件,配合模板及动态组件功能示例
2019/03/19 Javascript
[01:39:42]Fnatic vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python在Windows和在Linux下调用动态链接库的教程
2015/08/18 Python
使用coverage统计python web项目代码覆盖率的方法详解
2019/08/05 Python
python 中xpath爬虫实例详解
2019/08/26 Python
Django 博客实现简单的全文搜索的示例代码
2020/02/17 Python
python topk()函数求最大和最小值实例
2020/04/02 Python
使用css3做0.5px的细线的示例代码
2018/01/18 HTML / CSS
丝芙兰中国官方商城:SEPHORA中国
2018/01/10 全球购物
卫校中专生个人自我评价
2013/09/19 职场文书
运动会广播稿30字
2014/01/21 职场文书
联谊活动策划书
2014/01/26 职场文书
化学工程专业求职信
2014/08/10 职场文书
2015年乡镇平安建设工作总结
2015/05/13 职场文书
2015年市场营销工作总结
2015/07/23 职场文书
PHP对接阿里云虚拟号的实现(号码隐私保护)
2021/04/06 PHP
html粘性页脚的具体使用
2022/01/18 HTML / CSS