百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

爬虫快手短视频爬取经验分享

toyiye 2024-06-21 12:40 10 浏览 0 评论

作者:冰蓝的天空

原文:http://www.cnblogs.com/binglansky/p/8483096.html

  • 环境: 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 来测试,form-data 方式提交则报错

那换raw 这种

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

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

下面就开始上代码

  1. # -*-coding:utf-8-*-

  2. # author : Corleone

  3. import urllib2,urllib

  4. import json,os,re,socket,time,sys

  5. import Queue

  6. import threading

  7. import logging

  8. # 日志模块

  9. logger = logging.getLogger("AppName")

  10. formatter = logging.Formatter('%(asctime)s %(levelname)-5s: %(message)s')

  11. console_handler = logging.StreamHandler(sys.stdout)

  12. console_handler.formatter = formatter

  13. logger.addHandler(console_handler)

  14. logger.setLevel(logging.INFO)

  15. video_q = Queue.Queue # 视频队列

  16. def get_video:

  17. 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 "

  18. data = {

  19. 'type': 7,

  20. 'page': 2,

  21. 'coldStart': 'false',

  22. 'count': 20,

  23. 'pv': 'false',

  24. 'id': 5,

  25. 'refreshTimes': 4,

  26. 'pcursor': 1,

  27. 'os': 'android',

  28. 'client_key': '3c2cd3f3',

  29. 'sig': '22769f2f5c0045381203fc57d1b5ad9b'

  30. }

  31. req = urllib2.Request(url)

  32. req.add_header("User-Agent", "kwai-android")

  33. req.add_header("Content-Type", "application/x-www-form-urlencoded")

  34. params = urllib.urlencode(data)

  35. try:

  36. html = urllib2.urlopen(req, params).read

  37. except urllib2.URLError:

  38. logger.warning(u"网络不稳定 正在重试访问")

  39. html = urllib2.urlopen(req, params).read

  40. result = json.loads(html)

  41. reg = re.compile(u"[u4e00-u9fa5]+") # 只匹配中文

  42. for x in result['feeds']:

  43. try:

  44. title = x['caption'].replace("n","")

  45. name = " ".join(reg.findall(title))

  46. video_q.put([name, x['photo_id'], x['main_mv_urls'][0]['url']])

  47. except KeyError:

  48. pass

  49. def download(video_q):

  50. path = u"D:快手"

  51. while True:

  52. data = video_q.get

  53. name = data[0].replace("n","")

  54. id = data[1]

  55. url = data[2]

  56. file = os.path.join(path, name + ".mp4")

  57. logger.info(u"正在下载:%s" %name)

  58. try:

  59. urllib.urlretrieve(url,file)

  60. except IOError:

  61. file = os.path.join(path, u"神经病呀"+ '%s.mp4') %id

  62. try:

  63. urllib.urlretrieve(url, file)

  64. except (socket.error,urllib.ContentTooShortError):

  65. logger.warning(u"请求被断开,休眠2秒")

  66. time.sleep(2)

  67. urllib.urlretrieve(url, file)

  68. logger.info(u"下载完成:%s" % name)

  69. video_q.task_done

  70. def main:

  71. # 使用帮助

  72. try:

  73. threads = int(sys.argv[1])

  74. except (IndexError, ValueError):

  75. print u"n用法: " + sys.argv[0] + u" [线程数:10] n"

  76. print u"例如:" + sys.argv[0] + " 10" + u" 爬取视频 开启10个线程 每天爬取一次 一次2000个视频左右(空格隔开)"

  77. return False

  78. # 判断目录

  79. if os.path.exists(u'D:快手') == False:

  80. os.makedirs(u'D:快手')

  81. # 解析网页

  82. logger.info(u"正在爬取网页")

  83. for x in range(1,100):

  84. logger.info(u"第 %s 次请求" % x)

  85. get_video

  86. num = video_q.qsize

  87. logger.info(u"共 %s 视频" %num)

  88. # 多线程下载

  89. for y in range(threads):

  90. t = threading.Thread(target=download,args=(video_q,))

  91. t.setDaemon(True)

  92. t.start

  93. video_q.join

  94. logger.info(u"-----------全部已经爬取完成---------------")

  95. main

下面测试

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

总结:其实我这次爬的快手有点投机取巧了,因为post过去的参数 sign 是签名 的确是有加密的,只所以还能返回数据。

那是因为我每次都是请求的一样的链接 page=1 都是第一页的 当我改成2的时候,就验签失败了。然而,它刚好这样也能返回不同的数据,虽然达到了效果,但却没有能破解他的加密算法。。。

最后放上我的github地址 : https://github.com/binglansky/spider

题图:pexels,CC0 授权。

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码