news 2026/5/9 15:42:34

基于Python爬虫的自动化求职监控系统:从原理到实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于Python爬虫的自动化求职监控系统:从原理到实践

1. 项目概述:一个求职者的“信息雷达”

如果你正在找工作,或者曾经找过工作,那你一定体会过那种每天在各个招聘网站、公司官网、社交媒体上反复刷新、生怕错过任何一个机会的焦虑感。手动搜索不仅效率低下,还容易因为信息过载而遗漏关键岗位。NissonCX/offercatcher这个开源项目,就是为了解决这个痛点而生的。你可以把它理解为一个为你私人定制的、24小时不间断工作的“求职信息雷达”。

它的核心功能非常直接:自动化地监控你指定的目标公司或职位关键词,一旦有新的招聘信息发布,就立即通过你预设的渠道(比如邮件、Telegram机器人、钉钉等)推送给你,让你成为第一批看到机会的人。这不仅仅是简单的信息聚合,更是一种主动式的求职策略。在竞争激烈的求职市场中,时间就是机会,早一步投递简历,可能就意味着更高的面试概率。

这个项目适合所有正在积极寻找工作机会的求职者,无论是应届生、寻求跳槽的资深工程师,还是希望探索新机会的自由职业者。它尤其适合那些目标明确(例如,只关注某几家心仪公司或特定技术栈岗位)的求职者。通过自动化工具解放双手和注意力,你可以将更多精力投入到简历优化、面试准备等更有价值的事情上。

2. 核心设计思路与架构拆解

2.1 从需求到方案:为什么选择自建爬虫?

市面已有一些招聘信息聚合平台或RSS订阅服务,那为什么还要自己搭建一个offercatcher呢?这背后有几个关键的考量点。

首先,可控性与定制化。第三方平台的信息源、更新频率、筛选逻辑都是黑盒,你无法干预。而offercatcher允许你完全自定义监控的目标。比如,你可以精确地监控“A公司官网招聘页中所有包含‘后端开发’和‘Go’关键词的职位”,或者“B招聘网站上‘机器学习’类别下,薪资范围在30K以上的职位”。这种颗粒度的控制是通用平台难以提供的。

其次,实时性与可靠性。自建服务的更新周期完全由你决定,可以设置为每分钟检查一次,实现近乎实时的监控。而且,数据直接来自源头(公司官网、招聘平台),避免了第三方平台可能存在的信息延迟或遗漏。

最后,隐私与数据安全。你的求职意向、关注的公司列表是高度敏感的个人信息。使用自建服务,所有这些配置和数据都运行在你自己的服务器或电脑上,无需担心信息泄露给第三方。

offercatcher的技术栈选择也体现了其实用主义导向。它主要基于 Python,利用requestsBeautifulSoupSelenium等库来抓取和解析网页(即“爬虫”部分),再通过smtplib(邮件)、requests(调用各类Webhook)等方式进行通知。整个架构是模块化的,核心流程可以概括为:配置加载 -> 定时触发 -> 多平台抓取 -> 数据解析去重 -> 条件过滤 -> 多渠道通知

2.2 核心模块功能解析

一个完整的offercatcher实例,通常包含以下几个核心模块:

  1. 配置管理器:这是项目的大脑。它负责读取你的配置文件(通常是config.yamlconfig.json),里面定义了所有监控任务。每个任务会包含:

    • 目标URL:需要监控的招聘列表页面地址。
    • 抓取规则:如何从页面HTML中提取职位名称、公司、链接、发布日期等关键信息(通常使用CSS选择器或XPath)。
    • 过滤条件:对抓取到的职位进行筛选,例如关键词匹配、排除特定公司等。
    • 通知渠道:设置邮件、Telegram Bot Token、钉钉Webhook地址等。
  2. 爬虫调度器:这是项目的心脏。它通常基于scheduleapscheduler这样的库实现定时任务。调度器按照配置的时间间隔(例如每30分钟),依次触发各个监控任务的抓取流程。

  3. 网页抓取与解析器:这是项目的手和眼睛。针对不同的网站,可能需要不同的抓取策略。

    • 对于静态页面,直接使用requests获取HTML,再用BeautifulSoup解析即可。
    • 对于动态加载(大量使用JavaScript)的页面,则需要启动Selenium模拟浏览器行为,等待页面元素加载完成后再进行解析。这部分是开发中最复杂、最需要针对不同网站单独适配的地方。
  4. 数据处理器:负责对抓取到的原始数据进行清洗、去重和过滤。去重是关键,它通过比对本次抓取和历史上次抓取的职位ID或链接,确保不会重复通知同一个职位。过滤则根据配置的关键词进行匹配,只保留你感兴趣的职位。

  5. 通知发送器:这是项目的嘴巴。将处理后的、符合条件的新职位信息,按照配置的格式(如Markdown、纯文本),通过不同的渠道发送出去。模块化设计使得新增一个通知渠道(如飞书、企业微信)变得相对容易。

