[小玩意] 用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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM