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 相关文章推荐
在Heroku云平台上部署Python的Django框架的教程
Apr 20 Python
python中类和实例如何绑定属性与方法示例详解
Aug 18 Python
Python实现读取txt文件并转换为excel的方法示例
May 17 Python
python skimage 连通性区域检测方法
Jun 21 Python
Python之时间和日期使用小结
Feb 14 Python
python项目对接钉钉SDK的实现
Jul 15 Python
Python计算不规则图形面积算法实现解析
Nov 22 Python
Python 读取WAV音频文件 画频谱的实例
Mar 14 Python
自学python用什么系统好
Jun 23 Python
Python如何定义有可选参数的元类
Jul 31 Python
Python Web项目Cherrypy使用方法镜像
Nov 05 Python
python数据可视化JupyterLab实用扩展程序Mito
Nov 20 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
咖啡知识 除了喝咖啡还有那些知识点
2021/03/06 新手入门
PHP脚本的10个技巧(8)
2006/10/09 PHP
php preg_match_all结合str_replace替换内容中所有img
2008/10/11 PHP
discuz论坛 用户登录 后台程序代码
2008/11/27 PHP
访问编码后的中文URL返回404错误的解决方法
2014/08/20 PHP
THinkPHP获取客户端IP与IP地址查询的方法
2016/11/14 PHP
JavaScript 闭包在封装函数时的简单分析
2009/11/28 Javascript
使用typeof判断function是否存在于上下文
2014/08/14 Javascript
一个不错的js html页面倒计时可精确到秒
2014/10/22 Javascript
简介AngularJS的视图功能应用
2015/06/17 Javascript
如何用js 实现依赖注入的思想,后端框架思想搬到前端来
2015/08/03 Javascript
javascript模拟C#格式化字符串
2015/08/26 Javascript
JavaScript实现的Tween算法及缓冲特效实例代码
2015/11/03 Javascript
javascript实现仿百度图片的瀑布流加载效果
2016/04/20 Javascript
vue轻量级框架无法获取到vue对象解决方法
2019/05/12 Javascript
vue实现在线学生录入系统
2020/05/30 Javascript
js判断鼠标移入移出方向的方法
2020/06/24 Javascript
JavaScript字符串转数字的简单实现方法
2020/11/27 Javascript
Python基于Matplotlib库简单绘制折线图的方法示例
2017/08/14 Python
Python微信企业号开发之回调模式接收微信端客户端发送消息及被动返回消息示例
2017/08/21 Python
TensorFlow实现模型评估
2018/09/07 Python
opencv实现静态手势识别 opencv实现剪刀石头布游戏
2019/01/22 Python
Python OpenCV之图片缩放的实现(cv2.resize)
2019/06/28 Python
Python 寻找局部最高点的实现
2019/12/05 Python
python和php学习哪个更有发展
2020/06/17 Python
玩具反斗城葡萄牙官方商城:Toys"R"Us葡萄牙
2016/10/21 全球购物
Surfdome西班牙:世界上最受欢迎的生活方式品牌
2019/02/13 全球购物
Capitol Lighting的1800lighting.com:住宅和商业照明
2019/04/10 全球购物
Ruby如何实现动态方法调用
2012/11/18 面试题
人力资源经理的岗位职责范本
2014/02/28 职场文书
岗位竞聘报告范文
2014/11/06 职场文书
2015驻村干部工作总结
2015/04/07 职场文书
基督教追悼会答谢词
2015/09/29 职场文书
少先队大队委竞选口号
2015/12/25 职场文书
高中班主任培训心得体会
2016/01/07 职场文书
python图片灰度化处理的几种方法
2021/06/23 Python