注意:在设计和运行爬虫时,必须严格遵守目标网站的robots.txt协议,并设置合理的请求间隔(如每次请求间隔2-5秒),避免对目标网站服务器造成压力,这既是法律和道德要求,也能保证你的爬虫长期稳定运行。

3. 从零开始:搭建你的第一个职位监控器

3.1 环境准备与项目初始化

假设你已经在本地或一台云服务器上准备好了 Python 环境(建议使用 Python 3.8+),接下来我们一步步搭建。

首先,克隆项目代码并安装依赖。通常这类项目的依赖会放在requirements.txt文件中。

# 克隆项目仓库 git clone https://github.com/NissonCX/offercatcher.git cd offercatcher # 创建并激活虚拟环境(推荐,避免污染系统环境) python -m venv venv source venv/bin/activate # Linux/Mac # venv\Scripts\activate # Windows # 安装依赖 pip install -r requirements.txt

典型的requirements.txt会包含以下核心库:

requests>=2.25.1 beautifulsoup4>=4.9.3 schedule>=1.1.0 python-dotenv>=0.19.0 PyYAML>=5.4.1 # 如果需要抓取动态页面 selenium>=4.0.0

如果项目没有提供requirements.txt,你也可以根据其源码中import的语句手动安装这些库。

3.2 核心配置文件详解

配置是整个项目的灵魂。我们需要创建一个配置文件,比如config.yaml,来告诉offercatcher监控什么、如何通知。

# config.yaml 示例 global: check_interval_minutes: 30 # 全局检查间隔,单位分钟 storage_file: ./data/jobs.json # 用于存储历史职位数据,实现去重 notifiers: email: enabled: true smtp_server: smtp.gmail.com # SMTP服务器地址 smtp_port: 587 username: your_email@gmail.com # 发送邮件的邮箱 password: your_app_specific_password # 注意:使用应用专用密码,非邮箱登录密码 sender: your_email@gmail.com receivers: - your_target_email@example.com # 接收通知的邮箱 telegram: enabled: false # 按需开启 bot_token: YOUR_BOT_TOKEN chat_id: YOUR_CHAT_ID targets: - name: "A公司官网-技术岗位" url: "https://careers.example-a.com/jobs" parser: "css" # 使用CSS选择器解析 selectors: job_item: "div.job-listing" # 职位列表项的CSS选择器 title: "h3.job-title a" # 职位标题 link: "h3.job-title a@href" # 职位链接(@href表示取href属性) company: "div.company-name::text" # 公司名 publish_date: "span.date::text" filters: include_keywords: ["后端", "开发", "工程师", "Python", "Java"] exclude_keywords: ["前端", "实习"] notifiers: ["email"] # 使用哪个通知器 - name: "B招聘平台-机器学习" url: "https://www.example-b.com/search?keyword=机器学习" parser: "selenium" # 动态页面,使用Selenium selectors: # ... 类似上述,选择器需要根据实际页面结构调整 wait_condition: # Selenium等待条件 type: "presence_of_element_located" selector: "div.job-list" filters: min_salary: 30000 # 可选,过滤最低薪资 notifiers: ["email"]

配置关键点解析:

  • selectors:这是配置中最核心也最易出错的部分。你需要使用浏览器的开发者工具(F12),仔细分析目标网页的HTML结构,找到能唯一标识一个职位条目以及其内部各个字段(标题、链接等)的CSS选择器或XPath。这个过程需要一些耐心和反复测试。
  • 应用专用密码:对于Gmail等邮箱,如果开启了两步验证,不能直接使用登录密码,需要在邮箱设置中生成“应用专用密码”来填写。
  • 去重存储storage_file指定的JSON文件会保存所有抓取到的职位ID/链接。每次运行时会先读取历史数据,只对新出现的职位进行通知。

