python爬取快手視頻 多線程下載,python快手

來源:互聯網
上載者:User

python爬取快手視頻 多線程下載,python快手

直接開始! 

 

環境: python 2.7 + win10

工具:fiddler postman 安卓模擬器

 

首先,開啟fiddler,fiddler作為http/https 抓包神器,這裡就不多介紹。

配置允許https 

 

 

配置允許遠端連線 也就是開啟http代理

 

 

 

電腦ip: 192.168.1.110

然後 確保手機和電腦是在一個區域網路下,可以通訊。由於我這邊沒有安卓手機,就用了安卓模擬器代替,效果一樣的。

開啟手機瀏覽器,輸入192.168.1.110:8888   也就是設定的Proxy 位址,安裝認證之後才能抓包

 

安裝認證之後,在WiFi設定 修改網路 手動指定http代理

 

 

 儲存後就可以了,fiddler就可以抓到app的資料了,開啟快手 重新整理,可以 看到有很多http請求進來,一般介面地址之類的很明顯的,可以看到 是json類型的

 

 

 http post請求,返回資料是json ,展開後發現一共是20條視頻資訊,先確保是否正確,找一個視頻連結看下。

 

 ok 是可以播放的 很乾淨也沒有浮水印。

 那就開啟postman 來測試,form-data 方式提交則報錯

 

那換raw 這種

 

 

報錯資訊不一樣了,試試加上headers

 

 

 

 nice   成功返回資料,我又多試幾次,發現每次返回結果不一樣,都是20個視頻,剛才其中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()

 

下面測試

 

多線程下載 每次下載2000 個視頻左右  預設下載到D:\快手

 

 

 總結:其實我這次爬的快手有點投機取巧了,因為post過去的參數 sign 是簽名 的確是有加密的,只所以還能返回資料 那是因為我每次都是請求的一樣的連結 page=1 都是第一頁的 當我改成2的時候,就驗簽失敗了。然而,它剛好這樣也能返回不同的資料,雖然達到了效果,但卻沒有能破解他的密碼編譯演算法。。。前兩天 爬抖音的時候 也是這樣。加密的。。。哎 。技術有限。。逆向不了他的app。。。等以後 有能力搞定了 在來分享吧。。

最後放上我的github地址 : https://github.com/binglansky/spider  也是剛註冊的,之前都沒提交過代碼,也有幾個其他的小爬蟲,後期找到好玩的 有意思的都會提交上去 。 歡迎學習交流 玩耍 : )  嘿嘿嘿~

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.