python爬虫,智能爬取网站弹幕和评论,生成词云图,两种方法。

智能爬取网站弹幕和评论,生成词云图,两种方法,超简单,可打包,生成exe使用,可供教学使用。

声明:本人是山东某校大一学生,非计算机专业,文学专业出身。

由于系里老师需要,故,写好脚本,并用pyinstaller打好包,提供系里做研究用。本文不讨论pyinstaller打包问题,太麻烦了,尤其是引用第三方库的时候,打包一直报错,所幸现在已经解决。

效果如图:

前言:两种一键爬取方法

本文共两种方法,由于全是自动化傻瓜式操作,所以代码量较多还请谅解。

大致思路:

小破站把弹幕都存放到了xml文件里。

如果读者急需源码直看第二种方法,若碰见pyinstaller打包问题,可私信我。

例如: comment.某站.com/cid.xml

XXXXXX为小破站视频的cid,即每个视频独属的id,那么获取弹幕就简单了,我们只要Fn+F12打开开发者工具,找Network ,Document,XHR,hearbeat,里面可能会有cid,那么如果你能幸运找到cid爬取弹幕就轻而易举了。当然这是一种麻烦的方法,每个视频链接对应的页面源码都存有这部作品每个视频的cid,注意我说的是每个。当然直接爬取页面源码正则匹配现在看来是种简单的办法,而实现这种方法的代码就是我所说的第一种方法,但是有个问题显而易见,一个html文件里包含多个视频的cid,如1,2,3....N集,那么匹配算法我们需要怎么设计?“第input()集”看起来是可行的,但是别忘了预告片,预告片cid同样存在,这样去查找第三集,会得到两个cid。我们目前只需要正片,嗯这不是什么大问题,那么大问题来了:如下图,视频命名规范,以及会员问题,如果我们继续采取正则匹配查找cid,那么遇见命名规范问题,我们需要重新修改我们的匹配算法,这对于程序猿来说不值一提,但是对小白可是个头疼问题。目前已知在html里,有些许会员视频不显示cid,这可是大麻烦,那么匹配算法直接pass掉

如图:视频集数命名问题。

一、传统正则匹配算法:使用步骤

1.引入库

代码如下(示例):

import re
import requests
from bs4 import BeautifulSoup
import pandas as pd
import time
import json
from stylecloud import gen_stylecloud
import jieba
import re
import matplotlib.pyplot as plt
import os

2.示例和源码

输入url,爬取整个HTML文件,小破站把所有视频的bvid,cid和aid都存放在了html文件里。

爬下来后用匹配算法,查找哪一集的cid,后用cid爬取小破站弹幕。查找aid,用于爬评论。

以最近的番剧《恋爱世界对路人角色很不友好》为例。

 本人使用的为edge浏览器,Ctrl+U查看页面源码。Ctrl+F查找。

Product为控制台文件:

代码如下:

# Product.py
import time
import sec_bar as ec
import third_gwcloud as gw
import first_extract as ex
import request_comments as rc
print("请输入视频url")
a = input(":")
print("请输入保存视频html的文件名")
b = input(":")
url = a
path = b
headers={
    "User-Agent":"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0"
}
ex.use_requests(url,headers,path)
print("请输入要爬取的视频集数")
c = input(":")
number = c
print("请在此输入文件名,以保存该视频cid,aid和弹幕。")
d = input(":")
file_name = ''+d+'_demo'
file_path = d
ex.request_number(number,ex.use_requests(url,headers,path),file_name)
print("爬取弹幕输入1,爬取评论输入2")
n = int(input(":"))

if n == 1:
    cid = ex.request_cid(file_name, file_name)
    print(cid)

    ec.request_barrage(file_path, cid)
    print("您是否要生成弹幕词云图,1生成,2不生成。")
    f = input(":")
    g = int(f)
    if g == 1:
        gw.generate_wordlcloud(file_path, d)
    elif g == 2:
        print("好的")

elif n == 2:
    aid = ex.request_aid(file_name, file_name)
    print(aid)

    e = 0
    page = 1
    while e == 0:
        url = "https://api.bilibili.com/x/v2/reply?pn=" + str(page) + '&type=1&oid=' + aid + '&sort=2'
        try:
            print()

            # print(url)
            content = rc.get_content(url)
            print("page:", page)
            rc.Out2File(content,file_path)
            page = pa
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CBIhalsen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值