流程分析

一、导入需要的三方库

  1. import re #正则表表达式文字匹配
  2. import requests #指定url,获取网页数据
  3. import json #转化json格式
  1. import os #创建文件
  1.  

二、确定目标地址

快手的目标地址需要在https://www.kuaishou.com网站截取请求,需要在控制台network截取,找到真正的地址https://www.kuaishou.com/graphql

  1. url = "https://www.kuaishou.com/graphql" #目标网站url

三、确定数据位置

通过在network中搜索网页中显示的特定数据来确定data数据包,可以发现数据在data中。

四、伪装请求头、复制data数据

在控制台找到headers,复制里面的信息并手动转换成键值对的形式

在负载中找到以下信息,并封装到data里用于post请求

  1. data = { #封装data数据
  2. 'operationName': "visionSearchPhoto",
  3. 'query': "fragment photoContent on PhotoEntity {\n id\n duration\n caption\n likeCount\n viewCount\n realLikeCount\n coverUrl\n photoUrl\n photoH265Url\n manifest\n manifestH265\n videoResource\n coverUrls {\n url\n __typename\n }\n timestamp\n expTag\n animatedCoverUrl\n distance\n videoRatio\n liked\n stereoType\n profileUserTopPhoto\n __typename\n}\n\nfragment feedContent on Feed {\n type\n author {\n id\n name\n headerUrl\n following\n headerUrls {\n url\n __typename\n }\n __typename\n }\n photo {\n ...photoContent\n __typename\n }\n canAddComment\n llsid\n status\n currentPcursor\n __typename\n}\n\nquery visionSearchPhoto($keyword: String, $pcursor: String, $searchSessionId: String, $page: String, $webPageArea: String) {\n visionSearchPhoto(keyword: $keyword, pcursor: $pcursor, searchSessionId: $searchSessionId, page: $page, webPageArea: $webPageArea) {\n result\n llsid\n webPageArea\n feeds {\n ...feedContent\n __typename\n }\n searchSessionId\n pcursor\n aladdinBanner {\n imgUrl\n link\n __typename\n }\n __typename\n }\n}\n",
  4. 'variables': {'keyword': keyword,'pcursor': str(page),'page':"search",'searchSessionId':"MTRfNTU2NDg2NDBfMTY1MTE0Njk1MTk5OV_mhaLmkYdfNjA0NQ"}
  5. }
  6.  
  7. data = json.dumps(data) #将字典数据data转换成需要的json
  8.  
  9. headers = { #伪装请求头,模拟浏览器访问
  10. 'accept': "*/*",
  11. 'Accept-Encoding' : "gzip,deflate,br",
  12. 'Accept-Language': "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
  13. 'Connection': "keep-alive",
  14. 'Content-Length': "1279",
  15. 'content-type': "application/json",
  16. 'Cookie': "clientid=3; did=web_3a9d9e97c96c8d33eddd663ef9362703; client_key=65890b29; kpf=PC_WEB; kpn=KUAISHOU_VISION; userId=55648640; kuaishou.server.web_st=ChZrdWFpc2hvdS5zZXJ2ZXIud2ViLnN0EqABVSIs0T2ccYTa7qgMDgpAdRiErWNJyU1r87iKEYuIWEo_oJSNGq4aTBB5sq0bA7iLeCMOoX0grrEbBkpPmehOVWEs_tC-cDytf6dxSLnrE9-tRQaVcHziopazhh5rroA2XZmHEjHAe6z9-AHD0ZTxV9nJPHeI0-k0wfn9DHvDcj8ZUgQexbGwXDeH2wBV_WSuzutsd3d5oLNmN-90a33TXhoS6uws2LN-siMyPVYdMaXTUH7FIiBd27-7kiEEP6BHgx67BTXhdNPtfA88SZZL4Q_uQ09AuCgFMAE; kuaishou.server.web_ph=b0d04539ad2d77e13d866a70f9e56371c4a6",
  17. 'Host' : "www.kuaishou.com",
  18. 'Origin': "https://www.kuaishou.com",
  19. 'Referer': "https://www.kuaishou.com/search/video?searchKey=%E6%85%A2%E6%91%87",
  20. 'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="100", "Microsoft Edge";v="100"',
  21. 'sec-ch-ua-mobile' : "?0",
  22. 'sec-ch-ua-platform': '" "Windows" "',
  23. 'Sec-Fetch-Dest': "empty",
  24. 'Sec-Fetch-Mode':"cors",
  25. 'Sec-Fetch-Site': "same-origin",
  26. "User-Agent": "Mozilla / 5.0(Linux;Android6.0;Nexus5 Build / MRA58N) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 99.0.4844.51Mobile Safari / 537.36"
  27. }

