网站建设推广费计入什么科目,上海it驻场服务外包,苏州做物流网站电话,线上商城app不知不觉已经入职3个月了#xff0c;同事很好#xff0c;工作充实#xff0c;学到了很多东西#xff0c;大大小小的需求也实现了接近20个。负责2个主要component#xff0c;数据抓取和利用GenAI做数据提取。 1 背景
提取新闻中事件关键信息#xff0c;比如人名#xff… 不知不觉已经入职3个月了同事很好工作充实学到了很多东西大大小小的需求也实现了接近20个。负责2个主要component数据抓取和利用GenAI做数据提取。 1 背景
提取新闻中事件关键信息比如人名时间事件等并与可信数据进行比较根据比较结果将新闻事件进行相应处理减少人工审查成本。
2 主要组件
数据抓取一键抓取内部可信数据输入到系统前端界面免去用户人工填写的成本和差错。前端将可信数据和新闻事件提交到后台等待分析结果。后端权限控制调用GenAI模块进行提取将提取结果返回前端并做数据持久化。GenAI提取新闻中的关键信息并返回给后端。Dashboard监控整个系统健康状态如响应时间消息队列长度用户反馈安全检测等。
3 数据抓取
3.1 win32应用程序数据抓取
3.1.1 Windows程序窗口定位
有两种方式定位到Windows程序窗口1.通过窗口标题2.通过进程名字找pid进而定位窗口。第一种适合窗口标题固定第二种适配多语言系统。
通过窗口标题定位窗口
import pygetwindow,win32guiall_windows pygetwindow.getAllWindows() # 获取所有窗口
app_title_list [app.title for app in all_windows if app!] # 获取所有非空窗口标题
for item in app_title_list:if 窗口标题前缀 in item:find_window pygetwindow.getWindowsWithTitle(item) # 如果窗口标题是固定的直接调用这句这里使用app_title_list再遍历是因为要获取的窗口标题仅有前缀固定find_window.activate() # 激活窗口find_window.maximize() # 窗口最大化win32gui.SetForegroundWindow(find_window._hWnd) # 窗口最前根据进程名字找到pid进而定位窗口
import psutil,win32process,win32guidef get_pid_by_name(process_name): # 通过任务管理器中的进程名字定位一般是固定的并且是英语不会随系统语言变化for proc in psutil.process_iter([pid,name]) # 拉出系统所有进程if proc.info[name]process_name: # 名字匹配return proc.info[pid] # 返回名字匹配进程的pidreturn Nonedef get_window_title_by_pid(pid): # 根据pid获取窗口名def callback(hwnd, hwnd_list):_, process_id win32process.GetWindowThreadProcessId(hwnd) # 根据hwnd获取窗口的进程PIDif process_id pid:window_title win32gui.GetWindowText(hwnd) # 通过窗口的标题名获取窗口句柄hwnd_list.append(window_title)return True # 继续枚举下一个窗口windows_titles []win32gui.EnumWindows(callback, window_titles)# 遍历系统中所有的顶层窗口并针对每个窗口调用一次 callback 函数。遍历过程中符合条件进程 ID 与目标 PID 相等的窗口标题会被添加到 windows_titles 列表中。return window_titlespid get_pid_by_name(xxx.exe)
window_titles get_window_title_by_pid(pid)
for item in window_titles:if 窗口标题前缀 in item:进行处理咯参考python win32gui 获取句柄
win32api 鼠标定位及点击操作
import win32con,win32api,pygetwindowfind_window pygetwindow.getWindowsWithTitle(item) #
x,y int(find_window.left),int(find_window.right)
win32api.SetCursorPos([x,y]) # 鼠标移动到到程序窗口左下角
win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTUP | win32con.MOUSEEVENTF_RIGHTDOWN,0,0,0,0) # 右键点击
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP | win32con.MOUSEEVENTF_LEFTDOWN,0,0,0,0) # 左键点击pyautogui键盘操作, pyperclip剪切板
from pyautogui import press, hotkey
import pyyperclippyperclip.copy() # 剪贴板置为空字符串
prees(tab)
hotkey(ctrl,a)
hotkey(ctrl,c)
text pyperclip.waitForPaste() # 一直等待获取剪贴板内容3.2 利用selenium将数据传入前端
两种方法
前端设置1个隐藏元素demo用js脚本把json传过去 driver.execute_script(return document.getElementById(demo).valuedata;)通过Id定位元素然后sendkeys发送值element driver.find_element_by_id(demo1) # 定位到id为demo1的元素
element.sendkeys(data) # 把data传给demo1元素3.3 pyinstall打包成exe
如果涉及到一些配置文件打包比如excel文件可以用–add-data指定 pyinstall --noconfirm --onefile --nowindow --noconsole --add-data demo.xlsx:. --nameapp. main.py 这是打包成一个exe运行时可以读取demo.xlsx内容
4 GenAI
4.1 prompt编写
langchain的PromptTemplate使用
4.2 asycio异步并发
4.3 日志记录
默认的logging
5 Dashboard
5.1 定时任务apscheduler
防止并发情况下多次执行导致结果错误可以用max_instance参数控制
5.2 redis统计最大队列长度
双key每次put队列用k1记录最大长度定时清零清零前赋值给k2后端来拿k2