一篇文章带你多方面采集完一个应用评论、视频并自动点赞、评论~

一篇文章带你多方面采集完一个应用评论、视频并自动点赞、评论~,第1张

前言

自己喜欢的东西,我们通常会想要它留存得久一点,但是往往别人上传得视频并不一定永久留存~

有的不是被下架了,就是作者已删除该视频,不可观看!!

那怎么办呢?一般做法当然是把它下载下来啦~但是,一个自己下还好,多个就不行了

这个时候就会想借助外力来完成这件事,于是我的代码也产生了

首先,我们得来点准备工作 ⛏

当你准备还是写代码前,你的工具没有怎么能行呢~

就像:你信心满满得要去约会,一切已准备稳妥,却发现你最重要的环节——女朋友你还没有!!💘

我想你明白了吧(ps:这里所说言语不管作者的事,请不要上升真人~)狗头.jpj

开发环境
  • python 3.8 运行代码
  • pycharm 2021.2 辅助敲代码
  • requests 第三方模块

如果,你是零基础小白,不会安装软件的话,可以查看左侧主页

你会发现有一个🐎,扫它,你将获得知识的力量(其实就是视频教程啦~找管理员小姐姐领取哦)

模块安装呢,安装有两种方法,我这边都替你写出来啦~(如果报错也可左侧扫🐎,可获得解答哦)

  1. win + R 输入cmd 输入安装命令 pip install 模块名 如果出现爆红 可能是因为 网络连接超时 切换国内镜像源

  2. 在pycharm中点击Terminal(终端) 输入安装命令

你用哪个习惯一点(或比较顺眼)就可以用哪个,都一样哒~

这里说明一下,如果你有基础的话可点击下方目录直接跳转哦~没有基础的小可耐要仔细的看思路分析哦

目录
  • 前言
  • 首先,我们得来点准备工作 ⛏
      • 开发环境
      • 思路分析
        • 第一步,我们来找到一个-美女小姐姐💞
        • 第二步,打开开发者工具刷新网页
        • 第三步,随便点击打开一个视频
        • 第四步,点击搜到的内容
        • 第五步,依次展开查看, 去找到我们需要的视频地址
        • 第六步,确定url地址, 请求方式, 请求参数, 请求头参数
      • 代码实现:
  • 正头戏:代码
      • 导入模块
      • 伪装
      • 1. 发送请求 get post
      • 2. 获取数据 .json() 返回字典类型数据
      • 3. 解析数据
      • 4. 保存数据 如果你们拿到的链接 就是 视频 或者 音频 或者 图片
    • 采集用户数据
    • 获取评论数据
    • 搜索作品
    • 自动点赞 👍 评论 📧
  • 视频教程
  • 尾语

思路分析

这这里,我们要确定我们想要什么,比如:视频、标题、用户信息、评论等等。。。。那现在,我们先来看看视频

第一步,我们来找到一个-美女小姐姐💞

(不要以为只要你们男孩子喜欢小姐姐,女孩子也喜欢~),点击她的主页

第二步,打开开发者工具刷新网页
  • 右键点击检查 或者 F12 打开
  • 选择network 然后刷新网页

不要忘记刷新哦~不然可能会没数据de

第三步,随便点击打开一个视频


图片怕你们没看清,这边打字写出来

  1. 在标题里面随便复制几个字
  2. 点击开发者工具上的搜索工具
  3. 粘贴你刚刚复制的内容
第四步,点击搜到的内容

  1. 点击打开找到的数据包
  2. 点击Preview预览
第五步,依次展开查看, 去找到我们需要的视频地址

第六步,确定url地址, 请求方式, 请求参数, 请求头参数

  • 请求头参数
  • 请求参数

代码实现:
  1. 发送请求
  2. 获取数据
  3. 解析数据
  4. 保存数据

不要小看它只有小小四个步骤,大多数代码实现可都是按照这小小四步来的 📌

正头戏:代码 导入模块

代码里大部分都有注释啦~如果你看完还是不太明白的话,同样可以左侧扫🐎领取视频教程哦

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带你爬取快手视频、评论、用户数据,实现自动点赞评论等多功能~

尾语

成功没有快车道,幸福没有高速路。

所有的成功,都来自不倦地努力和奔跑,所有的幸福都来自平凡的奋斗和坚持

——励志语录

本文章就写完啦~感兴趣的小伙伴可以复制代码去试试,看不懂也可以看一下教程哦

你们的支持是我最大的动力!!记得三连哦~ 💕 欢迎大家阅读往期的文章呀

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/917036.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存