用Python写了个下载快手视频的小脚本
最近又重新拾起了,对python
的热情.
贴个地址: https://github.com/d1y/lovepack/blob/master/kuaishou.py
前戏说明
因为我近乎癫狂的喜欢一个女孩三年,算上今年是第四年,但是可悲的我只是鱼塘的一"只"(注意我说的是动词)
我想联系她,我想找到她,但是我发现根本没有她的联系方式, 戏剧性的一幕,我有她的快手,所以每天都只有对着快手目睹佳人
但是我并不喜欢快手,这让我有点难堪,所以当时我就觉得做一个小玩意,用来下载他的视频和图片
技术相关
第一次有这个想法的时候,我在考虑用什么技术, nodejs
| php
| python
都可以
最终我考虑选择使用python
来写这个小玩意.
我开始考虑从抓包手机端出手,但是发现这货的接口要研究好久,网上也没有现成的轮子,我就考虑在 web
端去抓取
哦,后面的ID
需要传值
_api = 'https://live.kuaishou.com/profile/'
_headers = {
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'
}
_r = requests.get(_api+id, headers=_headers)
在这里有一个小坑,如果你不传递 userAgent
就无法获取到内容
当拿到了html
片段之后,就可以拿到想要的东西了
当然了,我一开始想要正则式的方式拿到需要的东西,我就花了几天的时间去学习这个
有点东西,我放弃了,最后采用的方案是使用: pyquery
而不是使用 bs4
from pyquery import PyQuery as pq
仔细的研究了一下这个web
端口, 发现它这个fontsc
用的太狠了
我就不下手了
我开始细细研究这些数据该怎么拿到,在我查看源码的时候我发现一个小东西
大部分数据都在这个对象里,当然这时候就要看一下这个对象到底是什么玩意了~
window.__APOLLO_STATE__ = {
"defa...":{}
}
细节部分就不给大家看了,就给大家看看我是怎么解决的:
import json
from pyquery import PyQuery as pq
def str2JSON( html, flag = False ):
'''
@tips { 先把拿到的数据转为`dict` }
@param {str} - html
@return {dict}
'''
_html = pq(html)
_con = _html('#app').next().next().text()
_firstStr = _con.index('{')
_lastStr = _con.rindex('}')
_code = _con[_firstStr:_lastStr]
_code = _code[: int( _code.rindex('}') )+1]
data_obj = json.loads(_code)['defaultClient']
if flag:
_title = _html('.profile-user-name').text()
return {
"title": _title,
"data": data_obj
};
return data_obj;
这样就拿到了python
的一个dict
,但是在拿到了dict
之后,我们该怎么做呢?
当然是找到它的作品的key
通过分析,格式大致为:
_key = '$ROOT_QUERY.publicFeeds({"count":24,"pcursor":"","principalId":"'+id+'"})'
她的每一个作品那么就分别为:
data_obj = str2JSON(_r.text)
_lists = data_obj[_key]
_result = [];
for _index,_list in enumerate(_lists['list']):
_now = _key + '.list.' + str(_index)
_result.append(
data_obj[_now]
)
非常好,那么现在我们就拿到了作品的list
,现在我们写一个小循环来依次下载
for list in lists:
_lists = list['imgUrls']['json'] # 注意这里!
for i,img in enumerate(_lists):
pass
如果你是跟着我的节奏来的话,到这里就应该出问题了,第一就是她的数据类型有几种
- video - 就是视频
- other - 其他
通过观察发现video
资源还通过访问其他 url
才能获取到,所以这里要判断他们的类型,下面是伪代码:
type = 'video'
if (type == 'video'):
pass
else:
pass
还有就是你会发现拿到的图片是.webp
格式,这格式是google
开发在chrome
的,有点小众,你得把它转换成 .jpg
这就要用到著名的 PIL
,下面是伪代码
from PIL import Image
_im = Image.open(_file).convert('RGB')
_im.save( _now, 'jpeg' )
os.unlink(_file)
把.webp
文件创建,然后通过这个包转换,接下来就删除 .webp
这个文件,嗯,对,这是正确姿势
接下来就到了说说视频怎么下载了
看到了吗,后面的那个 did
不要管,你会发现有两个超乱的字符串,相信你通过观察也能看出来这个第一个乱码就是 用户的 id
乱码,后面那个就是作品的id
你肯定想问这货从哪里得知,其实很简单
简单吧
fuck_str = 'User:xjkfljdslkjdfjds'
result = fuck_str.split(':')[1]
后面的拿到视频链接就不用我说了吧!
分享完咯~
用法
用法很简单
在你拿到对方的id
之后, 你可以传入 --id=xxx' 这样,这里说一下 ``--flag
这个参数是用来生成用户的.md
文件的, 还有 --debug
参数是用来测试的
注意啊, 所有生成的文件是在 ~/lovepack
下面的, 此处的 ~
表示为 HOME PATH
用Python写了个下载快手视频的小脚本的更多相关文章
- 写了一个常规性生成merge 的小脚本
现在使用数据库来写存储过程,动不动参数就会用到xml ,当然罗,优势也很明显,参数相对固定,而且灵活,如果要修改或者什么的,中间接口层也不需要做变化,只需要修改封装的存储过程以及程序传参就ok了. 随 ...
- python写的多线程下载工具
其实只是想练习一下threading的用法. 写完后发现其实下载速度也没增加多少,略显尴尬,汗 # -*- coding: cp936 -*- import urllib2 import thread ...
- 用Python写一个向数据库填充数据的小工具
一. 背景 公司又要做一个新项目,是一个合作型项目,我们公司出web展示服务,合作伙伴线下提供展示数据. 而且本次项目是数据统计展示为主要功能,并没有研发对应的数据接入接口,所有展示数据源均来自数据库 ...
- python写的用WMI检测windows系统信息的脚本
脚本如下: #!/usr/bin/env python #coding:utf- import wmi import sys,time,platform def get_system_info(os) ...
- 写个自动下载安装Ant的shell脚本【二】
#!/bin/bash ####################################################### file name: install_ant.sh# # fun ...
- 写个自动下载安装Ant的shell脚本【一】
#!/bin/bash ###################################################### # file name: install_ant.sh # # f ...
- 练手——用Python写的时间戳转换为北京时间的小工具
#北京时间需加上8小时bj = 8*3600 def time_stamp(times): #一天总秒数 nonDaySeconds = 24*3600 leapmonths = [ ...
- Python - 网易邮箱邮件阅读和删除辅助小脚本
摘要:[原创]转载请注明作者Johnthegreat和本文链接 简介:在Windows下的网易邮箱大师客户端中,阅读邮件时,可以使用快捷键Delete删除邮件,然后自动跳到下一封,如果再按一次Dele ...
- (Python基础教程之二十二)爬虫下载网页视频(video blob)
Python基础教程 在SublimeEditor中配置Python环境 Python代码中添加注释 Python中的变量的使用 Python中的数据类型 Python中的关键字 Python字符串操 ...
随机推荐
- hexo-theme-yilia使用遇到的问题
该项目的github地址:https://github.com/litten/hexo-theme-yilia 下面是该项目的README.md 在使用过中遇到这么一个问题. 文章不会自动的摘要,显示 ...
- Git 安装及使用指南
1 简介1.1 Git1.2 Github2 Git 在 Windows 下的安装和使用2.1 msysgit2.2 Tortoisegit2.2.1 安装2.2.2 配置2.2.3 简单使用 1 简 ...
- vue.js-vue入门教程教你如何html中使用vue(30分钟快速入门)
前后端分离.微服务框架是当下比较流行的词汇,而vue就是前端框架的佼佼者.下面重点介绍一下vue的用法: vue起步:1.引包 2.启动new Vue({el:目的地,template:模板内容 ...
- Java中返回值定义为int类型的 方法return 1返回的是int还是Integer&&finally中return问题
在Java中返回值定义为int类型的 方法return 1:中返回的是Integer值,在返回的时候基本类型值1被封装为Integer类型. 定义一个Test类,在异常处理try中和finally中分 ...
- Http接口调用示例教程
介绍HttpClient库的使用前,先介绍jdk里HttpURLConnection,因为HttpClient是开源的第三方库,使用方便,不过jdk里的都是比较基本的,有时候没有HttpClient的 ...
- myeclipse中更改默认jdk版本出错( Target is not a JDK root. System library was not found)
原因是我的本地jdk版本是9.0,将jdk版本更改至8.0即可导入成功. jdk9.0导入myeclipse中去会有此类问题的发生,因此没有必要使用最新的jdk版本.
- python传递参数
1.脚本 # -*- coding: utf-8 -*- from sys import argvscript, first,second = argv #将命令中输入的参数解包后传递给左边 age ...
- 极简代码神器:Lombok使用教程
Lombok 是一个非常神奇的 java 类库,会利用注解自动生成 java Bean 中烦人的 Getter.Setter,还能自动生成 logger.ToString.HashCode.Build ...
- java中map,set的简单使用
package test2; import java.util.*; import static java.lang.System.out; public class test2 extends St ...
- 【Android】Field requires API level 4 (current min is 1): android.os.Build.VERSION#SDK_INT
刚遇到了这个问题: Field requires API level 4 (current min is 1): android.os.Build.VERSION#SDK_INT 解决方法: 修改 A ...