尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
应届生求职网职位信息函数化爬取:从请求封装到数据清洗的完整教程
各位折腾求职信息的小伙伴今天把一套我自己用来抓公开校园招聘数据的完整思路和代码整理出来。核心就一句话应届生求职网职位信息函数爬取拆成一个个函数出了错单独改反爬应对起来也稳得一比。我最早写这个脚本是因为手里的招聘信息分散在好几个平台手动搜太累筛选也没法统一。后来干脆写了个爬虫把公开页面里的职位名称、公司、城市、薪资、学历、经验要求都抽出来存成表格再用透视表筛意向岗位整个过程顺手了很多。这篇笔记适合刚接触爬虫的求职者也适合想把爬虫规范化的初学者做的是公开信息抓取和数据整理不碰任何需要登录才能看的内容。1. 爬取之前先把需求和思路定下来1.1 应届生求职为什么需要“聚合同类信息”校招季的信息量其实非常大但绝大多数时候不是信息不够而是这些信息被拆散在各个招聘入口里。有的公司只在自家官网发职位有的会同步到多个公开招聘站还有一部分岗位挂在学校的就业信息平台上。应届生如果每天只是挨个网站搜索“前端”“产品”“运营”时间花了反而容易漏掉匹配度高的机会。我就经历过一次比较典型的场景目标城市是某新一线城市想找数据分析方向的校招岗位。单独看某个网站前几页翻完发现符合条件的职位就几十个而且还夹杂了大量实习、社招岗位。后来把几个公开渠道的职位信息统一抓下来按城市、学历要求、薪资区间和发布时间做筛选半小时就能筛出一份适合自己的投递清单。这就是聚合同类信息的价值也是这个项目最原始的出发点。1.2 项目目标与功能拆解这个爬虫项目要做的事可以拆成几个很明确的小目标从公开职位列表页抓取职位名称、公司名称、工作城市、薪资文本、学历要求、经验要求、发布时间、详情页链接。对抓取到的原始文本做清洗比如去掉多余空格、统一薪资格式、补全缺失字段。按职位、公司、城市三个字段去重防止同一岗位被多次下载后重复入表。最后把有效数据写入本地文件方便用表格软件进一步筛选和分析。从功能上看整套流程分五块请求下载、页面解析、数据清洗、去重保存、主流程调度。我特意把这五块都写成了独立函数而不是挤在一个大循环里。这样做最大的好处是某个环节报错时只需要单独调试那个函数不需要把整个脚本翻一遍。这也是标题里“函数爬取”的来历用函数把爬虫的每一段逻辑都收拢起来整体结构清楚跑起来也更稳定。1.3 技术选型背后的逻辑我选的是 Python 里最常规的一套组合requests 负责发 HTTP 请求BeautifulSoup 加 lxml 解析 HTML正则表达式处理复杂字段csv 模块或者 pandas 做存储。先解释为什么用 requests 而不是更底层的 urllib。requests 的 API 设计对新手更友好session 对象能维持 Cookieheaders 可以按字典传超时和重试设置也简单。更重要的一点是招聘网站的页面结构变化频繁用 requests 加解析库这种组合页面一改版最多改改选择器不用推翻重来。解析部分BeautifulSoup 和 lxml 可以配合使用。BeautifulSoup 查节点方便lxml 的解析速度更快。对于职位卡片这类重复结构先用 soup.select() 定位到每一个卡片容器再在容器内部提取具体字段后面用 XPath 还是 CSS 选择器就看哪个写起来顺手。数据清洗为什么单独成模块因为页面里拿到的薪资文本往往是“10K-15K·13薪”“面议”之类的字符串直接存进表格没法排序。只有清洗成数字区间才能做后续的区间筛选。2. 核心细节拆解请求、解析与函数封装2.1 请求头伪装与 Cookie 的取舍招聘类站点对爬虫的识别比很多普通网站要敏感因为它不想让职位数据被大量抓走后做成付费服务。最常见的检测方式就是看 User-Agent。一个缺失 UA 的请求很容易被服务器直接判定为异常客户端第一步就被拒绝了。所以我会先在浏览器控制台里把完整的请求头复制出来至少包含这几项User-Agent模拟 Chrome 或 Edge 浏览器不要用 Python 默认的 requests 标识。Referer从哪个页面发起的请求就填哪个页面防止被识别为直接访问资源。Accept-Language保持和浏览器一致的 zh-CN避免返回异常页面。另一个容易被忽略的点是 Cookie。有些职位列表第一次访问时会种一个 sessionId 或反爬用的标记如果每次请求都重新建立连接后续翻页可能拿到完全一样的验证页。我用 requests.Session() 来保存 Cookie第一次先访问首页“暖一下”会话再带着上一次的 Cookie 继续访问列表页实测下来通过率会高不少。如果遇到需要登录才能查看完整职位的站点我的原则是直接放弃不做登录态爬取原因后面会在合规部分细说。2.2 动态加载数据的两种拿法现在的招聘网站很少是纯静态页面职位列表大多是异步加载出来的。这里有两种情况处理方式完全不同。第一种情况职位数据直接渲染在 HTML 里按 F12 查看元素能看到完整内容。这种最简单直接用 BeautifulSoup 解析即可不用额外处理。第二种情况页面只显示一个骨架屏职位数据是浏览器通过 XHR 或 fetch 从后台接口拿回来的。这时候如果直接拿 response.text解析结果会是空列表。我的判断方法是按 F12 打开开发者工具切到“网络”面板刷新页面后搜索职位名称关键词很快就能定位到真正的数据接口。接口返回的通常是 JSON 结构字段命名往往和页面上展示的完全一致比如 jobName、companyName、salaryDesc。遇到接口型页面我更喜欢直接解析 JSON因为不用处理 HTML 结构变化。代码逻辑也会更短import json import requests def parse_json_response(text): data json.loads(text) job_list data.get(data, {}).get(list, []) return [ { job_name: item.get(jobName), company: item.get(companyName), city: item.get(cityName), salary_text: item.get(salaryDesc), } for item in job_list ]这里有个调试技巧不确定页面是 HTML 还是接口加载时先把 response.text 保存成本地文件打开看一眼开头的内容结构。如果看到的是大括号包裹的 JSON就去接口解析流程如果看到的是标签就走 HTML 解析流程。比靠猜靠谱得多。2.3 解析字段CSS 选择器与 XPath 怎么选页面结构不同解析方式也不同。对于职位卡片这种“重复结构”我的习惯是用 CSS 选择器先框住父容器再在容器内用 find 系列方法提取字段。假设一个公开职位的 HTML 结构类似下面这样实际页面以你抓取到的为准这里只是演示div classjob-item h2 classjob-titlea href/job/12345Python 后端开发工程师/a/h2 span classcompany-name某科技有限公司/span span classcity上海/span span classsalary12K-18K/span span classexperience在校生/应届生/span span classeducation本科/span span classpublish-time2025-06-10/span /div对应解析代码可以写成from bs4 import BeautifulSoup def parse_jobs(html): soup BeautifulSoup(html, lxml) job_items soup.select(div.job-item) jobs [] for item in job_items: title_tag item.select_one(h2.job-title a) company_tag item.select_one(span.company-name) city_tag item.select_one(span.city) salary_tag item.select_one(span.salary) exp_tag item.select_one(span.experience) edu_tag item.select_one(span.education) time_tag item.select_one(span.publish-time) jobs.append({ job_name: title_tag.get_text(stripTrue) if title_tag else , detail_url: title_tag.get(href) if title_tag else , company: company_tag.get_text(stripTrue) if company_tag else , city: city_tag.get_text(stripTrue) if city_tag else , salary_text: salary_tag.get_text(stripTrue) if salary_tag else 面议, experience: exp_tag.get_text(stripTrue) if exp_tag else , education: edu_tag.get_text(stripTrue) if edu_tag else , publish_time: time_tag.get_text(stripTrue) if time_tag else , }) return jobs使用 stripTrue 的原因是页面上经常会有一堆换行、缩进和全角空格不去除的话存表里会出现莫名其妙的缩进。如果发现 get_text() 拿到的文本特别乱还可以用正则里的 re.sub(r\s, , text) 再做一次规整。字段取值尽量给一个兜底值比如薪资字段为空时填“面议”这样后续清洗逻辑能针对统一的值处理。2.4 函数封装设计让每一段逻辑可以单独测试这个项目的核心风格是“函数化”。我的设计分成五个函数get_page(url, session, params)负责请求返回 HTML 文本或 JSON 文本。parse_jobs(html_or_json)负责解析返回结构统一的字典列表。clean_jobs(raw_list)负责清洗和去重返回有效职位列表。save_to_csv(jobs, filename)负责存储。main()负责把前面几个函数按顺序串起来。为什么要这样设计我有一个很真实的体感爬虫项目 90% 的错误都不是代码逻辑难题而是页面结构变了、某个字段没了、服务端返回了一段异常文本。如果所有代码堆在一起出问题时先要人肉定位是哪一行抛的异常。而把所有逻辑做成独立函数后main() 里每个步骤都分开哪一步挂了立即能定位。设计函数时有几个小规则我也一直在用每个函数只做一件事函数内部不要顺手打印一堆调试信息异常处理要放在函数内部不要让异常直接中断整个翻页循环函数返回值尽量用统一的结构比如解析函数永远返回“字段齐全的字典列表”清洗函数永远返回“清洗后的字典列表”。这样每个函数都可以单独拿测试数据来跑不必每次都发真实请求。3. 完整实操代码怎么写、怎么跑、怎么调3.1 准备环境与依赖安装实操前先把环境装好。我用的是 Python 3.10 以上版本依赖库用 pip 安装pip install requests beautifulsoup4 lxml pandaspandas 不是必须的如果你习惯用 csv 模块也可以不装。我装 pandas 是为了后面做数据透视方便存储时用 to_csv() 一行搞定还不容易乱码。再准备一个浏览器 User-Agent 列表。不用专门安装随机 UA 库因为那个库偶尔会请求外部数据源反而可能拖慢程序。自己从浏览器复制两三条主流 UA 存成列表运行前用 random.choice() 随机选一条效果足够import random USER_AGENTS [ Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36, Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15, Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) Gecko/20100101 Firefox/125.0, ]3.2 请求模块实现超时、重试与随机延时请求函数是整个爬虫的命门。如果这里不考虑稳定后面解析再漂亮也没用。我实现时会带上超时、重试和随机延时具体代码如下import time import random import requests def get_page(url, session, paramsNone, retries3): headers { User-Agent: random.choice(USER_AGENTS), Referer: https://example.com/, Accept-Language: zh-CN,zh;q0.9, } for attempt in range(retries): try: resp session.get(url, headersheaders, paramsparams, timeout10) if resp.status_code 200: return resp.text elif resp.status_code in (403, 429): wait_time 5 * (attempt 1) print(f请求被限流等待 {wait_time} 秒后重试) time.sleep(wait_time) else: print(f状态码异常{resp.status_code}) except requests.exceptions.RequestException as e: print(f第 {attempt 1} 次请求失败{e}) time.sleep(2) return 里面有几个关键点。timeout 必须设置否则遇到服务端不响应时程序会一直挂着。状态码 403 和 429 分别代表“拒绝访问”和“请求过于频繁”这时候不能立刻重试需要退避等待。网络层面的 RequestException 通常不是服务器真的拒绝而是连接被重置或超时这种可以间隔两秒重试一般第二次就能成功。翻页时的延时也不能省。我在每页之间加了 random.uniform(3, 6) 秒的随机等待。不要写成固定 sleep(3)因为固定间隔会被反爬系统通过请求时间规律识别出来随机间隔更像人在手动翻页。3.3 解析模块实现HTML 与 JSON 双模式为了适配不同站点解析函数可以同时兼容 HTML 和 JSON 两种输入。判断方法就是看传入文本的第一个非空字符是不是 {import json from bs4 import BeautifulSoup def parse_jobs(text): if text.strip().startswith({): return parse_json_jobs(text) return parse_html_jobs(text) def parse_html_jobs(html): # 同上一节中的 parse_jobs 实现这里不再重复 pass def parse_json_jobs(text): try: data json.loads(text) except json.JSONDecodeError: return [] job_list data.get(data, {}).get(list, []) jobs [] for item in job_list: jobs.append({ job_name: item.get(jobName, ), company: item.get(companyName, ), city: item.get(cityName, ), salary_text: item.get(salaryDesc, 面议), experience: item.get(jobExperience, ), education: item.get(jobDegree, ), publish_time: item.get(publishTime, ), detail_url: item.get(jobDetailUrl, ), }) return jobs这样写的收益是如果同一个站点既有 HTML 版又有接口版一个解析函数就能一并处理。注意 JSON 里的字段名各站点并不相同我第一次抓的时候以为所有接口都叫 jobName结果有个接口叫 positionName解析结果全是空。遇到这种情况先把 JSON 在本地格式化打印一遍再用实际字段名修改代码。3.4 清洗与去重逻辑把脏数据变成能用的表解析出来的数据还比较粗糙尤其是薪资和空值。清洗函数我会针对几个高频问题处理。薪资处理把“12K-18K”“12k-18k·13薪”“10-15K”这类文本统一变成数字区间。核心逻辑是用正则抽取所有带 k 或 K 的数字再交出去重后的前两位import re def parse_salary(salary_text): if not salary_text: return None, None nums re.findall(r(\d(?:\.\d)?)\s*[kK], salary_text) if len(nums) 2: return float(nums[0]), float(nums[1]) if len(nums) 1: return float(nums[0]), float(nums[0]) return None, None解析完我会再写一个清洗函数把全角空格、换行符、URL 里的多余参数都清掉。字段缺失的补默认值比如城市缺失时填“未知”。接着按“职位名 公司名 城市”三个字段拼接键值去重。为什么要用这三个字段因为同一个公司在同一城市投放的同一个职位很可能在分页中被反复抓取到用这个组合能去重得很干净。3.5 多页抓取与调度主函数串联全部逻辑翻页逻辑要根据实际站点的 URL 规律来写。有的网站是 ?page1、?page2 的形式有的接口用 ?cursorxxx 游标有的靠点击“加载更多”触发。对于最常见的 page 参数主函数可以这样写def main(start_page1, max_page20): session requests.Session() session.get(https://example.com/jobs, timeout10) all_jobs [] for page in range(start_page, max_page 1): url fhttps://example.com/jobs?keyword应届生page{page} text get_page(url, session) if not text: print(f第 {page} 页返回为空停止翻页) break jobs parse_jobs(text) if not jobs: print(f第 {page} 页无职位数据停止翻页) break all_jobs.extend(jobs) print(f第 {page} 页抓取 {len(jobs)} 条累计 {len(all_jobs)} 条) time.sleep(random.uniform(3, 6)) cleaned_jobs clean_jobs(all_jobs) save_to_csv(cleaned_jobs, jobs.csv) print(f清洗后保留 {len(cleaned_jobs)} 条有效职位)翻页停止条件我设置了两个某页返回空白或者某页解析出的职位数为 0。大部分招聘站翻到最后一页后不会停在准确页数上而是返回空列表或者重复首页内容。如果不设停止条件只是写 for page in range(1, 999)不仅浪费时间还容易触发反爬。3.6 数据保存Excel 打开不乱码的关键保存数据我优先用 CSV 格式因为通用、稳定、打开方便。但要记住一个坑直接用 open(jobs.csv, w, encodingutf-8) 存中文用 Excel 打开时大概率乱码。正确做法是使用 utf-8-sig 编码让 Excel 能正确识别import csv def save_to_csv(jobs, filename): if not jobs: print(没有数据可保存) return fieldnames list(jobs[0].keys()) with open(filename, w, encodingutf-8-sig, newline) as f: writer csv.DictWriter(f, fieldnamesfieldnames) writer.writeheader() writer.writerows(jobs)如果你习惯用 pandas可以写 jobs_df.to_csv(filename, indexFalse, encodingutf-8-sig)效果一样。保存之后用表格软件打开检查一遍重点看薪资字段是否被正确拆分成了数值城市字段有没有出现乱码。4. 运行效果与数据长什么样我这边跑完一次完整流程得到了一个比较规整的表格。这里只放几条脱敏后的演示数据供参考职位名称公司城市最低薪资(K)最高薪资(K)经验要求学历要求发布时间Python 开发实习生某网络科技公司上海1015在校生/应届生本科2025-06-10数据分析师某数据处理公司北京1218应届生硕士2025-06-09前端开发工程师某软件公司深圳1116应届生本科2025-06-08产品助理某互联网公司杭州812在校生/应届生本科2025-06-07拿到这个表之后我经常做的事是先用 Excel 的筛选功能按城市过滤再按最高薪资降序排序。这样能快速看出目标城市里哪些岗位给得相对大方哪些岗位的学历要求自己够得着。如果想更进一步可以在 clean_jobs() 里加一个字段用“最低薪资”和“最高薪资”的平均值作为排序字段筛选起来会更方便。运行过程中控制台会一页一页打印抓取条数和累计条数。我一般会顺手把多个关键词的结果分别存成不同 CSV比如 jobs_python.csv、jobs_data.csv。这样后面看某一个方向的机会时不用在一张大表里反复过滤。抓取频率控制在每页间隔 4 秒左右跑 20 页大约需要两分钟整体过程稳定基本不需要人工干预。5. 常见问题与排查技巧实录5.1 请求被拒绝状态码 403、418、429这几个状态码我全都遇到过。403 通常表示服务端识别出请求来自脚本常见原因是 UA 不对或者缺少 Referer。418 是服务端故意返回的“我是茶壶”状态多用于反爬提示。429 代表请求太频繁被限流了。我的排查顺序是先看是不是随机 UA 没生效再看是不是没带 Cookie最后看请求频率是不是太高。如果只是偶尔出现 403加一个随机延时就能缓解。如果持续 403就要重新进浏览器复制最新的请求头因为网站更新了检测规则。不要硬怼把频率降下来大多数公开站点不会真正封死。5.2 解析结果为空先怀疑页面结构变了解析结果为空是最隐蔽的问题因为代码没有报错只是返回空列表。比较常见的原因是页面结构调整CSS 选择器失效。另一种情况是请求被重定向到了验证页面你解析的其实是验证码页面。我的调试手段是写一个很简单的调试分支在 get_page() 返回后先判断文本里是否包含职位列表关键词比如“job-item”。如果不包含直接把前 500 个字符打印出来看一眼到底返回了什么。更直接的办法是把 response.text 保存成 debug.html用浏览器打开看看人眼看到的页面和代码解析的是不是同一个内容。这个方法能解决 80% 的“为什么解析不出数据”问题。5.3 遇到验证码怎么办验证码是招聘类站点最常用的反爬手段之一。遇到这种情况我的建议很明确不要写代码去自动化识别验证码也不要找第三方打码平台。一方面识别成功率不稳定另一方面容易突破网站访问限制超出个人学习用途的边界。我的做法是把遇到验证码的页面单独跳过控制整体请求频率让随机延时更长等一段时间再跑。如果某个站点几乎每一步都要验证码那说明它对自动化非常敏感换一个公开数据入口会更明智。爬虫的目的是拿到职位信息不是和一个反爬系统死磕。5.4 中文乱码问题中文乱码一般出现在两个地方。第一是控制台打印乱码这个是终端编码问题不用太在意。第二是 CSV 文件用 Excel 打开后乱码这个通常是保存时的编码不对。解决办法是保存时用 encodingutf-8-sig。如果是从接口拿数据遇到乱码可以在请求响应后手动指定编码resp.encoding resp.apparent_encodingapparent_encoding 是根据内容自动推断出来的编码针对一些没有在响应头里声明 charset 的接口很管用。5.5 常见问题速查表问题现象可能原因解决方案请求返回 403缺少浏览器请求头补充 User-Agent 和 Referer请求返回 429请求频率过高增加随机延时降低并发解析结果为空页面结构改版或返回了验证页保存响应内容到 HTML 排查CSV 中文乱码保存编码不是 utf-8-sig改为 utf-8-sig数据重复分页抓取存在重复职位按职位公司城市去重薪资数据没法排序薪资为“面议”或不可比较文本用正则转成数值区间6. 合规边界与我的实操心得写爬虫这件事最容易被忽略的是边界问题。我这套代码从头到尾只爬公开信息不需要登录账号也不采集任何个人联系方式数据频率控制在人类浏览的节奏。如果你要爬的站点设置了 robots.txt 限制或者用户协议明确禁止批量抓取那就不要拿来挑战更不要抓到的数据拿去做商业产品自己的学习筛选用途风险可控。关于稳定性我一直觉得“函数化”是爬虫项目里性价比最高的设计。所有逻辑拆成函数之后页面改版只需要改解析函数请求被限流只需要改请求函数表格字段要调整只需要改清洗函数完全不用动主流程。这也是标题里“稳得一比”的真正来源。我第一次写爬虫时把所有代码堆在一起出了错真的会头皮发麻改成函数化之后问题定位和修复速度快了非常多。最后分享一个我一直在用的小技巧跑完一轮抓取后不要马上把控制窗口关掉先看一眼最后一页的打印信息。正常情况应该是“第某页无职位数据停止翻页”。如果某页返回空但前面页码累计数还在增加说明程序捕获到了数据但可能被限流。这个时候再补跑一轮即可csv 文件里的数据不会受影响因为保存前会按主键去重重复数据不会覆盖已有内容。这套脚本虽然目标很单一但把请求、解析、清洗、存储、调度都做成了可复用的模块换一个公开数据源时只需要改解析函数和字段映射就能快速适配新的页面结构。
RELATED

相关推荐

C语言期末305道题高效刷题指南:从分诊到考场

C语言期末305道题高效刷题指南:从分诊到考场

简介:这份资源是面向高校学生的C语言期末备考题库,以PDF形式提供305道题目及详细解析,适合正在准备C语言期末考试、需要系统刷题与查漏补缺的学习者。题库覆盖选择题、填空题、判断题、读程序写结果以及压轴编码大题等经典题型,内…

📅 2026/10/16 0:56:27
Informatica调度体系深度解析:Workflow、Worklet与Scheduler协同机制

Informatica调度体系深度解析:Workflow、Worklet与Scheduler协同机制

1. Informatica 不是“点几下就能跑通”的黑盒子,而是一套需要理解数据流逻辑的ETL调度中枢很多人第一次接触 Informatica PowerCenter,是在某次项目交接会上听到“调度任务挂了”“工作流没触发”“源库连不上但日志里只写了个ERROR_CODE102”。那一刻&…

📅 2026/10/16 0:56:27
最大似然估计MLE全攻略:从数学原理到工程实践

最大似然估计MLE全攻略:从数学原理到工程实践

1. 先从一次“猜箱子”说起:最大似然估计到底在做什么我赌你第一次接触最大似然估计的时候,跟我一样,盯着教材上那一串连乘公式发呆——L(θ)∏P(xᵢ|θ),看着看着就困了。后来我换了个角度理解它,一下就通了&#xff…

📅 2026/10/16 0:56:27
MORE NEWS

更多资讯

📰

用 N_m3u8DL-RE 完整下载 DASH/HLS 流媒体

用 N_m3u8DL-RE 完整下载 DASH/HLS 流媒体 【免费下载链接】N_m3u8DL-RE Cross-Platform, modern and powerful stream downloader for MPD/M3U8/ISM. English/简体中文/繁體中文. 项目地址: https://gitcode.com/GitHub_Trending/nm3/N_m3u8DL-RE N_m3u8DL-RE 是一款 …

📰

FreeRTOS内存泄漏诊断:从堆监控到分配追踪的实战方法

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

lolPing房间如何做到端到端加密:scrypt、AES-256-GCM与Nostr中继全解析

【免费下载链接】lolPing League of Legends ping wheel for your Windows desktop. Hold Alt, drag, and ping anywhere, with the original animations and sounds. 项目地址: https://gitcode.com/gh_mirrors/lo/lolPing 点击查看 免费下载 lolPing 是一款让《英…

📰

Python对象引用机制详解:告别‘指针’误区

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

ixrail AgentPay是什么:在VS Code里给AI Agent装上钱包与预算的完整指南

【免费下载链接】ixrail Chaos 项目地址: https://gitcode.com/gh_mirrors/by/ixrail 点击查看 免费下载 ixrail AgentPay 是一款 VS Code 扩展,它为本地 AI Agent 提供钱包与预算管理:通过 x402 支付协议与 USDC 稳定币结算,让 …

📰

SAP Fiori Elements实战:从CDS注解到RAP应用开发全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