自己喜欢的东西,我们通常会想要它留存得久一点,但是往往别人上传得视频并不一定永久留存~
有的不是被下架了,就是作者已删除该视频,不可观看!!
那怎么办呢?一般做法当然是把它下载下来啦~但是,一个自己下还好,多个就不行了
这个时候就会想借助外力来完成这件事,于是我的代码也产生了
首先,我们得来点准备工作 ⛏当你准备还是写代码前,你的工具没有怎么能行呢~
就像:你信心满满得要去约会,一切已准备稳妥,却发现你最重要的环节——女朋友你还没有!!💘
我想你明白了吧(ps:这里所说言语不管作者的事,请不要上升真人~)狗头.jpj
开发环境- python 3.8 运行代码
- pycharm 2021.2 辅助敲代码
- requests 第三方模块
如果,你是零基础小白,不会安装软件的话,可以查看左侧主页
你会发现有一个🐎,扫它,你将获得知识的力量(其实就是视频教程啦~找管理员小姐姐领取哦)
模块安装呢,安装有两种方法,我这边都替你写出来啦~(如果报错也可左侧扫🐎,可获得解答哦)
-
win + R 输入cmd 输入安装命令 pip install 模块名 如果出现爆红 可能是因为 网络连接超时 切换国内镜像源
-
在pycharm中点击Terminal(终端) 输入安装命令
你用哪个习惯一点(或比较顺眼)就可以用哪个,都一样哒~
这里说明一下,如果你有基础的话可点击下方目录直接跳转哦~没有基础的小可耐要仔细的看思路分析哦
- 前言
- 首先,我们得来点准备工作 ⛏
- 开发环境
- 思路分析
- 第一步,我们来找到一个-美女小姐姐💞
- 第二步,打开开发者工具刷新网页
- 第三步,随便点击打开一个视频
- 第四步,点击搜到的内容
- 第五步,依次展开查看, 去找到我们需要的视频地址
- 第六步,确定url地址, 请求方式, 请求参数, 请求头参数
- 代码实现:
- 正头戏:代码
- 导入模块
- 伪装
- 1. 发送请求 get post
- 2. 获取数据 .json() 返回字典类型数据
- 3. 解析数据
- 4. 保存数据 如果你们拿到的链接 就是 视频 或者 音频 或者 图片
- 采集用户数据
- 获取评论数据
- 搜索作品
- 自动点赞 👍 评论 📧
- 视频教程
- 尾语
这这里,我们要确定我们想要什么,比如:视频、标题、用户信息、评论等等。。。。那现在,我们先来看看视频
第一步,我们来找到一个-美女小姐姐💞(不要以为只要你们男孩子喜欢小姐姐,女孩子也喜欢~),点击她的主页
第二步,打开开发者工具刷新网页- 右键点击检查 或者 F12 打开
- 选择network 然后刷新网页
不要忘记刷新哦~不然可能会没数据de
第三步,随便点击打开一个视频
图片怕你们没看清,这边打字写出来
- 在标题里面随便复制几个字
- 点击开发者工具上的搜索工具
- 粘贴你刚刚复制的内容
- 点击打开找到的数据包
- 点击Preview预览
- 请求头参数
- 请求参数
- 发送请求
- 获取数据
- 解析数据
- 保存数据
不要小看它只有小小四个步骤,大多数代码实现可都是按照这小小四步来的 📌
正头戏:代码 导入模块代码里大部分都有注释啦~如果你看完还是不太明白的话,同样可以左侧扫🐎领取视频教程哦
import requests # 发送请求 第三方模块(第三方应用 pip)
import re
伪装
代码里又两处 headers 地方被我删去了网址,小可耐们可以自己去添加一下哦~
# 1. 选中要替换的代码
# 2. ctrl + R
# 3. 第一个框(.*?): (.*)
# 4. 在第二个框里面输入 '': '',
# 5. 点击全部替换(* 点亮 * 号)
headers = {
'content-type': 'application/json',
'Cookie': 'kpf=PC_WEB; kpn=KUAISHOU_VISION; clientid=3; did=web_ea128125517a46bd491ae9ccb255e242; client_key=65890b29; didv=1646739254078; userId=270932146; kuaishou.server.web_st=ChZrdWFpc2hvdS5zZXJ2ZXIud2ViLnN0EqABctRgGaXi5efEBpnbdtJMp3nnnXqENRWBoFQABtOr1ZFUNAjEo5NTZ4F0leSypsSFE4_-FGTnBqKEYh8Wcrszm3FGF03559Z9bFQCX_8ew_kLKPWVB9ZRlWQgISoG4-XZXIOqiBgkQKsPbpYKiA3X4_0rMDbo9-c0nWXeOoThekj8W3u7_yfI4fUY3h5WgTEDYT0yrXkZmhWlFV_jpVxDrBoSzFZBnBL4suA5hQVn0dPKLsMxIiCo1i0bY9V6-OVEk7yMnH86RNliTZACHvLPjL9FTHHQOigFMAE; kuaishou.server.web_ph=09735672944cbf9e53431bf3e0514a0d058b',
'Host': '',
'Origin': '源码、解答、教程加🐧裙:832157862',
# 防盗链
'Referer': '',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.88 Safari/537.36',
}
url = ''
def get_page(pcursor):
# 指定要谁的视频
data = {
"operationName": "visionProfilePhotoList",
"query": "query visionProfilePhotoList($pcursor: String, $userId: String, $page: String, $webPageArea: String) {\n visionProfilePhotoList(pcursor: $pcursor, userId: $userId, page: $page, webPageArea: $webPageArea) {\n result\n llsid\n webPageArea\n feeds {\n type\n author {\n id\n name\n following\n headerUrl\n headerUrls {\n cdn\n url\n __typename\n }\n __typename\n }\n tags {\n type\n name\n __typename\n }\n photo {\n id\n duration\n caption\n likeCount\n realLikeCount\n coverUrl\n coverUrls {\n cdn\n url\n __typename\n }\n photoUrls {\n cdn\n url\n __typename\n }\n photoUrl\n liked\n timestamp\n expTag\n animatedCoverUrl\n stereoType\n videoRatio\n profileUserTopPhoto\n __typename\n }\n canAddComment\n currentPcursor\n llsid\n status\n __typename\n }\n hostName\n pcursor\n __typename\n }\n}\n",
"variables": {"userId": "3x2vsxyxbbwcjta", "pcursor": pcursor, "page": "profile"}
}
1. 发送请求 get post
response = requests.post(url=url, headers=headers, json=data)
# <Response [200]>: 请求成功
2. 获取数据 .json() 返回字典类型数据
# .text: 拿到的就是 文本内容 python数据类型 字符串 > 字典类型 > 键值对(拼音)方式取值
json_data = response.json()
3. 解析数据
# 新华字典 = {'A': '啊', 'B': '不', 'C': '从'}
# 新华字典['B'] python数据容器 存储数据
# 正则
feeds = json_data['data']['visionProfilePhotoList']['feeds']
pcursor = json_data['data']['visionProfilePhotoList']['pcursor']
for feed in feeds:
photoUrl = feed['photo']['photoUrl']
caption = feed['photo']['caption']
# 正则替换
# 第一个参数里面是需要替换的一些字符
# 第二个参数 是把这些字符替换为 空
# 第三个参数 是需要替换的变量
# \\ : \
# \/ : /
caption = re.sub('[\\\/:*?"<>|\n]', '', caption)
print(caption, photoUrl)
4. 保存数据 如果你们拿到的链接 就是 视频 或者 音频 或者 图片
# .content: 获取视频(音频 / 图片) 二进制数据
video_data = requests.get(photoUrl).content
# 视频名称
# wb 以二进制覆盖写入
with open(f'video/{caption}.mp4', mode='wb') as f:
f.write(video_data)
# 递归: 2.出口
if pcursor == "no_more":
# 退出?
源码、解答、教程加🐧裙:832157862
return
# 递归: 1.自己调用自己
get_page(pcursor)
get_page("")
写到这里,我想了想,还有许多的功能,这里也给大家一一展示一下,嘿嘿 👻
这里是一整套,可以连起的,复制可以直接用哦~
import requests # 发送请求 第三方模块(额外安装)
class KuaiShou():
def __init__(self):
# 伪装
self.headers = {
'content-type': 'application/json',
'Cookie': 'kpf=PC_WEB; kpn=KUAISHOU_VISION; clientid=3; did=web_ea128125517a46bd491ae9ccb255e242; client_key=65890b29; didv=1646739254078; _bl_uid=pCldq3L00L61qCzj6fytnk2wmhz5; userId=270932146; kuaishou.server.web_st=ChZrdWFpc2hvdS5zZXJ2ZXIud2ViLnN0EqAB-YFLsHa67ZdbP8dvP_U-RlxTGFbCqVbT2BPSIpXwOBAp2Cb9tu2uupt0FFzbBZNkGr-Zcyfh3gHd3GY3npOdyJ07rRQ9Wb_JS37gxBNlscdp-G_d80pRRUCngxWB2SthNDD9gndwg6o1ROgDzN_2q44_kKgZlJ_7TaValhBueoTa0OXtWxYdazpkw3-E9Nt9Xz28QG6PPvjtuNFHgW8SEhoStVKEb-xUGkLo9u0A7O3lj4AGIiAzTzMkfNP_khE-e80VTVkESyn_UOfmrdMsiDiCDkXv8igFMAE; kuaishou.server.web_ph=3ff4b343fde6a4defe3736dafcc2c6d58d85',
'Host': '源码、解答、教程加🐧裙:832157862',
'Origin': '',
'Referer': '',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36',
}
self.url = ''
采集用户数据
def get_video(self, userId, pcursor):
"""
用户作品
:param userId: 用户id
:param pcursor: 页码
:return:
"""
json = {
'operationName': "visionProfilePhotoList",
'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 visionProfilePhotoList($pcursor: String, $userId: String, $page: String, $webPageArea: String) {\n visionProfilePhotoList(pcursor: $pcursor, userId: $userId, page: $page, webPageArea: $webPageArea) {\n result\n llsid\n webPageArea\n feeds {\n ...feedContent\n __typename\n }\n hostName\n pcursor\n __typename\n }\n}\n",d
'variables': {'userId': userId, 'pcursor': pcursor, 'page': "profile"}
}
# 1. 发送请求
# 方式
response = requests.post(url=self.url, headers=self.headers, json=json)
# <Response [200]>: 请求成功了
# 2. 获取数据
json_data = response.json()
return json_data
def get_userInfo(self, userId):
"""
用户详情
:param userId: 用户id
:return:
"""
json = {
'operationName': "visionProfile",
'query': "query visionProfile($userId: String) {\n visionProfile(userId: $userId) {\n result\n hostName\n userProfile {\n ownerCount {\n fan\n photo\n follow\n photo_public\n __typename\n }\n profile {\n gender\n user_name\n user_id\n headurl\n user_text\n user_profile_bg_url\n __typename\n }\n isFollowing\n __typename\n }\n __typename\n }\n}\n",
'variables': {'userId': userId} 源码、解答、教程加🐧裙:832157862
}
response = requests.post(url=self.url, headers=self.headers, json=json)
json_data = response.json()
return json_data
获取评论数据
def get_comments(self, photoId, pcursor):
"""
获取评论
:param photoId: 作品id
:param pcursor: 页码
:return:
"""
json = {
'operationName': "commentListQuery",
'query': "query commentListQuery($photoId: String, $pcursor: String) {\n visionCommentList(photoId: $photoId, pcursor: $pcursor) {\n commentCount\n pcursor\n rootComments {\n commentId\n authorId\n authorName\n content\n headurl\n timestamp\n likedCount\n realLikedCount\n liked\n status\n subCommentCount\n subCommentsPcursor\n subComments {\n commentId\n authorId\n authorName\n content\n headurl\n timestamp\n likedCount\n realLikedCount\n liked\n status\n replyToUserName\n replyTo\n __typename\n }\n __typename\n }\n __typename\n }\n}\n",
'variables': {'photoId': photoId, 'pcursor': pcursor}
}
response = requests.post(url=self.url, headers=self.headers, json=json)
json_data = response.json()
return json_data
搜索作品
def get_search(self, keyword, pcursor):
"""
搜索作品
:param keyword: 关键词
:param pcursor: 页码
:return:
"""
json = {
'operationName': "visionSearchPhoto",
'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",
'variables': {'keyword': keyword, 'pcursor': pcursor, 'page': "search"}
}
response = requests.post(url=self.url, headers=self.headers, json=json)
json_data = response.json()
return json_data
自动点赞 👍 评论 📧
def is_like(self, photoAuthorId, photoId):
"""
点赞 *** 作
:param photoAuthorId: 作者id
:param photoId: 作品id
:return:
"""
json = {
'operationName': "visionVideoLike",
'query': "mutation visionVideoLike($photoId: String, $photoAuthorId: String, $cancel: Int, $expTag: String) {\n visionVideoLike(photoId: $photoId, photoAuthorId: $photoAuthorId, cancel: $cancel, expTag: $expTag) {\n result\n __typename\n }\n}\n",
'variables': {
'cancel': 0,
'expTag': "1_i/2005134003994337825_xpcwebsearchxxnull0",
'photoAuthorId': photoAuthorId,
'photoId': photoId
}
}
response = requests.post(url=self.url, headers=self.headers, json=json)
json_data = response.json()
return json_data
def release_comment(self, content, photoAuthorId, photoId):
"""
评论
:param content: 内容
:param photoAuthorId: 作者id
:param photoId: 作品id
:return:
"""
json = {
'operationName': "visionAddComment",
'query': "mutation visionAddComment($photoId: String, $photoAuthorId: String, $content: String, $replyToCommentId: ID, $replyTo: ID, $expTag: String) {\n visionAddComment(photoId: $photoId, photoAuthorId: $photoAuthorId, content: $content, replyToCommentId: $replyToCommentId, replyTo: $replyTo, expTag: $expTag) {\n result\n commentId\n content\n timestamp\n status\n __typename\n }\n}\n",
'variables': {
'content': content,
'expTag': "1_i/2005084185006003137_xpcwebsearchxxnull0",
'photoAuthorId': photoAuthorId,
'photoId': photoId,
}
}
源码、解答、教程加🐧裙:832157862
response = requests.post(url=self.url, headers=self.headers, json=json)
json_data = response.json()
return json_data
if __name__ == '__main__':
kuaishou = KuaiShou()
# 点赞
# kuaishou.is_like('3xm7r8yrfmpgfhw', '3xzau9vfc5q8hna')
# 评论
kuaishou.release_comment("真想给自游买一双", '3xgucbtrbhtf4tu', '3xr9jysv6mi6732')
视频教程
python带你爬取快手视频、评论、用户数据,实现自动点赞评论等多功能~
尾语成功没有快车道,幸福没有高速路。
所有的成功,都来自不倦地努力和奔跑,所有的幸福都来自平凡的奋斗和坚持
——励志语录
本文章就写完啦~感兴趣的小伙伴可以复制代码去试试,看不懂也可以看一下教程哦
你们的支持是我最大的动力!!记得三连哦~ 💕 欢迎大家阅读往期的文章呀
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)