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 Web框架Pylons中使用MongoDB的例子
Dec 03 Python
python-opencv在有噪音的情况下提取图像的轮廓实例
Aug 30 Python
python之matplotlib学习绘制动态更新图实例代码
Jan 23 Python
Python实现求解括号匹配问题的方法
Apr 17 Python
python把数组中的数字每行打印3个并保存在文档中的方法
Jul 17 Python
Django框架自定义session处理操作示例
May 27 Python
在Qt中正确的设置窗体的背景图片的几种方法总结
Jun 19 Python
pygame实现非图片按钮效果
Oct 29 Python
Python基于pygame实现单机版五子棋对战
Dec 26 Python
python实现单目标、多目标、多尺度、自定义特征的KCF跟踪算法(实例代码)
Jan 08 Python
pytorch 状态字典:state_dict使用详解
Jan 17 Python
python递归调用中的坑:打印有值, 返回却None
Mar 16 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中的外观模式facade pattern
2018/02/05 PHP
基于JavaScript实现继承机制之调用call()与apply()的方法详解
2013/05/07 Javascript
可选择和输入的下拉列表框示例
2013/11/05 Javascript
javascript中兼容主流浏览器的动态生成iframe方法
2014/05/05 Javascript
js实现按钮加背景图片常用方法
2014/11/01 Javascript
jQuery中的ajax async同步和异步详解
2015/09/29 Javascript
js简单获取表单中单选按钮值的方法
2016/08/23 Javascript
DOM操作原生js 的bug,使用jQuery 可以消除的解决方法
2016/09/04 Javascript
jQuery Ajax传值到Servlet出现乱码问题的解决方法
2016/10/09 Javascript
Nodejs进阶:基于express+multer的文件上传实例
2016/11/21 NodeJs
让微信小程序支持ES6中Promise特性的方法详解
2017/06/13 Javascript
Vue 项目部署到服务器的问题解决方法
2017/12/05 Javascript
vue的过滤器filter实例详解
2018/09/17 Javascript
模块化react-router配置方法详解
2019/06/03 Javascript
Vue编程式跳转的实例代码详解
2019/07/10 Javascript
vue 解决路由只变化参数页面组件不更新问题
2019/11/05 Javascript
JavaScript实现多层颜色选项卡嵌套
2020/09/21 Javascript
跟老齐学Python之dict()的操作方法
2014/09/24 Python
Python中的rfind()方法使用详解
2015/05/19 Python
Python中的super()方法使用简介
2015/08/14 Python
用Python写冒泡排序代码
2016/04/12 Python
深入解析Python编程中super关键字的用法
2016/06/24 Python
python网络爬虫学习笔记(1)
2018/04/09 Python
解决pycharm界面不能显示中文的问题
2018/05/23 Python
HTML5有哪些新特征
2015/12/01 HTML / CSS
白宫黑市官网:White House Black Market
2016/11/17 全球购物
End Clothing美国站:英国男士潮牌商城
2018/04/20 全球购物
波兰最大的度假胜地和城市公寓租赁运营商:Sun & Snow
2018/10/18 全球购物
编程用JAVA解析XML的方式
2013/07/07 面试题
2014信息技术专业毕业生自我评价
2014/01/17 职场文书
师德师风演讲稿
2014/05/05 职场文书
群众路线教育实践活动民主生活会个人检查对照思想汇报
2014/10/04 职场文书
运动会广播稿50字-100字
2014/10/11 职场文书
毕业论文答辩开场白和结束语
2015/05/27 职场文书
简单了解 MySQL 中相关的锁
2021/05/25 MySQL
聊聊redis-dump工具安装问题
2022/01/18 Redis