五、发出请求

向网站发起请求,需要用到第三方requests库,进行访问。

  1. response = requests.post(url=url,headers=headers,data=data) #向目标网站发出请求

六、数据解析

通过re库和xpath进行数据解析,解析到需要的数据封装到列表中。

  1. json_data = response.json() #转换json数据
  2. #print(json_data)
  3. feed_list = json_data['data']['visionSearchPhoto']['feeds'] #在标签中找出每一项的列表
  4. #print(feed_list)
  5.  
  6. for feeds in feed_list: #循环每一项
  7. title = feeds['photo']['caption'] #在网页中找出标题
  8. new_title = re.sub(r'[\/:*?"<>\n]','_',title) #去除标题中的特殊字符
  9. photoUrl = feeds['photo']['photoUrl'] #找到视频的url地址
  10. mp4_data = requests.get(photoUrl).content #转换视频二进制形式

七、保存数据

创建文件夹,并将数据保存到文件夹中。需要用到os库。

  1. def mkdir(path): #创建文件夹
  2. # 引入模块
  3. import os #引入第三方库
  4.  
  5. # 去除首位空格
  6. path = path.strip()
  7. # 去除尾部 \ 符号
  8. path = path.rstrip("\\")
  9. # 判断路径是否存在
  10. # 存在 True
  11. # 不存在 False
  12. isExists = os.path.exists(path)
  13. # 判断结果
  14. if not isExists:
  15. # 如果不存在则创建目录
  16. # 创建目录操作函数
  17. os.makedirs(path)
  18. print(path + ' 创建成功')
  19. return True
  20. else:
  21. # 如果目录存在则不创建,并提示目录已存在
  22. print(path + ' 目录已存在')
  23. return False
  1. with open(keyword+'/'+ new_title +'.mp4',mode="wb") as f: #设定保存数据路径
  2. f.write(mp4_data) #保存数据
  3. print("保存成功!",new_title)

