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的urllib模块显示下载进度示例
Jan 17 Python
python持久性管理pickle模块详细介绍
Feb 18 Python
Ubuntu下安装PyV8
Mar 13 Python
Python网络爬虫实例讲解
Apr 28 Python
Django开发的简易留言板案例详解
Dec 04 Python
Python Pandas 获取列匹配特定值的行的索引问题
Jul 01 Python
python中update的基本使用方法详解
Jul 17 Python
python numpy存取文件的方式
Apr 01 Python
Python3 解决读取中文文件txt编码的问题
Dec 20 Python
django中url映射规则和服务端响应顺序的实现
Apr 02 Python
用python给csv里的数据排序的具体代码
Jul 17 Python
Python编程中Python与GIL互斥锁关系作用分析
Sep 15 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 Cookie学习笔记
2016/08/23 PHP
PHP微信开发之微信录音临时转永久存储
2018/01/26 PHP
thinkphp5.1框架模板布局与模板继承用法分析
2019/07/19 PHP
精通Javascript系列之数据类型 字符串
2011/06/08 Javascript
通过url查找a元素并点击
2014/04/09 Javascript
JS调用打印机功能简单示例
2016/11/28 Javascript
微信小程序  checkbox组件详解及简单实例
2017/01/10 Javascript
JavaScript面向对象精要(下部)
2017/09/12 Javascript
Angular移动端页面input无法输入的解决方法
2017/11/14 Javascript
写给小白看的JavaScript异步
2017/11/29 Javascript
jQuery实现下拉菜单动态添加数据点击滑出收起其他功能
2018/06/14 jQuery
Vue 路由切换时页面内容没有重新加载的解决方法
2018/09/01 Javascript
微信小程序实现省市区三级地址选择
2020/06/21 Javascript
Layer+Echarts构建弹出层折线图的方法
2019/09/25 Javascript
python使用百度翻译进行中翻英示例
2014/04/14 Python
Python3基础之输入和输出实例分析
2014/08/18 Python
python统计中文字符数量的两种方法
2019/01/31 Python
很酷的python表白工具 你喜欢我吗
2019/04/11 Python
浅谈Pytorch中的torch.gather函数的含义
2019/08/18 Python
python 实现方阵的对角线遍历示例
2019/11/29 Python
PyTorch 解决Dataset和Dataloader遇到的问题
2020/01/08 Python
keras tensorflow 实现在python下多进程运行
2020/02/06 Python
python实现文件+参数发送request的实例代码
2021/01/05 Python
canvas实现图片镜像翻转的2种方式
2020/07/22 HTML / CSS
SEPHORA新西兰官方网站:购买化妆品和护肤品
2016/12/02 全球购物
美国最大和最受信任的二手轮胎商店:Bestusedtires.com
2020/06/02 全球购物
施工资料员的岗位职责
2013/12/22 职场文书
最新茶叶店创业计划书
2014/01/14 职场文书
初级会计求职信范文
2014/02/15 职场文书
临床护理求职信
2014/04/26 职场文书
英语复习计划
2015/01/19 职场文书
会计继续教育培训心得体会
2016/01/19 职场文书
2016年第16个全民国防教育日宣传活动总结
2016/04/05 职场文书
Go标准容器之Ring的使用说明
2021/05/05 Golang
Python scrapy爬取起点中文网小说榜单
2021/06/13 Python
关于Mybatis中SQL节点的深入解析
2022/03/19 Java/Android