前言

讲一下,文明爬虫,从我做起(1.文章中的程序代码仅供学习,切莫用于商业活动,一经被相关人员发现,本小编概不负责!2.请在服务器闲时运行本程序代码,以免对服务器造成很大的负担.)

1. 实现原理

小编这里讲的视频都是快手上的长视频哈!链接为:快手长视频

我们随便点击其中的一个视频进入,按电脑键盘的F12键来到开发者模式,在开发者模式下按ctrl+F,输入:<video,可以找到这个视频的下载链接如下:





我们直接运用selenium这个模块,直接对这个页面解析简简单单就可以获取这个视频的下载链接了。

但是没有这么简单的哈!快手在这方面还是做的不错的,为了防止机器人,快手做了一个滑动窗口,如下:



代码如下:

  1. from selenium import webdriver
  2. driver=webdriver.Chrome()
  3. driver.get(url='https://www.kuaishou.com/video/3xwpkmq75cf2shu?authorId=3x7tp82qssqyteu&tabId=0&area=recommendxxrecommend')
  4. driver.implicitly_wait(5)
  5. downloadUrl=driver.find_element_by_xpath("//video[@class='player-video']").get_attribute("src")
  6. print(downloadUrl)

虽然我们可以通过添加一个while循环实现找到这个视频的下载链接哈!



但这是不是显得很繁琐呀!

后来想了一下,这个视频的下载链接可能是使用ajax请求从后台获取的,你还别说,还真的是这样的。

查看一下这个请求,发现是post的,请求参数如下:

经过多个视频的比较,发现只有variables下的字段不同,并且发现如下:

当然,有的视频链接他是没有area,相对应它的请求参数webPageArea也没有。我们可以通过使用正则表达式将上述两个参数值获取到,但是用代码发起请求时,发现虽然请求状态码为200,但是请求得到的数据却没有我们想要的视频下载链接。



cookie字段信息如下:



经过多个视频比较,这个cookie字段可以是固定的(除了did这个字段的值是随机生成的之外【随机生成的直接用固定即可】,其他都是固定的)。

2. 程序代码

代码如下:

  1. import requests
  2. from crawlers.userAgent import useragent
  3. import json
  4. import re
  5. videoUrl=input("请输入视频的链接:")
  6. # https://www.kuaishou.com/video/3xbszt6yravw739?authorId=3x45xripnn3tq5a&tabId=1&area=recommendxxfilm
  7. photoId=re.findall(r"https://www.kuaishou.com/video/(.*)\?.*",videoUrl)[0]
  8. try:
  9. webPageArea=re.findall(r".*area=(.*)",videoUrl)[0]
  10. except Exception as e:
  11. print(e)
  12. webPageArea=''
  13. useragent = useragent()
  14. url = 'https://www.kuaishou.com/graphql'
  15. print(photoId,webPageArea)
  16. headers = {
  17. "user-agent": useragent.getUserAgent(), # 模拟浏览器访问
  18. "content-type": "application/json", # 请求的参数类型为json数据
  19. "Cookie": "kpf=PC_WEB; kpn=KUAISHOU_VISION; clientid=3; did=web_4a95d5c2e09f889043edeffcb9fdb89d; didv=1635052275840",
  20. }
  21. data =json.dumps({"operationName": "visionVideoDetail",
  22. "variables": {"photoId": "%s"%(photoId), "page": "detail", "webPageArea": "{}".format(webPageArea)},
  23. "query": "query visionVideoDetail($photoId: String, $type: String, $page: String, $webPageArea: String) {\n "
  24. "visionVideoDetail(photoId: $photoId, type: $type, page: $page, webPageArea: $webPageArea) {\n "
  25. "status\n type\n author {\n id\n name\n following\n headerUrl\n "
  26. "__typename\n }\n photo {\n id\n duration\n caption\n likeCount\n "
  27. "realLikeCount\n coverUrl\n photoUrl\n liked\n timestamp\n expTag\n "
  28. "llsid\n viewCount\n videoRatio\n stereoType\n croppedPhotoUrl\n manifest {"
  29. "\n mediaType\n businessType\n version\n adaptationSet {\n id\n "
  30. " duration\n representation {\n id\n defaultSelect\n "
  31. " backupUrl\n codecs\n url\n height\n width\n "
  32. " avgBitrate\n maxBitrate\n m3u8Slice\n qualityType\n "
  33. "qualityLabel\n frameRate\n featureP2sp\n hidden\n "
  34. "disableAdaptive\n __typename\n }\n __typename\n }\n "
  35. "__typename\n }\n __typename\n }\n tags {\n type\n name\n "
  36. "__typename\n }\n commentLimit {\n canAddComment\n __typename\n }\n llsid\n "
  37. "danmakuSwitch\n __typename\n }\n}\n"}) # 请求的data数据,json类型
  38. rsp=requests.post(url=url, headers=headers, data=data)
  39. print('响应的状态码为:',rsp.status_code)
  40. infos=json.loads(rsp.text)
  41. info=infos['data']['visionVideoDetail']['photo']
  42. videoName=info['caption']
  43. for str_i in ['?','、','╲','/','*','“','”','<','>','|']:
  44. videoName=videoName.replace(str_i,'') # 文件重命名
  45. print('视频的标题:',videoName)
  46. downloadUrl=info['photoUrl']
  47. print('视频的下载链接为:',downloadUrl)
  48. headers={'user-agent':useragent.getUserAgent()}
  49. rsp2=requests.get(url=downloadUrl,headers=headers)
  50. with open(file="{}.mp4".format(videoName),mode="wb") as f:
  51. f.write(rsp2.content)

