综合设计——多源异构数据采集与融合应用综合实践
1. 基本信息
这个项目属于哪个课程 | https://edu.cnblogs.com/campus/fzu/2023DataCollectionandFusiontechnology |
---|---|
组名 | 冲就完事 |
项目简介 | 当我们置身于日常生活或旅途中,常会被美景所震撼,但往往难以找到合适的诗句来表达内心的感悟。为了传承中华传统文化、提升人们的诗词修养和表达能力,我们需要一个智能系统能够根据用户拍摄的照片,自动匹配相应的诗句,并为用户提供相关的学习资源。 |
团队成员学号 | 102102101田甜、102102102刘燕莹、102102103李盈盈、102102106何雯彧、102102107张锦瑶、102102110饶雯捷、102102147高宝众、102102153彭诗忠 |
这个项目的目标 | 本系统旨在实现以下功能: a. 图片解释:基于用户上传的图片,系统能够自动识别图片内容,并提供与图片相符合的文字解释。 b. 古诗详情:用户可以选择获取与所拍图片相关的一首古诗的详细信息,包括标题、作者、内容、出处等。 c. 同韵古诗:用户可以获取与所拍图片相关的同韵古诗,以便进行进一步学习和欣赏。 d. 相似句子查询:用户可以输入关键词或句子,系统将返回与输入内容相似的古诗句子,以帮助用户寻找相关诗歌作品。 e.获取诗句相关地点地图:当诗句蕴含地址时,用户可以获取到该地点在地图上的位置 |
其他参考文献 | |
gitee链接: |
2.自己的分工
负责前期调研
最开始在定选题时曾经思考过爬取小红书的热词,再用机器翻译将热词翻译成英文,然后用英文单词造句,并调用文生图模型为造好的句子画对应的图。
目的是让用户了解热点词汇,学会热点词汇的英文表示。但遇到了一些问题:
- 热词对应的英文语料有限。比如“内卷”、“啃老”比较难找到对应的英文表述。
- 抽象。有一段时间的热点是“二舅治好了我的精神焦虑”,用以上的关键词投喂给ai,ai做出来的图往往是:“二舅在治疗精神焦虑”,“二舅很焦虑”。
询问了老师后老师也认为这个选题不太合适,于是这个选题暂且被搁置了。
事情的转机出现在有一天去上课的路上,我经过图书馆附近有天鹅的那片湖,感觉风景很美。文艺病犯了突然想吟诗几句,又想不出什么优雅词句。
是啊,如果眼前景色很美,然后你只会“卧槽好美的风景“,有点尴尬了。但是如果你有我们小组的多模态软件——就可以点击拍照,一键上传,ai在线为你识图并返回关键词。随后我们的后端将会使用selenium框架和手动抓包等爬虫方法,为你获取和眼前美景最匹配的古诗词。当然了不止古诗词,还包括诗词出处、相似诗句、同韵作品等等!
于是我们小组的创作就这么起步了。
负责后端部分模块的撰写
我负责的后端模块主要是获取“诗词地图”。
比方说你的诗句是:
长长出不得,短短出不得。
四大海不宽,藕丝窍不窄。
非耳目之所到,非心意之所及。
自西自东,自南自北。
落霞与孤鹜齐飞,秋水共长天一色(以上辑自《镇江府金山龙游禅寺语录》)。
这首诗里涉及到了"镇江府"和“龙游”,我们想知道在地图上它们俩相距离有多远,可以处理出如下一张图:
我们选取了搜韵(https://www.sou-yun.cn/index.aspx) 这个网站进行爬取,该网站调用了百度地图插件,将
诗词中涉及到的地点都标了出来。我的任务是获取这样的一张图。
分析完网页的结构后,发现它是以插件的形式嵌入的,也就是说源代码啥的甚至都不在搜韵这个网站内,在遥远的百度那里。
一计不成再生一计,干脆。。直接模拟人工截图好了,那做法就呼之欲出——selenium框架!
import base64
import time
import requests
import json
import urllib.parse
from scrapy.selector import Selector
from bs4 import UnicodeDammit
import sys
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from PIL import Image
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from PIL import Image
from io import BytesIO
def scrapyData(id):
#url='https://www.sou-yun.cn/Query.aspx?type=poem1&id=489904'
url = 'https://www.sou-yun.cn/Query.aspx?type=poem1&id='+id
headers = {
'Content-Type': 'application/x-www-form-urlencoded',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36 Edg/117.0.2045.47'
}
options = Options()
#options.add_argument('--headless')
driver = webdriver.Chrome(options=options)
driver.get(url)
time.sleep(2)
# 关闭广告
close = driver.find_element(By.XPATH, '//div[@class="popupad-close"]')
close.click()
time.sleep(1)
# 滚动到页面最下方
# driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
scroll_height = driver.execute_script("return document.body.scrollHeight")
scroll_height -= 900 # 调整滚动的长度,这里减去了500
flag=1
driver.execute_script(f"window.scrollTo(0, {scroll_height});")
time.sleep(1) # 等待一段时间,确保页面加载完成
# 截取整个页面
screenshot = driver.get_screenshot_as_png()
driver.quit()
# 将截图转换为Image对象
im = Image.open(BytesIO(screenshot))
# 裁剪截图,获取页面底部地图部分
map_img = im.crop((0, im.size[1] - 800, im.size[0], im.size[1]))
# 保存裁剪后的地图截图
screenshot_path = 'C:\\Users\\33245\\Desktop\\scrapy(python)\\scrapy\\'+'map_'+id+'.png'
map_img.save(screenshot_path)
return screenshot_path
if __name__ == '__main__':
result = scrapyData(sys.argv[1])
#result = scrapyData("239260")
print(result)
其中id是后端springboot框架调用python文件时传入的命令参数,表示诗词的id。selenium爬取页面并截图后,会将图片保存在本地某文件夹内,并将照片路径(screenshot_path)返回给springboot。springboot再将路径返回给前端,前端只需直接读取路径渲染图片即可。
查询同韵作品
对应的springboot代码为:
@RequestMapping("/articleMap")
public Result queryArticleMap( ){
String result_json = crawlRuner.Run("scrapyArticleMap.py",id);
log.info(result_json);
return Result.success(result_json);
}
路由映射为articleMap,调用crawlRunner类(这是参考了网上的一个封装好的类,用来在java中调用python爬虫文件)模拟命令行输入调用scrapyArticleMap.py文件,得到图片路径后返回给前端。
负责接口定义+测试
经过调研,我们的项目共有4个接口,分别是
- 查询诗词
- 查询诗词出处
- 查询相似句子
- 查询同韵作品
我负责后两个接口的定义+人工造数据+接口测试,文档和数据如下:
查询相似句子
请求参数说明:
没有请求参数,前端直接发起请求即可。这么设计是因为不是每一个句子都有相似句子,如果让前端逐个句子地向后端发送查询请求,得到的可能很多都是空值,而且实现起来也比较复杂,不如让后端直接爬取前三条(我们设定每个模块都至多返回三条数据)相似句子,再一起返回给前端~
返回的数据说明:
返回的数据都存放在data里,data是一个array数组,数据类型是我在apifox的”数据模型”模块里自定义的数据类型:poemSimilar
originalSentence:诗词的原句
similarSentence:诗词原句的相似句子
以示例数据为例:
爬取时如果原句没有相似句子,则不考虑。
如果原句有相似句子,则返回第一条相似句子,最多返回三条即可。
查询同韵作品
请求参数说明:
无请求参数。
返回的数据说明:
返回的数据都在data里,data是一个array数据,数据类型为string。也就是说这个data里面放了很多的string。
每个string的含义为:诗词的同韵作品。
以示例数据为例
后端爬取同韵作品时,只需爬取前3条数据,塞在data里返回给前端。前端处理数据时首先检查data是否为空,为空的话输出“没找到”,不为空就正常处理。
接口测试
测试方法:直接在idea里面发起HTTP请求(模拟前端发送的请求),测试后端的代码能否正常返回我们想要的数据。这个过程相当于给后端代码debug,但是我们的后端code写的非常棒,基本没bug,测试很顺利。
同韵作品
相似句子
gitee链接:
https://gitee.com/PicaPicasso/crawl_project/tree/master/综合设计——多源异构数据采集与融合应用综合实践