3.3 编写与调试爬虫解析规则

对于静态页面,我们可以写一个简单的测试脚本来验证选择器是否正确。

# test_parser.py import requests from bs4 import BeautifulSoup url = "https://careers.example-a.com/jobs" headers = {'User-Agent': 'Mozilla/5.0'} # 模拟浏览器请求头 resp = requests.get(url, headers=headers) soup = BeautifulSoup(resp.content, 'html.parser') # 使用配置中的选择器进行测试 job_items = soup.select("div.job-listing") print(f"找到 {len(job_items)} 个职位条目") for item in job_items[:2]: # 只看前两个 title_elem = item.select_one("h3.job-title a") title = title_elem.text.strip() if title_elem else "N/A" link = title_elem['href'] if title_elem else "#" company_elem = item.select_one("div.company-name") company = company_elem.text.strip() if company_elem else "N/A" print(f"标题: {title}") print(f"链接: {link}") print(f"公司: {company}") print("-" * 30)

运行这个脚本,如果它能正确打印出职位信息,说明你的选择器是有效的。如果返回空列表,你需要重新检查网页HTML结构,可能页面是动态加载的,或者选择器写错了。

对于动态页面,调试会更复杂一些。你可能需要启动一个Selenium浏览器实例,在交互环境中逐步执行代码,查看页面加载后的实际DOM结构。

实操心得:在编写选择器时,尽量选择那些具有唯一性和稳定性的属性,比如>import requests from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry def create_session(): session = requests.Session() headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', } session.headers.update(headers) # 配置重试策略,应对网络波动 retries = Retry(total=3, backoff_factor=1, status_forcelist=[500, 502, 503, 504]) session.mount('http://', HTTPAdapter(max_retries=retries)) session.mount('https://', HTTPAdapter(max_retries=retries)) return session # 使用会话进行请求 session = create_session() try: response = session.get(target_url, timeout=10) response.raise_for_status() # 如果状态码不是200,抛出异常 except requests.exceptions.RequestException as e: print(f"请求失败: {e}") # 这里可以加入重试或通知管理员逻辑

2. 智能去重策略:简单的基于链接去重可能不够,因为有些网站会为同一个职位生成不同的追踪链接。更健壮的去重策略是结合职位标题、公司名称和职位唯一ID(如果存在)生成一个哈希值作为唯一标识。

import hashlib import json def get_job_signature(job): """根据职位信息生成唯一签名""" # 优先使用网站提供的唯一ID unique_id = job.get('job_id') or job.get('id') if unique_id: return unique_id # 否则,使用标题+公司生成哈希 content = f"{job['title']}_{job['company']}" return hashlib.md5(content.encode('utf-8')).hexdigest() def filter_new_jobs(fetched_jobs, history_file='./data/jobs.json'): """过滤出新的职位""" try: with open(history_file, 'r', encoding='utf-8') as f: history = json.load(f) except (FileNotFoundError, json.JSONDecodeError): history = [] history_signatures = {job['signature'] for job in history} new_jobs = [] for job in fetched_jobs: job['signature'] = get_job_signature(job) if job['signature'] not in history_signatures: new_jobs.append(job) history.append({'signature': job['signature'], 'fetched_at': '2023-10-01'}) # 记录获取时间 # 保存更新后的历史记录(可限制最大保存数量,避免文件过大) with open(history_file, 'w', encoding='utf-8') as f: json.dump(history[-1000:], f, ensure_ascii=False, indent=2) # 只保留最近1000条 return new_jobs

4.2 构建灵活的通知系统

一个实用的通知系统应该支持多种渠道,并且消息模板要清晰易读。

1. 邮件通知增强:除了发送纯文本,我们可以发送格式更友好的HTML邮件,并支持附件(例如,将本次所有新职位生成一个CSV文件附上)。

