zoukankan      html  css  js  c++  java
  • 爬取B站‘杀疯了,这就是国家队的美貌吗’评论 Python

    能打能扛有颜值,爬一波对奥运健儿的评论。

    """
        爬一下B站“杀疯了,这就是国家队的美貌吗?”,视频地址:
        https://www.xx.com/video/BV1uU4y1H7wL?from=search&seid=14179860062243648577&spm_id_from=333.337.0.0
    """
    import pprint
    import random
    import requests
    import csv
    import time
    import json
    
    # 创建csv文档
    f = open('杀疯了.csv', mode='a', encoding='utf-8-sig', newline='')
    csvWriter = csv.DictWriter(f, fieldnames=[
        '评论者姓名',
        '评论者性别',
        '评论时间',
        '获赞数',
        '评论内容',
    ])
    # 写入头
    csvWriter.writeheader()
    # 开始时间戳
    startTimeStamp = int(time.time() * 1000) # 毫秒级
    # 请求头
    headers = {
        "cookie": "_uuid=BE35640F-EB4E-F87D-53F2-7A8FD5D50E3330964infoc; buvid3=D0213B95-F001-4A46-BE4F-E921AE18EB67167647infoc; CURRENT_BLACKGAP=1; CURRENT_QUALITY=0; rpdid=|(u))ku~m)kJ0J'uYJuRRRYmk; CURRENT_FNVAL=976; video_page_version=v_old_home_17; blackside_state=1; LIVE_BUVID=AUTO1516364619569495; PVID=1; bsource=search_baidu; innersign=1; sid=78290ki3",
        "referer": "https://www.xx.com/video/BV1uU4y1H7wL?from=search&seid=14179860062243648577&spm_id_from=333.337.0.0",
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36",
    }
    
    data = {
        "callback": f"jQuery172028036378029383635_{startTimeStamp}", # 这里的时间戳要换成我们请求的时候当时的时间戳
        "jsonp": "jsonp",
        "next": "0", # 翻页
        "type": "1",
        "oid": "674425220", #
        "mode": "3",
        "plat": "1",
        "_": f"{startTimeStamp}",
    }
    # 多页爬取
    for page in range(1, 100 + 1): # 爬100页
        print(f'======开始爬取第{page}页的数据======')
        time.sleep(random.randint(2, 5)) # 休眠
        nextTimeStamp = int(time.time() * 1000)
        url = f'https://api.xx.com/x/v2/reply/main?callback=jQuery172028036378029383635_{startTimeStamp}&jsonp=jsonp&next={page}&type=1&oid=674425220&mode=3&plat=1&_={nextTimeStamp}'
        # 开始请求网页
        response = requests.get(url=url, headers=headers)
        # print(response.text) # 返回的格式像json但是不是json,得处理
        json_data = json.loads(response.text[42:-1]) # 取字符串的第42位到最后一位
        # pprint.pprint(json_data) # 现在得到的就是json数据
    
        # 提取需要的部分
        data = json_data['data']['replies'] # 这是个列表,现在从列表里去提取评论者姓名,性别,评论时间,点赞数,评论内容
        print(f"====第{page}页总共有{len(data)}条数据====")
        time.sleep(2) # 休眠两秒以便查看
        # pprint.pprint(data)
        for item in data:
            name = item['member']['uname'] # 评论者姓名
            sex = item['member']['sex'] # 评论者性别
            ctime = item.get('ctime') # 评论时间
            content_time = time.strftime("%Y-%m-%d %H:%M", time.localtime(ctime)) # 还原时间戳成本地时间
            like = item['like'] # 点赞数
            content = item['content']['message']
            print(name, sex, content_time, like, content, sep=" | ")
            # 写入到csv文档
            dit = {
                '评论者姓名':name,
                '评论者性别':sex,
                '评论时间':content_time,
                '获赞数':like,
                '评论内容':content,
            }
            csvWriter.writerow(dit) # 按行写入到csv文档
        print(f'======取第{page}页的数据爬取完成======')
        time.sleep(2) # 休眠两秒以便查看

    程序运行结果:

     数据保存结果:

     

    本文仅用于学习交流,不具有任何商业用途。如有问题,请与我联系,我会即时处理。

    据说网址里的callback参数会影响数据的完整性,具体没测试过,下次测试下。

    逐梦很累,坚持加油。

  • 相关阅读:
    从源码剖析Lua数据类型
    【Mysql】主从同步配置
    【Logstash】Logstash收集Nginx访问日志(二十六)
    【Logstash】Logstash快速入门(二十五)
    【Kibana】集群监控(二十四)
    【Beats】Metricbeat 收集Nginx指标数据(二十三)
    【Beats】Metricbeat快速入门(二十二)
    【Beats】Filebeat 与 Kibana仪表板(二十一)
    【Kibana】坐标地图(二十)
    【Beats】Filebeat收集Nginx日志(十九)
  • 原文地址:https://www.cnblogs.com/mafu/p/15556603.html
Copyright © 2011-2022 走看看