大作业

发布时间 2023-12-14 22:42:10作者: xunfeng2310

综合设计——多源异构数据采集与融合应用综合实践

[码云地址](多源异构数据采集与融合应用综合实践: Call of Silence数据采集与融合综合实验 (gitee.com))

这个项目属于哪个课程 2023数据采集与融合技术
组名、项目简介 组名:Call of Silence
项目需求:设计出一个交互友好的多源异构数据的采集与融合的小应用
项目目标:通过在web端输入文本、图片、视频等多源数据进行内容提取并对其进行概括
技术路线:前端3件套(html、css、js)、flask、
团队成员学号 052103117、102102142、102102148、102102149、102102150、102102154、102102155、172109005
这个项目目标 对获取的多模态信息进行分析概括
其他参考文献 [1]梁永侦.基于深度学习的图像风格迁移方法研究[J].计算机时代,2023,(08):107-112.DOI:10.16644/j.cnki.cn33-1094/tp.2023.08.024
[2]熊文楷.基于深度学习的中国画风格迁移[J].科技与创新,2023,(13):176-178.DOI:10.15913/j.cnki.kjycx.2023.13.054
[3]郑卓.基于深度学习的风格迁移技术研究[D].浙江工商大学,2023.DOI:10.27462/d.cnki.ghzhc.2023.001362

项目整体介绍

1、项目名称:多模态内容概括

2、项目背景:在当今社会,随着数字化时代的来临,信息呈现爆炸式增长,而这些信息涵盖了多种形态,本项目主要功能就是对获取的多模态信息进行分析概括,帮助用户从信息中快速获取主要内容。

3、项目意义:面对互联网时代的信息过载,用户更需要一种智能化的工具来过滤、提炼信息,以便更快速地获取关键信息。多模态信息分析程序的功能满足了这一需求,帮助用户从海量信息中快速获取主要内容。

  • 数据采集

    • 采用selenium框架对bilibili中视频、封面、音频等数据进行爬取
  • 前端开发

    • 使用HTML、CSS和JavaScript进行界面设计,实现用户与系统的交互。
    • 用于上传文本、图片和视频等文件。
  • 后端开发

    • 利用flask框架进行后端搭建。
    • 用于接收前端发送的请求,对收到的数据进行保存和处理,最后返回文本结果。
  • 数据处理与分析

    • 文本分析:采用星火的接口对输入的文本内容进行分析概括。
    • 图片分析:
      • 采用星火的接口对输入的图片进行概括,将概括后的文本进行分析概括返回图片概括后的结果。
    • 视频分析:对于视频分析,没有找到合适的模型和接口进行概括,因此我们采用提取视频中的音频,对音频内容进行概括。
      • 采用百度的接口对输入的视频提取主要内容并返回给用户。
  • 风格迁移

    • 输入俩张图片,一张作为被学习的风格图片,一张作为学习的融合图片,通过VGG19神经网络进行训练,得到的模型,可以将任意俩张图片进行风格迁移

5、项目部分功能展示

①项目页面展示


②文本概括功能展示

③图片概括功能展示

④视频概括功能展示

我的分工

1.我的任务主要是协助组长完成爬取视频及其封面与标题

2.具体代码如下

这是爬取标题与封面的python文件

import time
import urllib.request
import re
from selenium import webdriver
from scrapy.selector import Selector
browser = webdriver.Chrome()
url = 'https://www.bilibili.com/'
browser.get(url)
time.sleep(5)
js_height = 'return document.body.scrollHeight'
height = browser.execute_script(js_height)
for i in range(200):
    browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
    time.sleep(5)
    new_height = browser.execute_script(js_height)
    height = new_height
content = browser.page_source
browser.quit()
selector = Selector(text=content)
rows = selector.xpath("//div[@class='bili-video-card is-rcmd']")
with open(r'C:\Users\陈宏森\Desktop\picture_name.txt', 'w', encoding='utf-8') as f:
    for row in rows:
        name=row.xpath(".//h3/@title").extract_first()
        # 使用正则表达式将文件名中的特殊字符替换为下划线
        name = re.sub('[\/:*?"<>|]', '_', name)
        img=row.xpath(".//img/@src").extract_first()
        url_img = 'https:'+img
        urllib.request.urlretrieve(url_img,r'C:\Users\陈宏森\Desktop\picture\\'+name+'.jpg')
        print(name)
        f.write(name + '\n')

