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

这个项目属于哪个课程 2024数据采集与融合技术实践
组名、项目简介 组名:scrapy能帮我爬到美味蟹黄堡的秘方吗
项目需求:文物不能很好的融入我们的生活,它们仿佛一具冰冷的尸体躺在博物馆的展示柜中,静静地接受着岁月的侵蚀和尘埃的覆盖。
项目目标:赋予文物新的生命力,让它们“动”起来。通过人工智能技术,为文物创造更加精彩动人的故事,生成曼妙的声音,制作生动震撼的展示视频,让历史以全新的方式触动人心。
技术路线:vue3前端web网站搭建,python flask后端,华为云平台(服务器接口调用),阿里云平台(部分数据存储),kimi背景故事AI生成接口,快手可灵ai平台对口型视频生成和通过接口实现视频生成
团队成员学号 曹星才-072208130
张诗悦-052205144
朱佳杰-012202239
黄悦佳-102202142
詹镇壕-102202149
这个项目目标 将静止的文物与现代科技相结合,赋予它们新的生命和表现力。我们通过先进的人工智能技术,让文物“动”起来,呈现出它们沉睡千年的故事与情感。AI将为每件文物创作更加丰富和感人的背景故事,让它们不再只是历史的见证者,而是活生生的叙述者。同时,通过AI生成曼妙的声音,让这些故事更加生动,引人入胜;借助视觉技术,生成精美的展示视频,生动再现文物的诞生过程、文化背景与历史场景。最终,我们希望通过这一系列创新方式,让更多人触及文物的灵魂,感受历史与文化的魅力。
其他参考文献
码云链接(代码已汇总,各小组成员代码不分开放) 前端:综合设计实践——前端 ·2022级数据采集与融合技术 - 码云 - 开源中国
后端:综合设计实践——后端 ·2022级数据采集与融合技术 - 码云 - 开源中国
爬虫: https://gitee.com/jia1666372886/museumspider/
tree/master/

一、项目背景

文物不能很好的融入我们的生活,它们仿佛一具冰冷的尸体躺在博物馆的展示柜中,静静地接受着岁月的侵蚀和尘埃的覆盖。那些曾经承载着历史脉络与文化荣光的物品,如今只剩下了沉默的外壳,无法向我们诉说它们曾经的故事。它们被时间的长河淹没,渐渐失去了与我们生活的联系,变成了一个个静止的符号,等待着被无数的目光定格,却难以真正融入现代人的日常。

这些文物或许曾在千百年前激荡起社会的波澜,或许曾是某个伟大文明的象征,但如今它们的存在仿佛和现代世界隔绝了。我们虽然能够从它们的外观上看到历史的痕迹,感受到当时的技艺与智慧,却难以触摸到那段历史背后的人情冷暖、风云变幻。它们不再是生活的一部分,而是被孤立在某个遥远的过去,只是某种文化的遗物。

然而,尽管它们远离了现代的喧嚣,文物依然是人类历史与文化的见证者。每一件文物都有自己独特的生命力,它们承载着前人的思想、情感和智慧。要想让文物重新焕发出活力,我们需要跨越时空的藩篱,用现代科技去唤醒它们沉睡的记忆。通过人工智能、虚拟现实等技术,文物可以不再是冰冷的展品,而是成为我们与过去沟通的桥梁。它们能够重新讲述那个时代的故事,带领我们走进千年之前的世界,让我们重新感受到历史的脉搏和文化的力量。

在这个数字化、智能化的时代,我们不妨通过创新的方式,去打破文物与现代生活之间的隔阂,让这些承载着历史与文明的珍宝重新走进我们的生活,让它们不再只是博物馆里的静物,而是活跃在我们日常的对话和思考之中。

二、项目分工

成员 任务
曹星才 前端页面设计
张诗悦 前端页面设计
朱佳杰 文物信息爬取
黄悦佳 后端服务器搭建与api接口编写
詹镇壕 后端服务器搭建与api接口编写

三、个人贡献

博物馆中文物信息和图片的爬取
查找图转视频的ai平台api

采用selenium进行编码爬取
中国博物馆官网的 首页>保管>藏品分类 中多页藏品的信息以备后续博物馆中文物展示
程序代码如下

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import pandas as pd
import time

# 初始化 WebDriver
service = Service(r"")  # 替换为你的 chromedriver 路径
options = webdriver.ChromeOptions()
options.add_argument("--headless")  # 如果需要无头模式可以取消注释
driver = webdriver.Chrome(service=service, options=options)

# 设置中国博物馆官网中藏品页为起始URL 并设置数据存储结构
base_url = "https://www.chnmuseum.cn/zp/zpml/gjwxbt/"
data = []

提取详情页中博物馆所需要的文字信息以及图片url