完整源代码

  1. # -*- coding = utf-8 -*-
  2. # @Time : 2022/4/28 10:48
  3. # @Author :王敬博
  4. # @File : 快手小姐姐.py
  5. # @Software: PyCharm
  6. import re #正则表表达式文字匹配
  7. import requests #指定url,获取网页数据
  8. import json #转化json格式
  9.  
  10. def mkdir(path): #创建文件夹
  11. # 引入模块
  12. import os #引入第三方库
  13.  
  14. # 去除首位空格
  15. path = path.strip()
  16. # 去除尾部 \ 符号
  17. path = path.rstrip("\\")
  18. # 判断路径是否存在
  19. # 存在 True
  20. # 不存在 False
  21. isExists = os.path.exists(path)
  22. # 判断结果
  23. if not isExists:
  24. # 如果不存在则创建目录
  25. # 创建目录操作函数
  26. os.makedirs(path)
  27. print(path + ' 创建成功')
  28. return True
  29. else:
  30. # 如果目录存在则不创建,并提示目录已存在
  31. print(path + ' 目录已存在')
  32. return False
  33.  
  34. url = "https://www.kuaishou.com/graphql" #目标网站url
  35.  
  36. keyword = input("请输入想要搜索的关键词") #搜索关键字
  37. mkpath = "d:\\pywork\\demo02\\"+keyword #创建的文件路径
  38. mkdir(mkpath) #调用函数,创建文件夹
  39.  
  40. for page in range(1,5): #爬取4页
  41. print("==================第%d页================="%page) #打印爬取的页数
  42. data = { #封装data数据
  43. 'operationName': "visionSearchPhoto",
  44. 'query': "fragment photoContent on PhotoEntity {\n id\n duration\n caption\n likeCount\n viewCount\n realLikeCount\n coverUrl\n photoUrl\n photoH265Url\n manifest\n manifestH265\n videoResource\n coverUrls {\n url\n __typename\n }\n timestamp\n expTag\n animatedCoverUrl\n distance\n videoRatio\n liked\n stereoType\n profileUserTopPhoto\n __typename\n}\n\nfragment feedContent on Feed {\n type\n author {\n id\n name\n headerUrl\n following\n headerUrls {\n url\n __typename\n }\n __typename\n }\n photo {\n ...photoContent\n __typename\n }\n canAddComment\n llsid\n status\n currentPcursor\n __typename\n}\n\nquery visionSearchPhoto($keyword: String, $pcursor: String, $searchSessionId: String, $page: String, $webPageArea: String) {\n visionSearchPhoto(keyword: $keyword, pcursor: $pcursor, searchSessionId: $searchSessionId, page: $page, webPageArea: $webPageArea) {\n result\n llsid\n webPageArea\n feeds {\n ...feedContent\n __typename\n }\n searchSessionId\n pcursor\n aladdinBanner {\n imgUrl\n link\n __typename\n }\n __typename\n }\n}\n",
  45. 'variables': {'keyword': keyword,'pcursor': str(page),'page':"search",'searchSessionId':"MTRfNTU2NDg2NDBfMTY1MTE0Njk1MTk5OV_mhaLmkYdfNjA0NQ"}
  46. }
  47.  
  48. data = json.dumps(data) #将字典数据data转换成需要的json
  49.  
  50. headers = { #伪装请求头,模拟浏览器访问
  51. 'accept': "*/*",
  52. 'Accept-Encoding' : "gzip,deflate,br",
  53. 'Accept-Language': "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
  54. 'Connection': "keep-alive",
  55. 'Content-Length': "1279",
  56. 'content-type': "application/json",
  57. 'Cookie': "clientid=3; did=web_3a9d9e97c96c8d33eddd663ef9362703; client_key=65890b29; kpf=PC_WEB; kpn=KUAISHOU_VISION; userId=55648640; kuaishou.server.web_st=ChZrdWFpc2hvdS5zZXJ2ZXIud2ViLnN0EqABVSIs0T2ccYTa7qgMDgpAdRiErWNJyU1r87iKEYuIWEo_oJSNGq4aTBB5sq0bA7iLeCMOoX0grrEbBkpPmehOVWEs_tC-cDytf6dxSLnrE9-tRQaVcHziopazhh5rroA2XZmHEjHAe6z9-AHD0ZTxV9nJPHeI0-k0wfn9DHvDcj8ZUgQexbGwXDeH2wBV_WSuzutsd3d5oLNmN-90a33TXhoS6uws2LN-siMyPVYdMaXTUH7FIiBd27-7kiEEP6BHgx67BTXhdNPtfA88SZZL4Q_uQ09AuCgFMAE; kuaishou.server.web_ph=b0d04539ad2d77e13d866a70f9e56371c4a6",
  58. 'Host' : "www.kuaishou.com",
  59. 'Origin': "https://www.kuaishou.com",
  60. 'Referer': "https://www.kuaishou.com/search/video?searchKey=%E6%85%A2%E6%91%87",
  61. 'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="100", "Microsoft Edge";v="100"',
  62. 'sec-ch-ua-mobile' : "?0",
  63. 'sec-ch-ua-platform': '" "Windows" "',
  64. 'Sec-Fetch-Dest': "empty",
  65. 'Sec-Fetch-Mode':"cors",
  66. 'Sec-Fetch-Site': "same-origin",
  67. "User-Agent": "Mozilla / 5.0(Linux;Android6.0;Nexus5 Build / MRA58N) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 99.0.4844.51Mobile Safari / 537.36"
  68. }
  69.  
  70. response = requests.post(url=url,headers=headers,data=data) #向目标网站发出请求
  71. json_data = response.json() #转换json数据
  72. #print(json_data)
  73. feed_list = json_data['data']['visionSearchPhoto']['feeds'] #在标签中找出每一项的列表
  74. #print(feed_list)
  75.  
  76. for feeds in feed_list: #循环每一项
  77. title = feeds['photo']['caption'] #在网页中找出标题
  78. new_title = re.sub(r'[\/:*?"<>\n]','_',title) #去除标题中的特殊字符
  79. photoUrl = feeds['photo']['photoUrl'] #找到视频的url地址
  80. mp4_data = requests.get(photoUrl).content #转换视频二进制形式
  81. with open(keyword+'/'+ new_title +'.mp4',mode="wb") as f: #设定保存数据路径
  82. f.write(mp4_data) #保存数据
  83. print("保存成功!",new_title)

效果展示

总结

这次爬取的流程以及源代码是从bili的课程中学到的,大概用了3个小时左右,个人感觉第一次爬取动态网页还是找到数据是比较难的。通过这次实践我终于体会到了程序员的快乐(谁不喜欢看小姐姐呢),嘿嘿嘿!

如果有问题可以私聊我,如果对你有帮助的话,记得个赞哦!