这段Python代码的功能是使用Selenium和Scrapy库从Bilibili网站上抓取视频标题和缩略图,并将标题保存到文本文件中,同时将缩略图下载到本地目录。让我来逐步解释代码的不同部分:

  1. 导入模块:
    • import time:导入时间模块,提供各种与时间相关的函数。
    • import urllib.request:导入 urllib 模块,用于处理URL。
    • import re:导入 re 模块,提供对正则表达式的支持。
    • from selenium import webdriver:从 Selenium 库中导入 webdriver 模块。
    • from scrapy.selector import Selector:从 scrapy.selector 模块中导入 Selector 类。
  2. 使用Selenium抓取网页:
    • 创建一个Chrome浏览器实例,访问Bilibili网站,然后滚动页面以加载更多内容,并获取页面源代码。
  3. 使用Scrapy进行数据提取:
    • 使用Scrapy的Selector类来解析和提取页面源代码中的视频标题和缩略图URL。
  4. 文件写入和图像下载:
    • 将提取的视频标题写入文本文件,并将缩略图下载到本地目录。在下载缩略图时,使用了urllib.request.urlretrieve函数来下载图像文件,并且将文件名中的特殊字符替换为下划线,以确保有效的文件名。
  5. 关闭浏览器:
    • 最后,关闭Chrome浏览器实例。

总的来说,这段代码使用了Selenium进行网页交互和Scrapy进行数据提取,实现了从Bilibili网站抓取视频标题和缩略图的功能。

这是爬取视频的python文件

import time
import urllib.request
import re
from selenium import webdriver
from scrapy.selector import Selector

import requests
import os
from lxml import etree
import re


