python爬视频b站评论

输入视频的bv号
输入你要取的页数
文件自动保存到本地

import urllib.request
import urllib.parse
import json
import jsonpath


def fun(url):
    # 定制头部
    headter = {
        'accept-language': ' zh-CN,zh;q=0.9',
        'referer': 'https://www.bilibili.com/bangumi/play/ss39532',
        'sec-ch-ua': ' "Chromium";v="94", "Google Chrome";v="94", ";Not A Brand";v="99"',
        'sec-ch-ua-mobile': ' ?0',
        'sec-ch-ua-platform': ' "Windows"',
        'sec-fetch-dest': ' script',
        'sec-fetch-mode': ' no-cors',
        'sec-fetch-site': ' same-site',
        'user-agent': ' Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36',
    }
    resouter = urllib.request.Request(url=url, headers=headter)
    return resouter


# 获取请求源码
def resout(resouter):
    resouters = urllib.request.urlopen(resouter)
    connet = resouters.read().decode('utf-8')
    return connet


# 把bv文件转换id
def BlblBv(connet):
    # 解码成json文件格式
    jsonent = json.loads(connet)
    # 获取返回的值
    Bv_list = jsonpath.jsonpath(jsonent, '$..aid')

    return Bv_list[0]


# 处理评论区页数
def json_blbl_Value(oid_url, start_pag):
    # 拼接到评论区的api中
    url = 'https://api.bilibili.com/x/v2/reply/main?next=' + str(start_pag) + '&type=1&oid=' + str(
        oid_url) + '&mode=3&plat=1'
    # 请求服务器
    resouters = fun(url)
    # 接收返回数据
    connet = resout(resouters)
    # 获取评论区数据
    json_blbl(connet)


# 把评论区文件解析出来
def json_blbl(connet):
    # 解析评论区的json文件
    jsonent = json.loads(connet)
    json_list = jsonpath.jsonpath(jsonent, '$..message')
    json_name = jsonpath.jsonpath(jsonent, '$..uname')
    # 遍历值输出

    for i in range(len(json_list)):
        # 因为获取的值第一个有一个0
        if str(json_list[i]) != '0':
            strvalue = json_name[i - 1] + ' 说: ' + json_list[i] + '\n'
            fp.write(strvalue)


# 视频名字解析
def vide_name(bvid):
    url = 'https://api.bilibili.com/x/player/pagelist?bvid=' + bvid
    # 请求服务器
    resouters = fun(url)
    # 接收返回数据
    connet = resout(resouters)
    # 转json数据
    name_Value = json.loads(connet)
    name_Value1 = jsonpath.jsonpath(name_Value, '$..part')
    print(str('爬取的视频是' + name_Value1[0]))
    return name_Value1[0]


# 程序入口
if __name__ == '__main__':

    bvid = input("请输入你要爬取的视频bv号: ")
    start_pag = int(input("请输入你要爬取的页数: "))
    end_pag = int(input("请输入你要结束的页码: "))
    # 视频的名字
    vide_value = vide_name(bvid) + '.txt'
    fp = open(vide_value, 'w', encoding='utf-8')

    # 抓取的地址
    url = str('http://api.bilibili.com/x/web-interface/archive/stat?bvid=' + bvid)
    # 请求服务器
    resouters = fun(url)
    # 接收返回数据
    connet = resout(resouters)
    # 解析出bv号转的oid
    oid_url = BlblBv(connet)
    for number in range(start_pag, end_pag + 1):
        print('正在爬取第' + str(number) + '页请稍等')
        json_blbl_Value(oid_url, number)

fp.close()
print('爬取完毕,请查看目录下文件')

上一篇:Python | JSON 数据解析(Json & JsonPath)


下一篇:Python爬虫全网搜索并下载音乐