• 用Python实现在网站上自动评论!键盘侠都喷不赢你!


    自从上次在B站看到一个喷子,一个人喷一堆人,当时我就看不过去了,直接用Python写了个自动评论软件,他说一句我能说十句,当场教育喷子~

    于是乎,顺便整理一下,做了一手教程,分享给大家,当然不是教大家去做喷子,只是学学这么个技术~


    不知道你们用的什么环境,我一般都是用的Python3.6环境和pycharm解释器,没有软件,或者没有资料,没人解答问题,都可以加这个群点我免费领取资料 包括今天的代码,过几天我还会做个视频教程出来,有需要也可以领取~
    给大家准备的学习资料包括但不限于:
    Python 环境、pycharm编辑器/永久激活/翻译插件
    python 零基础视频教程
    Python 界面开发实战教程
    Python 爬虫实战教程
    Python 数据分析实战教程
    python 游戏开发实战教程
    Python 电子书100本
    Python 学习路线规划


    模块:

    requests >>> pip install requests
        re
        time (时间模块 会给一个延时)
        random (随机) >>> 随机评论内容
        内置模块  你只需要安装好python环境 自带的
    

    实现案例思路:

    一. 数据来源分析(爬虫)

    先手动去评论一下 (网站发送请求的情况是什么的)
    找请求url地址 评论发送请求地址
    通过开发者工具进行抓包分析
    post请求: 需要提交一个表单
    
    [评论多个视频,比如这个up主所有视频,都进行评论]
    
    1. 通过开发者工具进行抓包分析: 可以找到评论请求地址 [oid参数变化: 每一个视频都对应一个oid]
    2. 分析 oid 参数的来源 >>> 在视频详情页的网页源代码里面就有 oid 参数
    3. 每个视频详情页的url 都是有一个bv号 BV1764y1e7eu
    4. 找到所有视频的 bv 号 [找视频的ID] 在视频列表找到 视频的BV号
    

    二. 代码实现

    1. 发送请求 对于视频列表页发送请求
    2. 获取数据 获取json字典数据
    3. 解析数据 提取 视频Bv号
    4. 发送请求 对于视频详情页url地址发送请求
    5. 获取数据 网页源代码 视频里面 oid 参数
    6. 实现评论
    7. 进行多个/全部 视频评论
    


    来 直接上代码

    详细解释我都打在注释了,今天容我懒一波~

    import requests  # 数据请求模块  pip install requests
    import pprint  # 格式化输出的模块 内置模块
    import re  # 正则表达式 内置模块
    import random  # 随机模块 内置模块
    import time  # 时间模块 内置模块 Python学习群872937351
    
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
    }
    
    
    def get_response(html_url):
        """发送请求"""
        # headers请求头 作用?   把python代码伪装成浏览器
        # cookie: 主要是用检测是否有登录账号 用户信息
        # user-agent: 浏览器基本信息
        response = requests.get(url=html_url, headers=headers)
        return response
    
    
    def get_video_bv(html_url):
        """获取视频BV号"""
        response = get_response(html_url)
        # 获取json字典数据
        json_data = response.json()
        # 解析数据 json直接解析提取 根据冒号左边的内容 提取冒号右边的内容
        v_list = json_data['data']['list']['vlist']
        # 列表推导式
        v_list = [i['bvid'] for i in v_list]
        # lis = []
        # v_list 是一个列表 列表里面每一个元素都是一个字典
        # 想要获取列表中的每个元素 通过遍历 for循环 i就是字典
        # for i in v_list:
        #     lis.append(i['bvid'])
        # print(v_list)
        # pprint.pprint(response.json())
        return v_list
    
    
    def get_video_oid(video_bv_id):
        """获取视频的oid参数"""
        # f'{}' 字符串的格式化方法  '{page}'.format(page)
        # bv 号传入url地址当中
        video_url = f'https://www.bilibili.com/video/{video_bv_id}'
        response = get_response(video_url)
        # 函数返回值 d+ 匹配d 匹配一个数字 d+ 是匹配多个数字
        # 正则表达式  oid
        # <script>window.__INITIAL_STATE__={"aid":(762391044),
        # () 精确匹配 表示我要的内容就是括号里面的内容 每一个视频的oid都不一样
        # d 表示的匹配一个数字 d+ 表示匹配多个数字 .*? 表示匹配任意字符
        # .*?
        oid = re.findall('<script>window.__INITIAL_STATE__={"aid":(.*?)', response.text)[0]
        return oid
    
    
    def comment(oid):
        """评论"""
        comment_list = ['6666', 'up主牛皮', 'python牛皮', '牛皮']
        content = random.choice(comment_list)
        comment_url = 'https://api.bilibili.com/x/v2/reply/add'
        data = {
            'oid': oid,
            'type': '1',
            'message': content,
            'plat': 1,
            'ordering': 'heat',
            'jsonp': 'jsonp',
            'csrf': '0f085ffe952fc8658bfae7a34de1b1d6'
        }
        response = requests.post(url=comment_url, data=data, headers=headers)
        status_code = response.status_code  # 获取状态码
        return status_code
    
    
    def main(html_url):
        """主函数"""
        v_list = get_video_bv(html_url=html_url)
        for index in v_list:
            time.sleep(2)
            oid = get_video_oid(index)
            status_code = comment(oid)
            if status_code == 200:
                print(f'{index}评论成功')
            else:
                print(f'{index}评论失败')
    
    
    if __name__ == '__main__':
        for page in range(1, 15):
            print('稍等五秒钟')
            time.sleep(5)
            url = f'https://api.bilibili.com/x/space/arc/search?mid=16682415&ps=30&tid=0&pn={page}&keyword=&order=pubdate&jsonp=jsonp'
            main(url)

  • 相关阅读:
    我用柔软打败你
    【记录】ASP.NET URL 特殊字符
    再次记录 Visual Studio 2015 CTP 5 的一个坑
    【记录】ASP.NET MVC View 移动版浏览的奇怪问题
    升级 Visual Studio 2015 CTP 5 的坑、坑、坑
    OWIN 中 K Commands 与 OwinHost.exe 相等吗?
    OWIN 中 K Commands(OwinHost.exe)与 Microsoft.AspNet.Hosting 的角色问题
    深入理解 OWIN 中的 Host 和 Server
    【续集】在 IIS 中部署 ASP.NET 5 应用程序遭遇的问题
    delete
  • 原文地址:https://www.cnblogs.com/hahaa/p/15167971.html
Copyright © 2020-2023  润新知