def extract_details():
    #爬取详情页的信息,包括图片 URL
    try:
        # 提取参数信息
        params_element = driver.find_element(By.CSS_SELECTOR, "div.cj_e_canshu")
        if params_element:
            params_parts = params_element.find_elements(By.XPATH, ".//p | .//div")
            params = ",".join(
                part.text.strip() for part in params_parts if part.text.strip()
            )
            params = params if params else "NULL"
        else:
            params = "NULL"

        # 提取详情内容
        details_element = driver.find_element(By.CSS_SELECTOR, "div.wwms")
        if details_element:
            # 获取所有的相关文本部分,包括段落、div 和 span
            detail_parts = details_element.find_elements(By.XPATH, ".//p | .//div | .//span")
            # 合并所有文本,去掉换行符和多余的空白符
            details = " ".join(
                part.text.strip().replace("\n", " ") for part in detail_parts if part.text.strip()
            )
            details = details if details else "NULL"
        else:
            details = "NULL"

        # 提取图片 URL
        try:
            img_element = driver.find_element(By.CSS_SELECTOR, "a[data-magnify='gallery'] img")
            if img_element:
                img_url = img_element.get_attribute("src")
                # 如果图片 URL 是相对路径,拼接完整的 URL
                if img_url.startswith("./"):
                    # 假设基础 URL 是 https://www.chnmuseum.cn/zp/zpml/ysp/
                    base_url = "https://www.chnmuseum.cn/zp/zpml/ysp/"
                    img_url = f"{base_url}{img_url[2:]}"  # 去掉 './' 并拼接
            else:
                img_url = "NULL"
        except Exception as img_error:
            print(f"Image not found in details page. Setting image URL to NULL. Error: {img_error}")
            img_url = "NULL"

        return params, details, img_url
    except Exception as e:
        print(f"Error extracting details: {e}")
        return "NULL", "NULL", "NULL"
def scrape_page(url):
    #爬取列表页数据并点击跳转到详情页
    driver.get(url)
    WebDriverWait(driver, 10).until(
        EC.presence_of_all_elements_located((By.CSS_SELECTOR, "a[target='_blank'][href*='./']"))
    )

    # 获取所有条目的元素
    elements = driver.find_elements(By.CSS_SELECTOR, "a[target='_blank'][href*='./']")
    for i, element in enumerate(elements):
        try:
            # 提取名称(p 标签内容)
            name_element = element.find_element(By.CSS_SELECTOR, "p")
            name = name_element.text.strip() if name_element else "NULL"

            # 提取时期(span 标签的 cpsdtem 或 ndtem 属性)
            try:
                span_element = element.find_element(By.CSS_SELECTOR, "span")
                year = span_element.get_attribute("cpsdtem")  # 优先从 cpsdtem 属性获取
                if not year:  # 如果 cpsdtem 为空,尝试获取 ndtem 属性
                    year = span_element.get_attribute("ndtem")
                if not year:  # 如果 ndtem 也为空,使用文本内容
                    year = span_element.text.strip()
                year = year if year else "NULL"  # 如果最终没有内容,则设为 NULL
            except Exception as e:
                print(f"Error extracting year for element {i} at URL: {url}. Error: {e}")
                year = "NULL"

            # 提取详情页链接
            href = element.get_attribute("href")
            href = f"https://www.chnmuseum.cn{href}" if href.startswith("./") else href

            # 点击跳转到详情页
            driver.execute_script("window.open(arguments[0], '_blank');", href)
            original_window = driver.current_window_handle

            # 等待并切换到新窗口
            WebDriverWait(driver, 10).until(lambda d: len(d.window_handles) > 1)
            driver.switch_to.window(driver.window_handles[-1])

            # 提取详情页内容
            params, details, img_url = extract_details()

            # 保存数据
            data.append({
                "名称": name,
                "时期": year,
                "参数": params,
                "图片url": img_url,
                "详情": details
            })
            print(f"Scraped: {name}, {year}")

            # 关闭详情页并切回列表页
            driver.close()
            driver.switch_to.window(original_window)

        except Exception as e:
            print(f"Error on element {i} at URL: {url}. Error: {e}")

主逻辑设定了最大要爬取的页数max_pages_to_scrape,初始化当前页面编号current_page为 0。
通过循环,根据当前页面编号构造要访问的 URL,然后调用scrape_page函数进行页面数据的抓取。
每次爬取完当前页后,检查页面上是否存在下一页的链接(通过特定的 CSS 选择器查找元素),如果存在则获取下一页链接并更新当前页面编号进入下一轮循环继续爬取,若不存在下一页链接则结束循环


# 主逻辑:分页爬取
max_pages_to_scrape = 9  # 设置最大爬取页数
current_page = 0
while current_page < max_pages_to_scrape:
    current_url = f"{base_url}/index_{current_page}.shtml" if current_page > 0 else base_url
    print(f"Scraping page: {current_url}")
    try:
        scrape_page(current_url)
        # 检查是否存在下一页的链接
        next_page_selector = "a.cj_shang1"  # 根据实际页面结构调整选择器
        if driver.find_elements(By.CSS_SELECTOR, next_page_selector):
            next_page = driver.find_element(By.CSS_SELECTOR, next_page_selector).get_attribute("href")
            current_page += 1
        else:
            break
    except Exception as e:
        print(f"Error on page {current_page}: {e}")
        break

# 保存数据到 CSV
df = pd.DataFrame(data)
df.to_csv("古籍文献.csv", index=False, encoding="utf-8-sig", na_rep="NULL")

# 关闭 WebDriver
driver.quit()
print("Scraping completed. Data saved to 古籍文献csv.")

数据和图片url经过进一步处理比如url访问爬取图片等等最后存储到后端数据库中

四、收获

*通过这次小组大作业再次巩固了爬虫中selenium的知识以及网站页面分析的技巧,并且在工作过程中进一步加强了我团队协作的经验和意识。
*寻找小组内用于图片转视频的大模型api过程中,发现国内相当大部分相关ai平台不提供api,
只有少数有api服务,并且在这这些少数拥有api服务的平台中,能够可靠生成具有"真实感"而不是
变成妖魔鬼怪的视频又是极少数。在这个过程中对市面多模态ai的发展有了更深的了解

posted @ 2024-12-16 00:48  朱艾伦  阅读(15)  评论(0编辑  收藏  举报