import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.application import MIMEApplication import pandas as pd from datetime import datetime def send_email_with_html_and_attachment(smtp_config, new_jobs): """发送带HTML内容和附件的邮件""" msg = MIMEMultipart() msg['From'] = smtp_config['sender'] msg['To'] = ', '.join(smtp_config['receivers']) msg['Subject'] = f'【职位监控】发现 {len(new_jobs)} 个新职位 - {datetime.now().strftime("%Y-%m-%d %H:%M")}' # 1. 构建HTML正文 html_content = """ <html> <body> <h2>发现的新职位如下:</h2> <table border="1" cellpadding="5" style="border-collapse: collapse;"> <tr><th>公司</th><th>职位</th><th>链接</th><th>发布时间</th></tr> """ for job in new_jobs: html_content += f""" <tr> <td>{job.get('company', 'N/A')}</td> <td><strong>{job.get('title', 'N/A')}</strong></td> <td><a href="{job.get('link', '#')}">查看详情</a></td> <td>{job.get('publish_date', 'N/A')}</td> </tr> """ html_content += """ </table> <p>详情请查看附件CSV文件。</p> </body> </html> """ msg.attach(MIMEText(html_content, 'html')) # 2. 构建并附加CSV文件 if new_jobs: df = pd.DataFrame(new_jobs) csv_buffer = df.to_csv(index=False).encode('utf-8-sig') # 处理中文编码 attachment = MIMEApplication(csv_buffer) attachment.add_header('Content-Disposition', 'attachment', filename=f'new_jobs_{datetime.now().strftime("%Y%m%d_%H%M")}.csv') msg.attach(attachment) # 3. 发送邮件 try: with smtplib.SMTP(smtp_config['smtp_server'], smtp_config['smtp_port']) as server: server.starttls() # 安全连接 server.login(smtp_config['username'], smtp_config['password']) server.send_message(msg) print("邮件发送成功!") except Exception as e: print(f"邮件发送失败: {e}")

2. 集成即时通讯工具:对于Telegram、钉钉、企业微信等,通常通过调用它们的Webhook或Bot API来实现。以钉钉群机器人为例:

import requests import json def send_dingtalk_message(webhook_url, new_jobs): """发送钉钉群机器人通知(Markdown格式)""" if not new_jobs: return title = f"📢 发现 {len(new_jobs)} 个新职位" text = f"### {title}\n\n" for idx, job in enumerate(new_jobs[:10], 1): # 最多显示10条,避免消息过长 text += f"{idx}. **{job.get('company')}** - [{job.get('title')}]({job.get('link')})\n" if len(new_jobs) > 10: text += f"\n> 还有 {len(new_jobs) - 10} 个职位未显示,请查看完整通知。" data = { "msgtype": "markdown", "markdown": { "title": title, "text": text } } headers = {'Content-Type': 'application/json'} try: resp = requests.post(webhook_url, data=json.dumps(data), headers=headers, timeout=5) if resp.json().get('errcode') != 0: print(f"钉钉消息发送失败: {resp.text}") except Exception as e: print(f"钉钉请求异常: {e}")

4.3 部署与长期运行方案

offercatcher在后台稳定运行,有以下几种常见方案:

方案一:云服务器 + Systemd/Cron(推荐)这是最稳定、最像生产环境的方式。购买一台低配的云服务器(如腾讯云、阿里云的轻量应用服务器),将项目部署上去。

  • 使用 Systemd 服务(Linux): 创建一个服务文件/etc/systemd/system/offercatcher.service

    [Unit] Description=Offercatcher Job Monitor After=network.target [Service] Type=simple User=your_username WorkingDirectory=/path/to/offercatcher Environment="PATH=/usr/local/bin:/usr/bin" ExecStart=/path/to/venv/bin/python /path/to/offercatcher/main.py Restart=always # 崩溃后自动重启 RestartSec=10 [Install] WantedBy=multi-user.target

    然后使用sudo systemctl start offercatcher启动,sudo systemctl enable offercatcher设置开机自启。

  • 使用 Crontab: 如果项目是单次运行脚本,可以用Cron定时触发。

    # 编辑当前用户的crontab crontab -e # 添加一行,每30分钟运行一次,并重定向日志 */30 * * * * cd /path/to/offercatcher && /path/to/venv/bin/python main.py >> /tmp/offercatcher.log 2>&1

方案二:本地电脑 + 计划任务(Windows)/ Launchd(Mac)适合不想购买服务器的用户,但需要保证电脑长期开机。

  • Windows:使用“任务计划程序”创建一个定时触发的基本任务,操作设置为启动你的Python脚本。
  • Mac:使用launchd创建守护进程,类似于Linux的Systemd。

方案三:使用云函数/Serverless对于有一定技术背景的用户,可以将抓取逻辑打包成云函数(如阿里云函数计算、腾讯云SCF),并配置定时触发器。这种方式无需管理服务器,按量计费,成本极低,但调试和依赖管理相对复杂一些。