Python爬虫:给我一个链接,快手视频随便下载的更多相关文章

  1. Python爬虫---爬取抖音短视频

    目录 前言 抖音爬虫制作 选定网页 分析网页 提取id构造网址 拼接数据包链接 获取视频地址 下载视频 全部代码 实现结果 待解决的问题 前言 最近一直想要写一个抖音爬虫来批量下载抖音的短视频,但是经 ...

  2. python爬虫 抓取一个网站的所有网址链接

    sklearn实战-乳腺癌细胞数据挖掘 https://study.163.com/course/introduction.htm?courseId=1005269003&utm_campai ...

  3. Python爬虫之编写一个可复用的下载模块

    看用python写网络爬虫第一课之编写可复用的下载模块的视频,发现和<用Python写网络爬虫>一书很像,写了点笔记: #-*-coding:utf-8-*- import urllib2 ...

  4. python中将已有链接的视频进行下载

    使用python爬取视频网站时,会得到一系列的视频链接,比如MP4文件.得到视频文件之后需要对视频进行下载,本文写出下载视频文件的函数. 首先导入requests库,安装库使用pip install ...

  5. Python爬虫实现抓取腾讯视频所有电影【实战必学】

    2019-06-27 23:51:51 阅读数 407  收藏 更多 分类专栏: python爬虫   前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问 ...

  6. 【图文详解】python爬虫实战——5分钟做个图片自动下载器

    python爬虫实战——图片自动下载器 之前介绍了那么多基本知识[Python爬虫]入门知识,(没看的先去看!!)大家也估计手痒了.想要实际做个小东西来看看,毕竟: talk is cheap sho ...

  7. python 爬虫学习<将某一页的所有图片下载下来>

    在我们日常上网浏览网页的时候,经常会看到一些好看的图片,我们就希望把这些图片保存下载,或者用户用来做桌面壁纸,或者用来做设计的素材. 我们最常规的做法就是通过鼠标右键,选择另存为.但有些图片鼠标右键的 ...

  8. python爬虫实战——5分钟做个图片自动下载器

      python爬虫实战——图片自动下载器 制作爬虫的基本步骤 顺便通过这个小例子,可以掌握一些有关制作爬虫的基本的步骤. 一般来说,制作一个爬虫需要分以下几个步骤: 分析需求(对,需求分析非常重要, ...

  9. Python爬虫之足球小将动漫(图片)下载

      尽管俄罗斯世界杯的热度已经褪去,但这届世界杯还是给全世界人民留下了无数难忘的回忆,不知你的回忆里有没有日本队的身影?本次世界杯中,日本队的表现让人眼前一亮,很难想象,就是这样一只队伍,二十几年还是 ...

随机推荐

  1. 小白2分钟学会Visual Studio将引用包打包到NuGet上

    前言 之前我们说 10分钟学会Visual Studio将自己创建的类库打包到NuGet进行引用(net,net core,C#),过程有些许繁琐,并且需要有一定的基础. 怎么办呢,不慌,看法宝. 两 ...

  2. “ShardingCore”是如何针对分表下的分页进行优化的

    分表情况下的分页如何优化 首先还是要给自己的开原框架打个广告 sharding-core 针对efcore 2+版本的分表组件,首先我们来快速回顾下目前市面上分表下针对分页常见的集中解决方案 分表解决 ...

  3. MySQL——MySQL安装

    1.rpm yum安装:安装方便.速度快.无法定制 2.二进制安装:解压即可使用,不能定制功能 3.编译安装: 可定制.安装慢: MySQL5.5之前:./configure make make in ...

  4. client-go实战之五:DiscoveryClient

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  5. noip模拟47

    原版在 \(linux\) 本地写完没保存关机给没了-- 再简单写一下 \(t2\) 用 \(dp\) 转移 \(f[i]=\sum _ {j=last[a[i]]}^{i-1} f[j]\) 用前缀 ...

  6. openswan发送状态机分析

    openswan发送状态机分析 1. 函数调用关系 2. 函数说明 如果按用户空间.内核空间划分的话,此部分代码更多是运行在内核空间的. 2.1 ipsec_tunnel_init_devices() ...

  7. iframe 内容适用高度

    HTML: <div class="content"> <iframe id="frameObj" src="链接" fr ...

  8. element-ui 弹出组件的遮罩层在弹出层dialog模态框的上面

     造成的原因: 因为dialog的组件外层div设置了 position:absolute: 属性所以导致遮罩层会在最上面. 解决方法: 在属性内加上这段代码 :append-to-body=&quo ...

  9. 【C++】特殊字符“\0”,以及NULL相关

    我们都知道,'\0'是字符串的结束标记.因此,执行这段代码: #include<bits/stdc++.h> using namespace std; int main(){ cout&l ...

  10. C++ 飞行游戏

    源代码: #include<bits/stdc++.h> #include<windows.h> #include<conio.h> using namespace ...