爬虫综合大作业

本次作业要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/3159

爬虫综合大作业

  1. 选择一个热点或者你感兴趣的主题。
  2. 选择爬取的对象与范围。
  3. 了解爬取对象的限制与约束。
  4. 爬取相应内容。
  5. 做数据分析与文本分析。
  6. 形成一篇文章,有说明、技术要点、有数据、有数据分析图形化展示与说明、文本分析图形化展示与说明。
  7. 文章公开发布。

于2009年6月26日创建,被粉丝们亲切的称为“B站”的哔哩哔哩(bilibili),现在可以说是无人不晓。但你们是否知道哔哩哔哩这名称的来历。曾经的一部动画《某科学的超电磁炮》(疯狂安利),女主

名为御坂美琴,粉丝们中的姐姐大人,发动超能力放超电磁炮的时候,电流所发出的声音被调侃为“bilibili”,为了致敬这部动画,所以就有了现在的哔哩哔哩(B站的会员等级lv0 -> lv6也是对应动画中的等级)。所以便选了与这部动画有关的视频,爬取这个视频部分弹幕(全日站排行第1的视频,有着110万的弹幕总数)

通过检查元素-->netword,去寻找有关弹幕的链接,会发现到一个与众不同的东西,名为list.so?oid=XXX的目标。查看preview的内容,会发现这就是我们要找的弹幕资源。

 

B站视频弹幕文件都有相对应的cid

# 获取视频弹幕的cid
def get_cid(url):
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        cid = json.loads(response.content.decode())["data"]["cid"]
    return cid

将弹幕内容保存到MySQL数据库中

# 将弹幕内容保存到MySQL数据库中
def save_to_sql(cid,barrage):
    conInfo = "mysql+pymysql://root:123456@localhost:3306/bilibili?charset=utf8"
    engine = create_engine(conInfo,encoding='utf-8')
    df = pd.DataFrame(barrage)
    df.to_sql(name=str(cid),con=engine,if_exists='append',index=False)

最后生成词云

# 生成词云
def make_wordCould(barrage):
    barrage = ''.join(barrage)
    ciyun = WordCloud(background_color='white',width=1000,height=600).generate(barrage)
    plt.imshow(ciyun)
    plt.axis('off')
    plt.show()

全部代码如下:

import requests
import json
import os
from lxml import etree
import pandas as pd
from sqlalchemy import create_engine
from wordcloud import WordCloud
import matplotlib.pyplot as plt

headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36",
    }
# 获取视频番号
def get_url():
    av = input("请输入想要爬取弹幕的B站视频av号(例如810872):")
    url = "https://api.bilibili.com/x/web-interface/view?aid={}".format(av)
    # url = "https://api.bilibili.com/x/player/pagelist?aid={}&jsonp=jsonp".format(av)
    return url

# 获取视频弹幕的cid
def get_cid(url):
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        cid = json.loads(response.content.decode())["data"]["cid"]
    return cid

def get_title(url):
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        title = json.loads(response.content.decode())["data"]["title"]
    return title
# 解析弹幕的xml,并把爬取的弹幕保存为本地txt文件
def get_barrage(cid):
    cid_url = "https://api.bilibili.com/x/v1/dm/list.so?oid={}".format(cid)
    # cid_url = "https://comment.bilibili.com/{}.xml".format(cid)
    result = requests.get(cid_url, headers=headers)
    comment_element = etree.HTML(result.content)
    barrage_list = comment_element.xpath("//d")
    txt = str(cid)+".txt"
    if os.path.exists(txt):
         os.remove(txt)
    with open(txt, 'w', encoding='utf-8') as file:
        for d in barrage_list:
             file.write(d.xpath('./text()')[0])
             file.write("\n")
# 打开弹幕文件内容
def get_text(cid):
    txt = str(cid) + ".txt"
    with open(txt, 'r', encoding='utf-8') as file:
        fp = file.read()
    barrage = fp.split('\n')
    return barrage
# 将弹幕内容保存到MySQL数据库中
def save_to_sql(cid,barrage):
    conInfo = "mysql+pymysql://root:123456@localhost:3306/bilibili?charset=utf8"
    engine = create_engine(conInfo,encoding='utf-8')
    df = pd.DataFrame(barrage)
    df.to_sql(name=str(cid),con=engine,if_exists='append',index=False)
# 统计弹幕出现次数,并保存为本地csv文件
def barrage_count(barrage,cid):
    barrage_dict = {}
    barrage_set = set(barrage)
    for br in barrage_set:
        barrage_dict[br] = barrage.count(br)
    barrage_sort = sorted(barrage_dict.items(),key=lambda x:x[1],reverse=True)
    for i in range(20):
        print(barrage_sort[i])
    file_name = str(cid)+'.csv'
    pd.DataFrame(data=barrage_sort).to_csv(file_name,encoding='utf-8')
# 生成词云
def make_wordCould(barrage):
    barrage = ''.join(barrage)
    ciyun = WordCloud(background_color='white',width=1000,height=600).generate(barrage)
    plt.imshow(ciyun)
    plt.axis('off')
    plt.show()


if __name__ == '__main__':
    url = get_url()
    cid = get_cid(url)
    get_barrage(cid)
    barrage = get_text(cid)
    save_to_sql(cid,barrage)
    barrage_count(barrage,cid)
    make_wordCould(barrage)
View Code

 

转载于:https://www.cnblogs.com/LinsenLiang/p/10841349.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于Python的爬虫大作业是指使用Python编写的程序,通过网络爬取数据,并进行相应的数据分析和可视化展示。在这个大作业中,学生们可以选择不同的主题和目标,如天气数据、斗鱼主页信息等。 具体来说,这个大作业可以包括以下几个方面的内容: 1. 使用Python编写爬虫程序,通过网页抓取相关数据。比如,可以利用Python的requests库获取网页内容,利用BeautifulSoup库解析网页结构,从而得到所需的数据。 2. 进行数据的存储和处理。可以使用SQLite数据库进行数据存储,使用Pandas库进行数据分析和处理,例如数据清洗、筛选、统计等操作。 3. 可以利用可视化工具(如Matplotlib、Seaborn等)对数据进行可视化展示,以便更好地理解和数据。 4. 可以设计图形界面,使用wxPython库来实现用户交互和展示结果。 总的来说,基于Python的爬虫大作业是一个综合性的项目,涵盖了数据爬取、数据处理、数据分析和可视化展示等多个方面的技术。通过完成这个大作业,学生们可以提高对Python编程和网络爬虫的理解和应用能力,同时也可以锻炼数据处理和可视化析的能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [基于python的网络爬虫爬取天气数据及可视化析python大作业,课程设计报告](https://download.csdn.net/download/m0_65465012/85629892)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [python爬虫大作业](https://blog.csdn.net/m0_57832412/article/details/122221411)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Python爬虫解析笔记.md](https://download.csdn.net/download/weixin_52057528/88258586)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值