实操心得:无论选择哪种部署方式,日志记录都至关重要。确保你的脚本将运行状态、抓取到的职位数量、错误信息等都输出到日志文件或日志服务中,方便后期排查问题。例如,可以使用Python内置的logging模块,配置同时输出到控制台和文件。

5. 常见问题排查与优化实录

即使代码写得再完善,在实际运行中也会遇到各种问题。下面是我在长期使用和调试offercatcher这类工具中积累的一些典型问题与解决方案。

5.1 抓取失败问题排查表

问题现象可能原因排查步骤与解决方案
请求返回403/404错误1. 网站反爬虫(检测到非常规UA或请求频率过高)
2. URL已失效或需要登录
3. 请求头不完整
1.检查并完善请求头:添加User-Agent,Referer,Accept-Language等,模拟浏览器。使用session保持会话。
2.降低请求频率:在请求间增加随机延时(如time.sleep(random.uniform(2, 5)))。
3.手动浏览器访问:确认URL在浏览器中可正常打开,无需登录。
解析器返回空数据,但页面在浏览器有内容1. 页面内容为JavaScript动态加载(SPA)
2. CSS选择器/XPath写错或已过时
3. 需要处理分页
1.判断是否为动态页面:查看网页源代码(Ctrl+U),搜索职位信息关键词。若源码中没有,则是动态加载。
2.使用Selenium:换用selenium配合WebDriverWait等待元素加载。
3.重新审查选择器:使用浏览器开发者工具(F12)的“检查”功能,重新定位元素并更新选择器。
能抓到数据,但重复通知同一个职位去重逻辑失效1.检查去重标识:确认用于生成signature的字段是否稳定唯一。优先使用职位ID,其次是“标题+公司”的组合。
2.检查历史存储文件:查看storage_file指定的JSON文件是否被正确读写,内容是否正常。
3.清理历史文件:有时文件损坏会导致去重失败,可以尝试备份后删除该文件,让系统重新生成。
邮件/通知发送失败1. 邮箱SMTP配置错误(密码、端口)
2. 网络问题或发送频率被限制
3. Webhook地址或Token错误
1.测试SMTP连接:写一个独立的测试脚本,只测试邮件发送功能。
2.查看错误日志:Python的smtplibrequests库会抛出具体的异常信息,根据提示排查。
3.检查接收端:确认Telegram Bot已添加到群组并获取了正确的chat_id,钉钉机器人Webhook地址无误。
程序运行一段时间后崩溃1. 内存泄漏(如Selenium驱动未关闭)
2. 未处理的异常导致进程退出
3. 依赖库版本冲突
1.完善异常捕获:在任务执行的最外层添加try...except,记录错误并继续下一个任务,避免整个程序崩溃。
2.资源清理:确保Selenium WebDriver在每次使用后调用driver.quit()
3.查看系统日志:使用journalctl -u offercatcher(Systemd服务)或直接查看程序输出的日志文件,定位崩溃前的最后一条错误信息。

5.2 性能与稳定性优化技巧

  1. 异步抓取提升效率:如果你的监控目标很多,顺序抓取会非常慢。可以考虑使用asyncioaiohttp库进行异步HTTP请求,能极大缩短整体抓取时间。但需要注意目标网站的并发压力,适当控制并发数。

  2. 引入代理IP池:对于反爬策略严格的网站,单一IP频繁请求容易被封。可以考虑使用付费或免费的代理IP服务,在请求时随机切换IP。实现时,可以构建一个代理IP列表,并在请求失败时自动切换。

  3. 配置热重载:每次修改配置文件都需要重启服务?可以实现一个信号监听或定期检查配置文件最后修改时间的功能,当发现配置变更时,自动重新加载配置,而无需中断正在运行的监控任务。

  4. 实现健康检查与告警:除了监控职位,你的监控程序本身也需要被监控。可以添加一个简单的“心跳”功能,定期向一个健康检查接口报告状态,或者发送“我还活着”的定时通知。如果长时间没有收到心跳,则说明程序可能已挂掉,需要触发更高级别的告警(如短信)。

  5. 数据持久化与备份:历史职位数据文件 (jobs.json) 是去重的关键。定期备份这个文件,或者考虑使用更轻量的数据库(如SQLite)来存储,可以提高读写效率和可靠性。