def videoDownload1(url_):
    try:
        headers_ = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
            'Cookie': "buvid3=7014DDC0-BF1E-B121-F5A5-F10753C840B423630infoc; i-wanna-go-back=-1; _uuid=49BF2138-1E10F-D5F5-10898-D8311651B53927883infoc; FEED_LIVE_VERSION=V8; DedeUserID=171300042; DedeUserID__ckMd5=c65bec3211413192; CURRENT_FNVAL=4048; rpdid=|(J|)J~m~llk0J'uYm|)~klRl; header_theme_version=CLOSE; hit-new-style-dyn=1; hit-dyn-v2=1; is-2022-channel=1; fingerprint=fe5c7462625770aa2abce449a7c01fd2; buvid_fp_plain=undefined; b_nut=1691207170; b_ut=5; buvid_fp=fe5c7462625770aa2abce449a7c01fd2; LIVE_BUVID=AUTO4016915564967297; buvid4=1AE73807-AEA0-7078-DA57-7F9FE5C3D6F896987-023080912-A0g5nInZwV3VmJJT68FJxw%3D%3D; home_feed_column=5; SESSDATA=fc1266d3%2C1708653865%2C29c08%2A81-i-T9HQrucvpCVcPwSwXl5LmjTyduIzF9veu0KS9i2IwXK_xkcqlt1XQyxJ3sG-9HMSwLwAAKgA; bili_jct=068bc0a79f3fa7aa1a030e478dbf6d4b; sid=5yvjlnfi; browser_resolution=1920-971; bili_ticket=eyJhbGciOiJFUzM4NCIsImtpZCI6ImVjMDIiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjE2OTMzNjY1MTcsImlhdCI6MTY5MzEwNzMxNywicGx0IjotMX0.I1Yfp8S9UIkU4S0G5vtBJfslPtgY7QLCj1dx9WQpyRmxKpZoA1qB5UYXNW4KBSZFGljMm7F1lbGXSGco7F79JZJ2sZNBvH9QiSVlmipzAJKaucIoFh6s3m1jpqjLp10r; bili_ticket_expires=1693366517; bp_video_offset_171300042=834376858445283367; b_lsid=1021245DB_18A3567E5C2; CURRENT_QUALITY=80; PVID=2"
        }

        response_ = requests.get(url_, headers=headers_)

        str_data = response_.text

        html_obj = etree.HTML(str_data)  # 转换格式类型

        res_ = html_obj.xpath('//title/text()')[0]

        title_ = re.findall(r'(.*?)_哔哩哔哩', res_)[0]
        title_ = title_.replace('/', '')
        title_ = title_.replace(' ', '')
        title_ = title_.replace('&', '')
        title_ = title_.replace(':', '')

        url_list_str = html_obj.xpath('//script[contains(text(),"window.__playinfo__")]/text()')[0]

        # 纯视频的url
        video_url = re.findall(r'"video":\[{"id":\d+,"baseUrl":"(.*?)"', url_list_str)[0]

        # 纯音频的url
        audio_url = re.findall(r'"audio":\[{"id":\d+,"baseUrl":"(.*?)"', url_list_str)[0]

        # 设置跳转字段的headers
        headers_ = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36',
            'Referer': url_
        }

        # 获取纯视频的数据
        response_video = requests.get(video_url, headers=headers_, stream=True)
        bytes_video = response_video.content
        # 获取纯音频的数据
        response_audio = requests.get(audio_url, headers=headers_, stream=True)
        bytes_audio = response_audio.content

        # 获取文件大小, 单位为KB
        video_size = int(int(response_video.headers['content-length']) / 1024)
        audio_size = int(int(response_audio.headers['content-length']) / 1024)

        # 保存纯视频的文件
        title_1 = title_ + '!'  # 名称进行修改,避免重名
        title_1 = title_1.replace(':', '_')
        with open(f'D:/python/exercise/数据采集大作业/video/{title_1}.mp4', 'wb') as f:
            f.write(bytes_video)

        with open(f'D:/python/exercise/数据采集大作业/audio/{title_1}.mp3', 'wb') as f:
            f.write(bytes_audio)

        ffmpeg_path = r".\ffmpeg.exe"


        command = f'{ffmpeg_path} -i audio/{title_1}.mp3 -i video/{title_1}.mp4 -c copy ./video/{title_}/{title_}.mp4 -loglevel quiet'

        os.system(command)

        # 显示合成文件的大小

        print(f'{title_}  下载完成')
    except Exception as e:
        print(f"下载失败: {e}")
        return  # 跳过当前视频的下载


browser = webdriver.Chrome()
url = 'https://www.bilibili.com/'
browser.get(url)
time.sleep(5)

js_height = 'return document.body.scrollHeight'
height = browser.execute_script(js_height)

for i in range(15):
    browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
    time.sleep(5)

    new_height = browser.execute_script(js_height)
    height = new_height

content = browser.page_source
browser.quit()

selector = Selector(text=content)
rows = selector.xpath("//div[@class='bili-video-card is-rcmd']")

for row in rows:
    href = row.xpath('.//a/@href').extract_first()
    if href and href.startswith("https"):
        videoDownload1(href)

这段Python代码的作用是使用Selenium和requests库从Bilibili网站上抓取视频的音频和视频流,并将它们合成为一个完整的视频文件。让我来逐步解释代码的不同部分:

  1. 导入模块:

    • 代码一开始导入了一系列需要使用的模块,包括了时间处理、URL请求、正则表达式、Selenium、requests、os等。
  2. 视频下载函数:

    • videoDownload1 函数用于从指定URL下载视频。它发送了一个带有特定User-Agent和Cookie的请求,然后从响应中提取了视频和音频的URL,下载并保存了视频和音频文件。接着,它使用FFmpeg将视频和音频合成为一个完整的视频文件,并保存在特定的目录中。
  3. 使用Selenium抓取网页:

    • 创建一个Chrome浏览器实例,访问Bilibili网站,然后滚动页面以加载更多内容,并获取页面源代码。
  4. 使用Scrapy进行数据提取:

    • 使用Scrapy的Selector类来解析和提取页面源代码中的视频链接。
  5. 视频下载:

    • 对于提取的每个视频链接,调用 videoDownload1 函数来下载视频。

总的来说,这段代码的功能是从Bilibili网站上抓取视频的音频和视频流,并将它们合成为一个完整的视频文件。