python爬虫爬取快手视频多线程下载功能


Posted in Python onFebruary 28, 2018

环境: python 2.7 + win10

工具:fiddler postman 安卓模拟器

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

配置允许https

python爬虫爬取快手视频多线程下载功能 

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

python爬虫爬取快手视频多线程下载功能 

电脑ip: 192.168.1.110

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

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

python爬虫爬取快手视频多线程下载功能 

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

python爬虫爬取快手视频多线程下载功能 

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

python爬虫爬取快手视频多线程下载功能 

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

python爬虫爬取快手视频多线程下载功能 

ok 是可以播放的 很干净也没有水印。

那么现在打开 postman 来模拟这个post 看看有没有检验参数

python爬虫爬取快手视频多线程下载功能 

一共是这么多参数,我以为 client_key 和 sign 会验证...可是 后面 发现我错了 啥也没验证 就这样提交过去就行...

form-data 方式提交则报错

python爬虫爬取快手视频多线程下载功能 

那换 raw 这种

python爬虫爬取快手视频多线程下载功能 

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

python爬虫爬取快手视频多线程下载功能 

nice 成功返回数据,我又多试几次,发现每次返回结果不一样,都是 20个视频,刚才其中post参数中 有个page=1 可能一直都是第一页 就像一直在手机上不往下翻了 就开始一直刷新那样,反正 也无所谓,只要返回数据 不重复就好。

下面就开始上代码

# -*-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()

下面测试

python爬虫爬取快手视频多线程下载功能 

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

python爬虫爬取快手视频多线程下载功能 

好了 这次就到这结束了,其实也很简单,快手竟然没有加密。。。因为 爬 抖音的时候 就碰到问题了.....

总结

以上所述是小编给大家介绍的python爬虫爬取快手视频多线程下载,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python连接数据库学习之DB-API详解
Feb 07 Python
用python做一个搜索引擎(Pylucene)的实例代码
Jul 05 Python
机器学习python实战之决策树
Nov 01 Python
pandas中去除指定字符的实例
May 18 Python
Python绘制正余弦函数图像的方法
Aug 28 Python
Python中collections模块的基本使用教程
Dec 07 Python
Python调用Windows命令打印文件
Feb 07 Python
python词云库wordCloud使用方法详解(解决中文乱码)
Feb 17 Python
Python格式化输出--%s,%d,%f的代码解析
Apr 29 Python
golang中的空接口使用详解
Mar 30 Python
Python实现排序方法常见的四种
Jul 15 Python
Python学习之os包使用教程详解
Mar 21 Python
python爬取m3u8连接的视频
Feb 28 #Python
python实现m3u8格式转换为mp4视频格式
Feb 28 #Python
浅谈Python中的私有变量
Feb 28 #Python
python中logging包的使用总结
Feb 28 #Python
深入理解Python爬虫代理池服务
Feb 28 #Python
python实现装饰器、描述符
Feb 28 #Python
python安装教程
Feb 28 #Python
You might like
php实现无限级分类实现代码(递归方法)
2011/01/01 PHP
全面解读PHP的人气开发框架Laravel
2015/10/15 PHP
PHP读取文本文件并逐行输出该行使用最多的字符与对应次数的方法
2016/11/25 PHP
Javascript里使用Dom操作Xml
2007/01/22 Javascript
javascript IFrame 强制刷新代码
2009/07/23 Javascript
JS、CSS加载中的小问题探讨
2013/11/26 Javascript
鼠标移到图片上变大显示而不是放大镜效果
2014/06/15 Javascript
JavaScript实现计算字符串中出现次数最多的字符和出现的次数
2015/03/12 Javascript
Jquery注册事件实现方法
2015/05/18 Javascript
JavaScript中原型链存在的问题解析
2016/09/25 Javascript
Vue.js组件tree实现无限级树形菜单
2016/12/02 Javascript
分分钟玩转Vue.js组件(二)
2017/03/01 Javascript
js eval函数使用,js对象和字符串互转实例
2017/03/06 Javascript
在 Angular6 中使用 HTTP 请求服务端数据的步骤详解
2018/08/06 Javascript
浅析vue-router原理
2018/10/19 Javascript
js中Array对象的常用遍历方法详解
2019/01/17 Javascript
通过JS运行机制的角度说说作用域
2019/03/12 Javascript
layUI使用layer.open,在content打开数据表格,获取值并返回的方法
2019/09/26 Javascript
vue项目使用高德地图的定位及关键字搜索功能的实例代码(踩坑经验)
2020/03/07 Javascript
JS使用Chrome浏览器实现调试线上代码
2020/07/23 Javascript
Python 检查数组元素是否存在类似PHP isset()方法
2014/10/14 Python
Python新手实现2048小游戏
2015/03/31 Python
PyQt5 pyqt多线程操作入门
2018/05/05 Python
python 正则表达式参数替换实例详解
2020/01/17 Python
Python实现清理微信僵尸粉功能示例【基于itchat模块】
2020/05/29 Python
PyTorch实现重写/改写Dataset并载入Dataloader
2020/07/14 Python
python 爬取免费简历模板网站的示例
2020/09/27 Python
15个Pythonic的代码示例(值得收藏)
2020/10/29 Python
阿迪达斯俄罗斯官方商城:adidas俄罗斯
2017/03/08 全球购物
德国健康生活方式网上商店:Landkaufhaus Mayer
2019/03/12 全球购物
北欧最好的童装网上商店:Babyshop
2019/09/15 全球购物
银行求职信个人范文
2013/12/16 职场文书
会计岗位职责
2015/02/03 职场文书
考博导师推荐信范文
2015/03/27 职场文书
幼儿园开学家长寄语(2016秋季)
2015/12/03 职场文书
分析Netty直接内存原理及应用
2021/06/14 Java/Android