5.3 应对网站改版

招聘网站的前端改版是爬虫最大的天敌。应对策略如下:

  • 监控与告警:在抓取逻辑中,加入对“空结果”的检测。如果连续几次抓取某个目标都返回空数据,而你的选择器又没改过,那很可能是网站改版了。此时应触发一个紧急通知(如发送邮件到你的个人邮箱),提醒你手动检查。
  • 选择器冗余设计:为关键字段(如职位标题、链接)准备多个备选选择器。解析时按顺序尝试,直到有一个成功为止。这能在网站进行小幅调整时提供一定的容错能力。
  • 将解析规则外部化:不要将CSS选择器硬编码在代码里。可以将每个网站的解析规则(选择器、等待条件等)独立成一个配置文件(如parsers/company_a.yaml)。当网站改版时,你只需要更新这个配置文件,而无需修改主程序代码,甚至可以实现规则的动态加载。

搭建和维护一个属于自己的offercatcher,初期需要投入一些时间进行配置和调试,但一旦稳定运行,它将成为你求职路上一个无声却强大的助手。它能帮你从被动的信息搜寻者转变为主动的机会捕捉者。最重要的是,这个过程本身也是对Python自动化、网络请求、数据处理等技能的一次绝佳实践。当你收到第一封由自己编写的程序发来的职位推荐邮件时,那种成就感是无可替代的。开始动手,定制你的信息雷达吧。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/9 15:41:37

Sherlock AI Plugin:从论文到代码的智能研究助手实战指南

1. 项目概述&#xff1a;当AI成为你的研究侦探与工程师如果你和我一样&#xff0c;经常需要阅读前沿的学术论文&#xff0c;并试图将那些复杂的算法、模型或方法论转化为可运行的代码&#xff0c;那你一定体会过那种“望文生义”的挫败感。论文里的数学公式天书一般&#xff0c…

作者头像 李华
网站建设 2026/5/9 15:39:36

Rails AI上下文生成利器:声明式配置与ActiveRecord模型集成实践

1. 项目概述&#xff1a;一个为Rails应用注入AI上下文的利器如果你正在用Ruby on Rails开发应用&#xff0c;并且想集成AI能力&#xff0c;比如让ChatGPT帮你总结用户反馈&#xff0c;或者让Claude分析订单数据&#xff0c;那你肯定遇到过一个问题&#xff1a;怎么把应用里那些…

作者头像 李华
网站建设 2026/5/9 15:32:45

pypto.distributed 模块介绍

pypto.distributed 模块介绍 【免费下载链接】pypto PyPTO&#xff08;发音: pai p-t-o&#xff09;&#xff1a;Parallel Tensor/Tile Operation编程范式。 项目地址: https://gitcode.com/cann/pypto 1. 概述 pypto.distributed 模块提供了分布式场景下的共享内存通信…

作者头像 李华
网站建设 2026/5/9 15:31:46

AI驱动的自动化渗透测试智能体:架构、原理与红队实战应用

1. 项目概述&#xff1a;一个专为“红队”设计的自动化智能体最近在安全研究社区里&#xff0c;一个名为zack-dev-cm/hh-openclaw-agent的项目引起了我的注意。这个名字听起来有点神秘&#xff0c;但如果你对网络安全&#xff0c;特别是渗透测试和红队行动有所了解&#xff0c;…

作者头像 李华
网站建设 2026/5/9 15:28:52

基于MPC的以太坊RPC服务:构建去中心化签名与私钥安全管理方案

1. 项目概述&#xff1a;一个去中心化的MPC签名服务最近在跟几个做链上资管和DeFi协议的朋友聊天&#xff0c;大家都在头疼同一个问题&#xff1a;如何安全地管理多签钱包的私钥。传统的多签方案&#xff0c;比如Gnosis Safe&#xff0c;虽然解决了单点故障&#xff0c;但每次交…

作者头像 李华
网站建设 2026/5/9 15:22:35

CANN/pyasc Gather算子接口文档

asc.language.basic.gather 【免费下载链接】pyasc 本项目为Python用户提供算子编程接口&#xff0c;支持在昇腾AI处理器上加速计算&#xff0c;接口与Ascend C一一对应并遵守Python原生语法。 项目地址: https://gitcode.com/cann/pyasc asc.language.basic.gather(dst…

作者头像 李华