http://www.web008.net

python爬取快手视频

直白开端! 

 

环境: python 2.7 + win10

工具:fiddler postman 安卓模拟器

 

率先,张开fiddler,fiddler作为http/https 抓包神器,这里就非常的少介绍。

安顿允许https 

 

图片 1

 

配备允许远程连接 也便是展开http代理

 

图片 2

 

 

电脑ip: 192.168.1.110

然后 确认保证手提式无线电话机和Computer是在一个局域网下,能够通讯。由于自身那边未有安卓手提式有线电话机,就用了安卓模拟器替代,效果等同的。

开采手提式有线电话机浏览器,输入192.168.1.110:8888   相当于安装的代办地址,安装证书之后技艺抓包

 

图片 3

设置证书之后,在WiFi设置 改过网络手动内定http代理

图片 4

 

 

 保存后就能够了,fiddler就足以抓到app的数码了,展开快手 刷新,可以见到有众多http诉求踏入,日常接口地址之类的很明白的,能够看来 是json类型的

 

图片 5

 

 http post必要,再次回到数据是json ,张开后意识一起是20条录制音讯,先确定保证是或不是科学,找一个摄像链接看下。

图片 6

 

 ok 是足以播放的 很干净也未尝水印。

 这就开拓postman 来测量检验,form-data 情势交给则报错

图片 7

 

那换raw 这种

图片 8

 

 

报错新闻不周边了,试试加上headers

 

图片 9

 

 

 nice   成功重临数据,小编又多试四次,开采每趟回到结果不相仿,都是19个录像,刚才里边post参数中 有个page=1 这么一直都是率先页 就好像一向在堂弟大上不往下翻了 就从头一向刷新那样,反正 也不在乎,只要回到数据 不另行就好。

上边就从头上代码

 

  1 # -*-coding:utf-8-*-
  2 # author : Corleone
  3 import urllib2,urllib
  4 import json,os,re,socket,time,sys
  5 import Queue
  6 import threading
  7 import logging
  8 
  9 
 10 # 日志模块
 11 logger = logging.getLogger("AppName")
 12 formatter = logging.Formatter('%(asctime)s %(levelname)-5s: %(message)s')
 13 console_handler = logging.StreamHandler(sys.stdout)
 14 console_handler.formatter = formatter
 15 logger.addHandler(console_handler)
 16 logger.setLevel(logging.INFO)
 17 
 18 
 19 video_q = Queue.Queue()    # 视频队列
 20 
 21 
 22 def get_video():
 23     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 "
 24     data = {
 25         'type': 7,
 26         'page': 2,
 27         'coldStart': 'false',
 28         'count': 20,
 29         'pv': 'false',
 30         'id': 5,
 31         'refreshTimes': 4,
 32         'pcursor': 1,
 33         'os': 'android',
 34         'client_key': '3c2cd3f3',
 35         'sig': '22769f2f5c0045381203fc57d1b5ad9b'
 36     }
 37     req = urllib2.Request(url)
 38     req.add_header("User-Agent", "kwai-android")
 39     req.add_header("Content-Type", "application/x-www-form-urlencoded")
 40     params = urllib.urlencode(data)
 41     try:
 42         html = urllib2.urlopen(req, params).read()
 43     except urllib2.URLError:
 44         logger.warning(u"网络不稳定 正在重试访问")
 45         html = urllib2.urlopen(req, params).read()
 46     result = json.loads(html)
 47     reg = re.compile(u"[u4e00-u9fa5]+")   # 只匹配中文
 48     for x in result['feeds']:
 49         try:
 50             title = x['caption'].replace("n","")
 51             name = " ".join(reg.findall(title))
 52             video_q.put([name, x['photo_id'], x['main_mv_urls'][0]['url']])
 53         except KeyError:
 54             pass
 55 
 56 def download(video_q):
 57     path = u"D:快手"
 58     while True:
 59         data = video_q.get()
 60         name = data[0].replace("n","")
 61         id = data[1]
 62         url = data[2]
 63         file = os.path.join(path, name + ".mp4")
 64         logger.info(u"正在下载:%s" %name)
 65         try:
 66             urllib.urlretrieve(url,file)
 67         except IOError:
 68             file = os.path.join(path, u"神经病呀"+ '%s.mp4') %id
 69             try:
 70                 urllib.urlretrieve(url, file)
 71             except (socket.error,urllib.ContentTooShortError):
 72                 logger.warning(u"请求被断开,休眠2秒")
 73                 time.sleep(2)
 74                 urllib.urlretrieve(url, file)
 75 
 76         logger.info(u"下载完成:%s" % name)
 77         video_q.task_done()
 78 
 79 
 80 def main():
 81     # 使用帮助
 82     try:
 83         threads = int(sys.argv[1])
 84     except (IndexError, ValueError):
 85         print u"n用法: " + sys.argv[0] + u" [线程数:10] n"
 86         print u"例如:" + sys.argv[0] + " 10" + u"  爬取视频 开启10个线程 每天爬取一次 一次2000个视频左右(空格隔开)"
 87         return False
 88     # 判断目录
 89     if os.path.exists(u'D:快手') == False:
 90         os.makedirs(u'D:快手')
 91     # 解析网页
 92     logger.info(u"正在爬取网页")
 93     for x in range(1,100):
 94         logger.info(u"第 %s 次请求" % x)
 95         get_video()
 96     num = video_q.qsize()
 97     logger.info(u"共 %s 视频" %num)
 98     # 多线程下载
 99     for y in range(threads):
100         t = threading.Thread(target=download,args=(video_q,))
101         t.setDaemon(True)
102         t.start()
103 
104     video_q.join()
105     logger.info(u"-----------全部已经爬取完成---------------")
106 
107 
108 main()

 

上边测量试验

图片 10

 

二十多线程下载 每一回下载二〇〇三 个录像左右  暗许下载到D:快手

 

图片 11

 

 计算:其实本人本次爬的行家有一点投机倒把了,因为post过去的参数 sign 是签字实乃有加密的,只所以还是能重临数据 那是因为本身老是都以必要的一模一样的链接 page=1 都是率先页的 当笔者改成2的时候,就验签退步了。但是,它恰恰那样也能重回不一致的数据,尽管达到了成效,但却尚未能破解他的加密算法。。。前两天爬抖音的时候 也是如此。加密的。。。哎 。手艺有限。。逆向不了他的app。。。等之后 有本领解决了 在来享受呢。。

最后放上小编的github地址 :  也是刚注册的,早先都没交给过代码,也是有多少个其余的小爬虫,中期找到有趣的 有意思的都会付给上去 。 接待学习沟通 玩耍 : )  嘿嘿嘿~

 

郑重声明:本文版权归美高梅163888所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。