python爬取快手小姐姐视频的更多相关文章

  1. Python爬虫:爬取美拍小姐姐视频

    最近在写一个应用,需要收集微博上一些热门的视频,像这些小视频一般都来自秒拍,微拍,美拍和新浪视频,而且没有下载的选项,所以只能动脑想想办法了. 第一步 分析网页源码. 例如:http://video. ...

  2. python爬取微信小程序(实战篇)

    python爬取微信小程序(实战篇) 本文链接:https://blog.csdn.net/HeyShHeyou/article/details/90452656 展开 一.背景介绍 近期有需求需要抓 ...

  3. Python爬取微信小程序(Charles)

    Python爬取微信小程序(Charles) 本文链接:https://blog.csdn.net/HeyShHeyou/article/details/90045204 一.前言 最近需要获取微信小 ...

  4. python爬取快手ios端首页热门视频

    最近快手这种小视频app,特别的火,中午吃过午饭,闲来无聊,想搞下快手的短视频,看能不能搞到. 于是乎, 打开了fiddler,开始准备抓包, 设置代理,重启,下一步,查看本机ip 手机打开网络设置 ...

  5. 教你用python爬取抖音app视频

    记录一下如何用python爬取app数据,本文以爬取抖音视频app为例. 编程工具:pycharm app抓包工具:mitmproxy app自动化工具:appium 运行环境:windows10 思 ...

  6. python爬取快手视频 多线程下载

    就是为了兴趣才搞的这个,ok 废话不多说 直接开始. 环境: python 2.7 + win10 工具:fiddler postman 安卓模拟器 首先,打开fiddler,fiddler作为htt ...

  7. 用python写一个爬虫——爬取性感小姐姐

    忍着鼻血写代码 今天写一个简单的网上爬虫,爬取一个叫妹子图的网站里面所有妹子的图片. 然后试着先爬取了三页,大概有七百多张图片吧!各个诱人的很,有兴趣的同学可以一起来爬一下,大佬级程序员勿喷,简单爬虫 ...

  8. python爬取b站排行榜视频信息

    和上一篇相比,差别不是很大 import xlrd#读取excel import xlwt#写入excel import requests import linecache import wordcl ...

  9. 没有内涵段子可以刷了,利用Python爬取段友之家贴吧图片和小视频(含源码)

    由于最新的视频整顿风波,内涵段子APP被迫关闭,广大段友无家可归,但是最近发现了一个"段友"的app,版本更新也挺快,正在号召广大段友回家,如下图,有兴趣的可以下载看看(ps:我不 ...

随机推荐

  1. 深入理解Java虚拟机-HotSpot虚拟机对象探秘

    一.对象的创建过程 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载.解析和初始化过.如果没有,那就先执行相应的类 ...

  2. java-与文件相关

    java.nio.file 表示non-blocking 非阻塞io(输入和输出) 一个 Path 对象表示一个文件或者目录的路径,是一个跨操作系统(OS)和文件系统的抽象 java.nio.file ...

  3. 学习openstack(五)

    OpenStackOpenStack介绍OpenStack是一种免费的开源平台,帮助服务提供商实现类似于亚马逊EC2和S3的基础设施服务.OpenStack当前有三个核心项目:计算(Nova),对象存 ...

  4. 自动驾驶运动规划-Reeds Shepp曲线

    自动驾驶运动规划-Reeds Shepp曲线 相比于Dubins Car只允许车辆向前运动,Reeds Shepp Car既允许车辆向前运动,也允许车辆向后运动. Reeds Shepp Car运动规 ...

  5. AngularJS的核心对象angular上的方法全面解析(AngularJS全局API)

    总结一下AngularJS的核心对象angular上的方法,也帮助自己学习一下平时工作中没怎么用到的方法,看能不能提高开发效率.我当前使用的Angularjs版本是1.5.5也是目前最新的稳定版本,不 ...

  6. react开发教程(三)组件的构建

    什么是组件 组件化就好像我们的电脑装机一样,一个电脑由显示器.主板.内存.显卡.硬盘,键盘,鼠标.... 组件化开发有如下的好处:降低整个系统的耦合度,在保持接口不变的情况下,我们可以替换不同的组件快 ...

  7. Python Turtle库绘制表盘时钟

    运行效果: 源代码: 1 # coding=utf-8 2 3 import turtle 4 from datetime import * 5 6 # 抬起画笔,向前运动一段距离放下 7 def S ...

  8. 小程序picker的使用

    效果图: 代码: <view class='infoItem'> <view class='infoItem-left'><text style='color:red'& ...

  9. 如何在云服务器上安装vim(bash: vim :command not found)

    1.apt-get update 2.apt-get install vim vim文件即可成功!

  10. Spring Boot配置druid监控页功能

    1.导入坐标 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http ...