快手的小視頻爬取


一.配置好fiddler和手機

 讓手機能夠通過fiddler代理訪問網絡

二.抓包

  打開快手APP,Fiddler會快速顯示很多信息,這些都是手機傳送或者接收到的信息。可以逐個包點開,以json形式查看是否是我們需要的內容,如下圖所示:

  這時可以看到,有一個包里顯示了很多信息,包括視頻的標題,發布者,再往下拉,發現里面包含很多叫做“main_mv_url"的標簽,復制其中一個標簽后的url到瀏覽器,發現瀏覽器下載了一個mp4格式的視頻,點開視頻,就是我們需要的。為了讓列表中只顯示我們需要的包,讓視圖更清晰,可以用過濾器,只顯示URL中含/rest/n/feed/的內容

  

  回到Fiddler,看之前那個包的頭(Fiddler右上窗口),上面有個url,可以復制到瀏覽器會發現打開的不是和Fiddler右下角一樣的json界面,而是顯示服務器繁忙,因為這個url是不完整的。注意右上窗口最后一行有個“type=......”這其實是完整url的后半部分,要把它拼接到第一行POST url的后面,並且以&連接。把完整的url再復制到瀏覽器,得到和Fiddler右下窗口類似的內容(不是完全一樣,因為視頻內容會更新),ok

  再觀察“type=...”這串字符,可以多抓幾個包對比一下,發現count后面跟着的數字是不一樣的,即每個json里所含視頻個數不一樣。平均每個json中含有20個視頻的下載鏈接。page后面的數字就代表頁數,在快手界面不斷的往下滑,隔一小段時間會有另一個包,可以發現page后的數字是遞增的。__NStokensig和sig后跟的一串數字是沒有規律可循的,要破解快手APP的代碼才能知曉。所以無法掌握每個json的url變化規律,所以若是要抓取20個以上的視頻,只能通過在快手app頁面上往下滑動,抓包,copy完整的url到文本文件再用程序進行下載。

代碼:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#author tom
import pprint
import requests
import json
import time
import random


class Kuaishouspider:
    #這個是抓包抓到的數據請求url,要和后面的type用&拼接起來
    def __init__(self):
        self.url='http://api.ksapisrv.com/rest/n/feed/hot?isp=CTCC&pm_tag=&mod=Meizu%28m3%20note%29&lon=113.968423&country_code=cn&kpf=ANDROID_PHONE&extId=92fa9b653b19ecd11e0840d87c04822c&did=ANDROID_e1b34c4ac9ddf120&kpn=KUAISHOU&net=WIFI&app=0&oc=MEIZU&ud=0&hotfix_ver=&c=MEIZU&sys=ANDROID_7.0&appver=6.3.3.8915&ftt=&language=zh-cn&iuid=&lat=22.583945&did_gt=1556199685379&ver=6.3&max_memory=256&type=7&page=1&coldStart=false&count=20&pv=false&id=25&refreshTimes=2&pcursor=&source=1&needInterestTag=false&browseType=1&seid=8dae8f66-01cf-4580-b703-41e6b563d775&volume=0.0&client_key=3c2cd3f3&os=android&sig=518db63518ffba8fca5c70724750dc95'

        self.headers={
        'Content-Type': 'application/x-www-form-urlencoded',
        'Host': 'api.ksapisrv.com',
        'Accept-Language': 'zh-Hans-CN;q=1'
            }

        #抓包里面的數據
        self.data={
            'client_key':'3c2cd3f3',
            'coldStart':'false',
            'count':'20',
            'country_code':'cn',
            'id':'25',
            'language':'zh-Hans-CN;q=1',
            'pv':'false',
            'refreshTimes':'2',
            'sig': '518db63518ffba8fca5c70724750dc95',
            'source':'1',
            'type':'7'
        }
        self.count=0
    def kuaishou_request(self):
        while True:
            #用來計數的
            self.count+=1
             #返回的json數據,我們從里面解析出視頻的uerl
            res=requests.post(self.url,data=self.data,headers=self.headers)

            list=res.json()['feeds']

            #list里面裝着每一個視頻的詳細信息,包括我們所需要的視頻url
            for info in list:
                pprint.pprint(info)
                print('描述%s'%info['caption'])
                print('視頻連接%s'%info['main_mv_urls'][0]['url'])
                print('作者%s'%info['user_name'])
                print('id%s'%info['user_id'])
                print('第%s次抓取完成'%self.count)
            time.sleep(random.randint(500,700))


if __name__ == '__main__':
    ks=Kuaishouspider()
    ks.kuaishou_request()

 

代碼


免責聲明!

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



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