国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python爬蟲爬取快手視頻多線程下載功能

2020-02-22 23:21:25
字體:
來源:轉載
供稿:網友

環境: python 2.7 + win10

工具:fiddler postman 安卓模擬器

首先,打開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條視頻信息,先確保是否正確,找一個視頻鏈接看下。

 

ok 是可以播放的 很干凈也沒有水印。

那么現在打開 postman 來模擬這個post 看看有沒有檢驗參數

 

一共是這么多參數,我以為 client_key 和 sign 會驗證...可是 后面 發現我錯了 啥也沒驗證 就這樣提交過去就行...

form-data 方式提交則報錯

 

那換 raw 這種

 

報錯信息不一樣了,試試加上 headers

 

nice 成功返回數據,我又多試幾次,發現每次返回結果不一樣,都是 20個視頻,剛才其中post參數中 有個page=1 可能一直都是第一頁 就像一直在手機上不往下翻了 就開始一直刷新那樣,反正 也無所謂,只要返回數據 不重復就好。

下面就開始上代碼

# -*-coding:utf-8-*-# author : Corleoneimport urllib2,urllibimport json,os,re,socket,time,sysimport Queueimport threadingimport logging# 日志模塊logger = logging.getLogger("AppName")formatter = logging.Formatter('%(asctime)s %(levelname)-5s: %(message)s')console_handler = logging.StreamHandler(sys.stdout)console_handler.formatter = formatterlogger.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:      passdef 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()            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宁强县| 盐城市| 斗六市| 清水河县| 昌都县| 海伦市| 丹阳市| 泰和县| 彰武县| 定远县| 固始县| 苍梧县| 吉安县| 耒阳市| 丽水市| 平定县| 汉川市| 横山县| 定州市| 刚察县| 礼泉县| 桦甸市| 江陵县| 北碚区| 三明市| 通州市| 彰武县| 鄂温| 芒康县| 府谷县| 九龙城区| 大新县| 安新县| 刚察县| 金湖县| 玉林市| 平乡县| 大冶市| 高邑县| 乐业县| 克拉玛依市|