python如何下载快手视频


本文摘自php中文网,作者尚,侵删。

首先,打开fiddler,fiddler作为http/https 抓包神器,这里就不多介绍。

配置允许https

1.jpg

配置允许远程连接也就是打开http代理

1.jpg

电脑ip: 192.168.1.110

然后确保手机和电脑是在一个局域网下,可以通信。由于我这边没有安卓手机,就用了安卓模拟器代替,效果一样的。

打开手机浏览器,输入192.168.1.110:8888也就是设置的代理地址,安装证书之后才能抓包

1.jpg

安装证书之后,在WiFi设置修改网络手动指定http代理

1.jpg

保存后就可以了,fiddler就可以抓到app的数据了,打开快手刷新,可以看到有很多http请求进来,一般接口地址之类的很明显的,可以看到是json类型的

1.jpg

http post请求,返回数据是json ,展开后发现一共是20条视频信息,先确保是否正确,找一个视频链接看下。

1.jpg

那就打开postman来测试,form-data方式提交则报错

1.jpg

换raw这种

1.jpg

报错信息不一样了,试试加上headers

1.jpg

成功返回数据,多试几次,发现每次返回结果不一样。

下面就开始上代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

# -*-coding:utf-8-*-

# author : Corleone

import urllib2,urllib

import json,os,re,socket,time,sys

import Queue

import threading

import logging

# 日志模块

logger = logging.getLogger("AppName")

formatter = logging.Formatter('%(asctime)s %(levelname)-5s: %(message)s')

console_handler = logging.StreamHandler(sys.stdout)

console_handler.formatter = formatter

logger.addHandler(console_handler)

logger.setLevel(logging.INFO)

video_q = Queue.Queue()    # 视频队列

def get_video():

    url = "http://101.251.217.210/rest/n/feed/hot?app=0&lon=121.372027&c=BOYA_BAIDU_PINZHUAN&sys=ANDROID_4.1.2&mod=HUAWEI(HUAWEI%20C8813Q)&did=ANDROID_e0e0ef947bbbc243&ver=5.4&net=WIFI&country_code=cn&iuid=&appver=5.4.7.5559&max_memory=128&oc=BOYA_BAIDU_PINZHUAN&ftt=&ud=0&language=zh-cn&lat=31.319303 "

    data = {

        'type': 7,

        'page': 2,

        'coldStart': 'false',

        'count': 20,

        'pv': 'false',

        'id': 5,

        'refreshTimes': 4,

        'pcursor': 1,

        'os': 'android',

        'client_key': '3c2cd3f3',

        'sig': '22769f2f5c0045381203fc57d1b5ad9b'

    }

    req = urllib2.Request(url)

    req.add_header("User-Agent", "kwai-android")

    req.add_header("Content-Type", "application/x-www-form-urlencoded")

    params = urllib.urlencode(data)

    try:

        html = urllib2.urlopen(req, params).read()

    except urllib2.URLError:

        logger.warning(u"网络不稳定 正在重试访问")

        html = urllib2.urlopen(req, params).read()

    result = json.loads(html)

    reg = re.compile(u"[\u4e00-\u9fa5]+")   # 只匹配中文

    for x in result['feeds']:

        try:

            title = x['caption'].replace("\n","")

            name = " ".join(reg.findall(title))

            video_q.put([name, x['photo_id'], x['main_mv_urls'][0]['url']])

        except KeyError:

            pass

def download(video_q):

    path = u"D:\快手"

    while True:

        data = video_q.get()

        name = data[0].replace("\n","")

        id = data[1]

        url = data[2]

        file = os.path.join(path, name + ".mp4")

        logger.info(u"正在下载:%s" %name)

        try:

            urllib.urlretrieve(url,file)

        except IOError:

            file = os.path.join(path, u"神经病呀"+ '%s.mp4') %id

            try:

                urllib.urlretrieve(url, file)

            except (socket.error,urllib.ContentTooShortError):

                logger.warning(u"请求被断开,休眠2秒")

                time.sleep(2)

                urllib.urlretrieve(url, file)

        logger.info(u"下载完成:%s" % name)

        video_q.task_done()

def main():

    # 使用帮助

    try:

        threads = int(sys.argv[1])

    except (IndexError, ValueError):

        print u"\n用法: " + sys.argv[0] + u" [线程数:10] \n"

        print u"例如:" + sys.argv[0] + " 10" + u"  爬取视频 开启10个线程 每天爬取一次 一次2000个视频左右(空格隔开)"

        return False

    # 判断目录

    if os.path.exists(u'D:\快手') == False:

        os.makedirs(u'D:\快手')

    # 解析网页

    logger.info(u"正在爬取网页")

    for x in range(1,100):

        logger.info(u"第 %s 次请求" % x)

        get_video()

    num = video_q.qsize()

    logger.info(u"共 %s 视频" %num)

    # 多线程下载

    for y in range(threads):

        t = threading.Thread(target=download,args=(video_q,))

        t.setDaemon(True)

        t.start()

    video_q.join()

    logger.info(u"-----------全部已经爬取完成---------------")

main()

测试

1334074-20180228131222824-221682161.gif

多线程下载每次下载2000个视频左右,默认下载到D:\快手

1.jpg

相关推荐:《Python视频教程》

以上就是python如何下载快手视频的详细内容,更多文章请关注木庄网络博客!!

相关阅读 >>

Python3 requests中使用ip代理池随机生成ip的实例

Python数据分析难学吗

pandas多级分组实现排序的方法

如何用Python计算1到100的和?

access和Python学哪个

《流畅的Python》怎么样

Python怎么用for循环

Python如何自定义函数

如何理解Python中with语句

初学Python的学习心得

更多相关阅读请进入《Python》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...