最近又重新拾起了,对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写了个下载快手视频的小脚本的更多相关文章

  1. 写了一个常规性生成merge 的小脚本

    现在使用数据库来写存储过程,动不动参数就会用到xml ,当然罗,优势也很明显,参数相对固定,而且灵活,如果要修改或者什么的,中间接口层也不需要做变化,只需要修改封装的存储过程以及程序传参就ok了. 随 ...

  2. python写的多线程下载工具

    其实只是想练习一下threading的用法. 写完后发现其实下载速度也没增加多少,略显尴尬,汗 # -*- coding: cp936 -*- import urllib2 import thread ...

  3. 用Python写一个向数据库填充数据的小工具

    一. 背景 公司又要做一个新项目,是一个合作型项目,我们公司出web展示服务,合作伙伴线下提供展示数据. 而且本次项目是数据统计展示为主要功能,并没有研发对应的数据接入接口,所有展示数据源均来自数据库 ...

  4. python写的用WMI检测windows系统信息的脚本

    脚本如下: #!/usr/bin/env python #coding:utf- import wmi import sys,time,platform def get_system_info(os) ...

  5. 写个自动下载安装Ant的shell脚本【二】

    #!/bin/bash ####################################################### file name: install_ant.sh# # fun ...

  6. 写个自动下载安装Ant的shell脚本【一】

    #!/bin/bash ###################################################### # file name: install_ant.sh # # f ...

  7. 练手——用Python写的时间戳转换为北京时间的小工具

    #北京时间需加上8小时bj = 8*3600 def time_stamp(times):    #一天总秒数    nonDaySeconds = 24*3600    leapmonths = [ ...

  8. Python - 网易邮箱邮件阅读和删除辅助小脚本

    摘要:[原创]转载请注明作者Johnthegreat和本文链接 简介:在Windows下的网易邮箱大师客户端中,阅读邮件时,可以使用快捷键Delete删除邮件,然后自动跳到下一封,如果再按一次Dele ...

  9. (Python基础教程之二十二)爬虫下载网页视频(video blob)

    Python基础教程 在SublimeEditor中配置Python环境 Python代码中添加注释 Python中的变量的使用 Python中的数据类型 Python中的关键字 Python字符串操 ...

随机推荐

  1. 【干货干货】hyperledger fabric 之动态添加组织/修改配置 (Fabric-java-sdk) 下

    我们接着上一节来讲: 在熟悉动态增加组织或修改配置的步骤后,我们就可以使用java的api来完成动态增加组织或修改配置了: 废话不多说,直接上干货: 1,预制条件 org3的证书以及组织3的MSP详情 ...

  2. TensorFlow笔记-变量,图,会话

    变量 存储一些临时值的作用或者长久存储.在Tensorflow中当训练模型时,用变量来存储和更新参数.变量包含张量(Tensor)存放于内存的缓存区.建模时它们需要被明确地初始化,模型训练后它们必须被 ...

  3. C#3.0新增功能09 LINQ 基础04 基本 LINQ 查询操作

    连载目录    [已更新最新开发文章,点击查看详细] 本篇介绍 LINQ 查询表达式和一些在查询中执行的典型操作. 获取数据源 在 LINQ 查询中,第一步是指定数据源. 和大多数编程语言相同,在使用 ...

  4. 使用 Spring Framework 时常犯的十大错误

    Spring 可以说是最流行的 Java 框架之一,也是一只需要驯服的强大野兽.虽然它的基本概念相当容易掌握,但成为一名强大的 Spring 开发者仍需要很多时间和努力. 在本文中,我们将介绍 Spr ...

  5. 【Java中级】(一)面向对象的特性与八种基本类型

    1.1.Java 基本数据类型: Java提供了8种基本类型.六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型. byte.short.int.long.float.double. ...

  6. Spring还可以这样用缓存,你知道吗?

    大家在项目开发过程中,或多或少都用过缓存,为了减少数据库的压力,把数据放在缓存当中,当访问的请求过来时,直接从缓存读取.缓存一般都是基于内存的,读取速度比较快,市面上比较常见的缓存有:memcache ...

  7. zstack源码编译安装(1.7.x版本)

    图片没粘贴过来,请看本人gitbook吧https://www.gitbook.com/book/jingtyu/how-to-learn-zstack-code 运行环境 zstack的安装方式有很 ...

  8. 如何在jsp中显示数据库的内容

    用Eclipse tomcat新建一个JSP页面(一)介绍了如何创建一个web程序和第一个jsp页面,以及Eclipse需要的一些必要配置.今天,我们重点说一下如何从数据库中查询数据,并且在JSP页面 ...

  9. jQuery 小测试

    1.在div元素中,包含了一个<span>元素,通过has选择器获取<div>元素中的<span>元素的语法是? 提示使用has() 答案: $(div:has(s ...

  10. 谈谈用Boox Max 2 阅读A4纸文献的体验

    首先说说选择Boox的几个原因: 护眼.这个不用多说,之所以除了电脑,还要电子阅读器,主要是为了护眼. 减少纸质书籍购买.纸质书籍拿在手上是有质感,读起来也更舒服,可一则一些外文书买纸质的是很贵的,相 ...