摘 要:為有效地收集、整理和利用高校數(shù)字文化資源,文章設計并實現(xiàn)了一個基于Python 3.9和Django 4.2架構的高校微信公眾號資源管理平臺。平臺以高校相關的微信公眾號為主要內(nèi)容來源,利用網(wǎng)絡爬蟲、MySQL數(shù)據(jù)庫,實現(xiàn)相關的數(shù)字文化資源的收集、存儲,并利用深度學習框架的自然語言處理工具庫對資源進行實體抽取形成多維度標簽,實現(xiàn)對資源內(nèi)容的深度揭示與關聯(lián)化檢索。
關鍵詞:數(shù)字文化;Python;Django;ERNIE-UIE
中圖分類號:TP311.1;G258.6 文獻標識碼:A 文章編號:2096-4706(2024)20-0072-07
Design and Implementation of a University Resource Management Platform for WeChat Official Accounts Platform
LIN Li
(Minjiang University Library, Fuzhou 350108, China)
Abstract: This paper designs and implements a university resource management platform for WeChat official accounts platform based on Python 3.9 and Django 4.2, aiming at effectively collecting, sorting out and utilizing university digital cultural resources. The platform takes WeChat official accounts platforms related to colleges and universities as the main content sources, uses Web crawler and MySQL database to collect and store related digital cultural resources, and uses the natural language processing tool library of Deep Learning framework to extract entities from resources to form multi-dimensional tags, thus realizing in-depth disclosure and related retrieval of resource contents.
Keywords: digital culture; Python; Django; ERNIE-UIE
0 引 言
2022年5月中央辦公廳、國務院辦公廳印發(fā)《關于推進實施國家文化數(shù)字化戰(zhàn)略的意見》,部署建設中華文化數(shù)據(jù)庫和文化數(shù)據(jù)服務平臺等重點任務,將數(shù)字文化建設提升為國家戰(zhàn)略[1]。隨著數(shù)字化浪潮的深入發(fā)展,高校已成為數(shù)字文化資源的重要匯聚地。這些資源包括校史檔案、學術講座、校園活動等豐富內(nèi)容,它們主要通過微信公眾號、視頻號等新媒體平臺進行傳播[2]。然而,由于運營主體分散,缺乏統(tǒng)一的管理機制,這些資源的關聯(lián)性檢索與高效利用受到了一定的限制[3]。為此,本文設計并實現(xiàn)了一個基于Python 3.9和Django 4.2架構的高校微信公眾號資源管理平臺,旨在解決這一問題。
1 平臺設計
1.1 系統(tǒng)需求分析
高校微信公眾號資源管理平臺用于整合與高校相關的微信公眾號所發(fā)布的數(shù)字資源。一方面,與高校相關的微信公眾號運營主體分散,有的屬于學校相關職能機構如教務處、科研處等,有的屬于學校各院系,有的屬于學生社團,有的屬于教工個人,還有的屬于校友,導致資源的共享性較差[4];另一方面,由于微信公眾號平臺在資源管理上主要以內(nèi)容展示為主,對于內(nèi)容主題檢索,特別是跨公眾號的內(nèi)容主題檢索支持有限,無法實現(xiàn)高校微信公眾號資源的統(tǒng)一檢索利用。因此平臺需實現(xiàn)以下功能:
1)將與高校相關的微信公眾號上的數(shù)字文化資源進行統(tǒng)一聚合,對相關公眾號所發(fā)布資源進行自動化收集。
2)對收集的數(shù)字資源進行統(tǒng)一存儲和元數(shù)據(jù)抽取,實現(xiàn)文本資源的數(shù)據(jù)化處理,生成資源的多維度標簽。
3)支持基于分析數(shù)據(jù)的多維度檢索和圖譜化展示。
平臺功能結構如圖1所示。
1.2 技術選型
平臺選擇Python作為開發(fā)語言,Django作為后臺框架。Python擁有強大而廣泛的第三方庫和框架支持,能夠滿足各種Web開發(fā)需求。開發(fā)者可以利用現(xiàn)成的工具和庫,提高開發(fā)效率,減少重復勞動,使得Web應用的構建更加迅速和靈活[5]。選擇Django 4.2作為Web框架,Django是一個高度集成的Web框架,提供了大量的內(nèi)置組件和工具,包括ORM(對象關系映射)、模板引擎、表單處理等。此外,選擇MySQL 8.0作為關系型數(shù)據(jù)庫,它具有良好的存儲和查詢性能[6]。選擇百度開源的ERNIE-UIE大模型,該模型實現(xiàn)了實體抽取、關系抽取、事件抽取、情感分析等任務的統(tǒng)一建模,并使得不同任務間具備良好的遷移和泛化能力,可以支持對不限定行業(yè)領域和抽取目標的關鍵信息抽取[7]。選擇NetworkX作為圖譜庫,它可以將知識點可視化為知識圖譜。
1.3 平臺架構
平臺采用B/S架構、模塊化設計,如圖2所示,主要包括以下模塊:
1)數(shù)字資源的采集和處理模塊。負責自動從微信公眾號、視頻號上爬取數(shù)字文化資源,并抽取出資源的元數(shù)據(jù)。
2)數(shù)據(jù)存儲模塊。負責將爬取到的資源元數(shù)據(jù)存儲到MySQL數(shù)據(jù)庫中。
3)數(shù)據(jù)分析模塊。負責通過爬取的URL數(shù)據(jù)來提取資源中的文本信息,經(jīng)過清洗、分析,生成資源多維度實體信息,并存入MySQL數(shù)據(jù)庫中。
4)數(shù)據(jù)利用模塊。負責將以提取到的資源多維度實體信息作為資源的標簽,方便資源的回溯檢索。同時,以實體信息為參數(shù)生成資源的知識圖譜。
1.4 數(shù)據(jù)庫設計
按平臺功能需求數(shù)據(jù)庫共設計了三張表,如表1至表3所示,分別用于存儲公眾號運營主體類別信息、公眾號主體信息、公眾號所發(fā)表文章信息。
2 平臺功能實現(xiàn)
2.1 數(shù)字資源的采集和處理
首先將收集的微信公眾號按運營主體進行分類登記,分兩步實現(xiàn):一是通過表單預先設置運營主體信息并存入數(shù)據(jù)表中;二是在進行公眾號主體信息登記時,通過下拉表單強制要求公眾號進行分類登記,如圖3所示,以豐富后期爬取資源的標簽信息。以上功能通過django的forms(表單類)實現(xiàn)。
核心代碼如下:
from django import forms
from .models import *
class wxidform(forms.Form):
nickname=forms.CharFieNb6GeduUBmMRMDMEHnrQrQ==ld(max_length=30,label='請完整填寫公眾號中文名稱')
wx_attribution_choices=forms.ModelChoiceField(queryset=wx_attribution.objects.all().values_list('wx_attribution', flat=True),
label='請選擇微信公眾號類型', empty_label="請選擇" ,)
微信公眾號沒有提供API接口,且如果通過第三方檢索的方式爬取資源時,資源的URL不是永久可訪問。平臺選擇通過注冊的公眾號在創(chuàng)作圖文消息時獲取各公眾號文章長鏈接的途徑來實現(xiàn),主要利用Chrome中開發(fā)者工具抓包獲取相關接口信息,最終實現(xiàn)對相關公眾號資源的爬取,如圖4所示。
爬取分三步實現(xiàn):
1)利用selenium.webdriver模擬登錄微信公眾號,獲取登錄之后的cookies信息[8]。
2)利用cookies爬取微信公眾號token、fakeid、nickname等數(shù)據(jù)。
3)利用已有的token、fakeid、nickname進一步爬取該公眾號下的文章元數(shù)據(jù)。
該模塊功能主要通過Django的views實現(xiàn),核心代碼如下:
from selenium import webdriver
from selenium.webdriver.common.by import By
import time,json,random,requests,re
from wxarticle.models import *
from django.db.models import Max
from datetime import datetime
from django.utils import timezone
#獲取cookies
def wechat_login(account_name,password):
driver=webdriver.Chrome()
driver.get("https://mp.weixin.qq.com/")
time.sleep(2) driver.find_element(By.XPATH,'//*[@id="header"]/div[2]/div/div/div[2]/a').click()
driver.find_element(By.NAME,"account").send_keys(account_name)
driver.find_element(By.NAME,"password").send_keys(password)
driver.find_element(By.CLASS_NAME,"frm_checkbox_label").click()
time.sleep(1)
driver.find_element(By.CLASS_NAME,"btn_login").click()
time.sleep(20)
cookie_items=driver.get_cookies()
post={}
for cookie_item in cookie_items:
post[cookie_item['name']]=cookie_item['value']
cookie_str=json.dumps(post)
with open('wxcookie.txt', 'w+', encoding='utf-8') as f:
f.write(cookie_str)
driver.quit()
#爬取微信公眾號token,fakeid,nickname等數(shù)據(jù)
def wxh_get_fakeid(query):
url='https://mp.weixin.qq.com'
header={"HOST": "mp.weixin.qq.com",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/\
537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/ 537.36",
"Accept - Encoding": "gzip, deflate, br ,utf-8",}
with open('wxcookie.txt', 'r', encoding='utf-8') as f:
cookie=f.read()
f.close()
cookies=json.loads(cookie)
session=requests.Session()
session.keep_alive=False
time.sleep(1)
response=session.get(url=url, cookies=cookies, verify=False)
token=re.findall(r'token=(\d+)', str(response.url))[0]
time.sleep(1)
search_url='https://mp.weixin.qq.com/cgi-bin/searchbiz'
query_params={'action': 'search_biz', 'token': token, 'lang': 'zh_CN', 'f': 'json', 'ajax': '1', 'query': query, 'begin': '0', 'count': '5' }
search_response=session.get(search_url,cookies=cookies,headers=header,params=query_params)
lists=search_response.json()['list'][0]
fakeid=lists['fakeid']
nickname=lists['nickname']
alias=lists['alias']
signature=lists['signature']
round_head_img=lists['round_head_img']
return token,fakeid,nickname,alias,signature,round_head_img
#爬取該微信公眾號文章信息提取元數(shù)據(jù)并寫入數(shù)據(jù)表
def wxh_get_content(nickname,fakeid,header,cookies):
appmsg_url='https://mp.weixin.qq.com/cgi-bin/appmsg'
session=requests.Session()
session.keep_alive=False
time.sleep(1)
response=session.get('https://mp.weixin.qq.com', cookies=cookies, verify=False)
token=re.findall(r'token=(\d+)', str(response.url))[0]
query_id_data={'token': token, 'lang': 'zh_CN', 'f': 'json', 'ajax': '1', 'action': 'list_ex', 'begin': '0', 'count': '5', 'query': '', 'fakeid': fakeid, 'type': '9'}
appmsg_response=session.get(appmsg_url, cookies=cookies, headers=header, params=query_id_data)
max_num=appmsg_response.json()['app_msg_cnt']
num=int(int(max_num) / 5)
begin=0
while num + 1 > 0:
query_id_data={'token': token, 'lang': 'zh_CN', 'f': 'json', 'ajax': '1', 'action': 'list_ex', 'begin': '{}'.format(str(begin)), 'count': '5', 'query': '', 'fakeid': fakeid, 'type': '9'}
query_fakeid_response=session.get(appmsg_url, cookies=cookies, headers=header, params=query_id_data)
fakeid_list=query_fakeid_response.json()['app_msg_list']
print(fakeid_list)
max_createtime=wx_article_url.objects.filter(nickname=nickname).aggregate(Max('createtime'))
for item in fakeid_list:
createtime=item['create_time']
content_createtime=time.strftime('%Y-%m-%d %X', time.localtime(createtime))
datetime_content_createtime=datetime.strptime(content_createtime, "%Y-%m-%d %H:%M:%S")
datetime_content_createtime=timezone.make_aware(datetime_content_createtime, timezone.utc)
if datetime_content_createtime > max_createtime['createtime__max']:
content_title=item['title'].encode('utf-8')
content_link=item['link']
content_coverlink=item['cover']
wx_article_url.objects.create(nickname=nickname,createtime=content_createtime,title=content_title,url=content_link)
num -= 1
begin=int(begin)
begin += 5
2.2 數(shù)據(jù)存儲
在數(shù)據(jù)存儲部分,平臺使用Django框架里ORM系統(tǒng)來管理數(shù)據(jù)庫操作,確保獲取的數(shù)據(jù)被安全、有效地存儲在MySQL 8.0數(shù)據(jù)庫中。Django提供了強大的數(shù)據(jù)庫抽象層,使得開發(fā)者可以在不關心底層數(shù)據(jù)庫實現(xiàn)細節(jié)的情況下進行高效的數(shù)據(jù)操作。數(shù)據(jù)存儲功能屬于Django的MVT(模型-視圖-模板)的M(模型)部分,在Models.py中完成模型定義。接著通過django的管理工具manage.py完成在MySQL 8.0數(shù)據(jù)庫中創(chuàng)建表。另外,在數(shù)據(jù)抓取部分(即上面的代碼),每次獲取到新的文章數(shù)據(jù)時,都會檢查這篇文章的創(chuàng)建時間是否晚于數(shù)據(jù)庫中已有數(shù)據(jù)的最晚創(chuàng)建時間。如果是,就將這篇新文章的數(shù)據(jù)存儲到數(shù)據(jù)庫中。
2.3 數(shù)據(jù)分析
微信公眾號缺乏資源的細粒度標簽,無法滿足用戶多維度的檢索需求。隨著AI技術的不斷發(fā)展和成熟,深度學習框架中的自然語言處理技術為我們提供了一種有效的解決方案——文本自動化實體抽取任務。平臺選擇了百度開源的ERNIE-UIE大模型。它是一個基于知識增強的統(tǒng)一信息抽取框架,不僅結合了百度在深度學習和自然語言處理領域多年的積累,而且具備處理多種類型信息抽取任務的能力。通過引入ERNIE-UIE大模型,平臺能夠自動化地從微信公眾號的海量文本中抽取出各類實體,如人名、地名、機構名等,并為其打上細粒度的標簽。這些標簽不僅豐富了資源的元數(shù)據(jù),還為用戶提供了更加精準、多維度的檢索條件。核心代碼如下:
from bs4 import BeautifulSoup
from paddlenlp import Taskflow
import networkx as nx
import matplotlib.pyplot as plt
def wx_article_analyse(url):
schema_entity=['時間', '人名', '地名', '事件', '組織', '課題', '獎項', '會議']
response=requests.get(url)
html_content=response.text
soup=BeautifulSoup(html_content, 'html.parser')
text_content=soup.get_text()
# 實體抽取
ie_entity=Taskflow('information_extraction', schema=schema_entity, model='uie-base')
entity=ie_entity(text_content)[0]
# 關系抽取
schema_relation={'事件': ['時間', '人名', '組織'], '課題':['時間', '人名', '組織'], '獎項':['時間', '人名', '組織'], '會議':['時間', '人名', '組織']}
ie_relation=Taskflow('information_extraction', schema=schema_relation, model='uie-base')
relation=ie_relation(text_content)[0]
return entity,relation
2.4 數(shù)據(jù)利用
數(shù)據(jù)利用主要體現(xiàn)如下:
1)通過將與高校相關的微信公眾號上的數(shù)字文化資源進行統(tǒng)一聚合,并對其進行抽取和分析得到的實體信息數(shù)據(jù),構建資源的標簽以實現(xiàn)八個維度的資源回溯檢索功能,核心代碼如下:
from django.http import JsonResponse
from .models import wx_article_url, wx_id
def search_articles_by_dimension(request, dimension, value):
# 根據(jù)傳入的維度和值進行過濾
articles=wx_article_url.objects.filter(**{f'entity_{dimension}__contains': value}).distinct()
# 獲取微信公眾號歸屬等信息,需要關聯(lián)wx_id模型
article_list=[]
for article in articles:
try:
wx_info=wx_id.objects.get(fakeid=article.fakeid)
article_list.append({'nickname': wx_info.nickname,
'wx_attribution': wx_info.wx_attribution,
'title': article.title,
'url': article.url,})
except wx_id.DoesNotExist:
continue
return JsonResponse(article_list, safe=False)
數(shù)據(jù)抽取和分析結果樣本見表4。
2)通過分析得到的實體關系信息數(shù)據(jù)構建知識圖譜[9]。核心代碼如下:
import networkx as nx
import matplotlib.pyplot as plt
def wx_article_plt(ID,data):
G=nx.DiGraph()
for category, items in data.items():
for item in items:
text=item['text']
start=item['start']
end=item['end']
probability=item['probability']
relations=item.get('relations', {})
G.add_node(text, label=text, start=start, end=end, probability=probability)
for relation_type, relation_items in relations.items():
for relation_item in relation_items:
relation_text=relation_item['text']
G.add_edge(text, relation_text, relation=relation_type)
pos=nx.spring_layout(G)
nx.draw_networkx_nodes(G, pos, node_size=1000, node_color='lightblue')
nx.draw_networkx_edges(G, pos, alpha=0.5)
nx.draw_networkx_labels(G, pos, font_size=16, font_family='sans-serif')
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.axis('off')
plt.savefig('./pltfig/'+str(ID)+ '.png')
3)實現(xiàn)對所聚合資源的跨公眾號統(tǒng)一檢索和圖譜展示[10],如圖5所示。
3 結 論
平臺不但實現(xiàn)了基于微信公眾號的高校相關數(shù)字文化資源的統(tǒng)一保存,而且突破了微信公眾平臺上傳統(tǒng)的只能根據(jù)關鍵詞進行搜索的檢索方式,實現(xiàn)從時間、人名、地名、事件、組織、課題、獎項和會議這八個維度回溯檢索。用戶可以根據(jù)自己的需求,選擇相應的維度和條件,快速定位到自己感興趣的資源。除了回溯檢索外,平臺還利用抽取的實體關系數(shù)據(jù),構建了一個知識圖譜。通過這個圖譜,用戶可以發(fā)現(xiàn)不同資源之間的關聯(lián)和聯(lián)系,促進資源的有效傳播和利用。同時,這也為微信公眾號帶來了更多的互動和活躍度,提升了其整體的用戶體驗和價值。
參考文獻:
[1] 新華網(wǎng).中共中央辦公廳 國務院辦公廳印發(fā)《關于推進實施國家文化數(shù)字化戰(zhàn)略的意見》 [EB/OL].(2022-05-22).http://www.news.cn/2022-05/22/c_1128674022.htm.
[2] 馬麗丁娜,朱麗麗.數(shù)字文化10年研究:技術、日常生活與在地實踐 [J].傳媒觀察,2023(3):80-90.
[3] 任立.數(shù)字人文時代文化遺產(chǎn)融入高校德育教育體系探究 [J].黑河學院學報,2024,15(1):173-176+184.
[4] 張玉清,趙江南,趙威.平臺、內(nèi)容與運維:高校共青團微信公眾號影響力提升策略的實證探析 [J].東南大學學報:哲學社會科學版,2023,25(S2):72-77.
[5] 田文濤.Python技術在計算機軟件中的應用 [J].集成電路應用,2024,41(2):344-346.
[6] 李朝陽,周維貴,張小鋒,等.一種麒麟系統(tǒng)下基于Django的網(wǎng)絡性能管理系統(tǒng)設計與實現(xiàn) [J].計算機應用與軟件,2024,41(3):130-133.
[7] 飛槳.UIE模型簡介 [EB/OL].(2022-11-28)[2024-03-02].https://aistudio.baidu.com/modelsdetail/22?modelId=22.
[8] 朱燁行,趙寶瑩,張明杰,等.基于Scrapy框架的微博用戶信息采集系統(tǒng)設計與實現(xiàn) [J].現(xiàn)代信息科技,2023,7(24):41-44+48.
[9] 蔡文樂,秦立靜.基于Python爬蟲的招聘數(shù)據(jù)可視化分析 [J].物聯(lián)網(wǎng)技術,2024,14(1):102-105.
[10] 許夢雅.基于Echarts技術的企業(yè)數(shù)據(jù)可視化的設計與開發(fā) [J].現(xiàn)代信息科技,2022,6(6):90-92+96.
作者簡介:林立(1978—),男,漢族,福建福州人,副研究館員,本科,研究方向:圖書館自動化與數(shù)字化。