视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
python如何下载快手视频
2020-11-27 14:07:49 责编:小采
文档


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

配置允许https

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

电脑ip: 192.168.1.110

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

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

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

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

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

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

换raw这种

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

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

下面就开始上代码

# -*-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("
","")
 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("
","")
 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"
用法: " + sys.argv[0] + u" [线程数:10] 
"
 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()

测试

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

下载本文
显示全文
专题