Nstproxy 现已升级为 Nstdata。了解此次变化。 周一至周五 09:00 - 18:00(UTC+08:00) 公司地址
19H MAXGRAND PLAZA NO.3 TAI YAU STREET SAN PO KONG, KOWLOON HONG KONG
©2026 NST LABS TECH LTD. 保留所有权利。Lena ZhouGrowth & Integration Specialist
如何构建一个用于公共职位数据的 We Work Remotely 爬虫
TL;DR
- 当最近的职位列表足够时,启动一个 We Work Remotely 抓取工具,使用官方公共 RSS 源。
- 保留原始职位网址,并根据 We Work Remotely 的源页面请求归属链接。
- 将职位的地理位置限制与该角色的远程性质分开。
- 仅当源未提供所需字段时,使用受限的、授权的细节页面工作流。
- 在将记录发布到职位板或提供给 AI 助手之前进行验证。
- Nstdata Crawl 是一个针对 LLM 准备的数据的网页爬虫 API,可以处理页面收集层;职位身份和资格规则仍然是你的应用程序的责任。
We Work Remotely 抓取工具的用途是什么?
We Work Remotely 抓取工具将允许的职位列表转换为招聘仪表板、研究管道或求职助手可以处理的记录。一个有效的记录将标题和地点限制与原始列表、收集时间和源连接起来。下载一个没有这些字段的描述会使得识别过期角色或解释为何助手推荐某职位变得困难。
最简单的实现从平台发布的源开始。官方 We Work Remotely RSS 指南 提供了一个通用源和类别源,并请求归属回源。这与在类别页面上猜测选择器是一个实质上不同的起点。
当你的授权工作流还需要渲染的细节页面或来自其他允许源的内容时,使用 Nstdata Crawl。将源获取和页面增强作为两个独立的步骤,以便渲染失败不会丢弃其他有效的源记录。
收集职位数据前需要什么?
你需要 Python、数据的批准使用、官方源网址、一个存储位置,以及一个明确的所需字段列表。下面的源示例使用 Python 标准库,并且不需要 WWR 账户或第三方抓取订阅。在将源转换为公共产品之前,请验证你意图重新分发的内容是否符合源的要求。
| 字段 | 意义 | 接受规则 |
|---|
source_url | 原始职位细节网址 | 存在,HTTPS,预期的源主机 |
source_id | 源 GUID 或网址 | 在此源内稳定 |
title | 源标题 | 非空;保留原始措辞 |
published_at | 发布者的时间戳 | 保留原始值和解析后的时间 |
observed_at | 你的收集时间戳 | 在摄取期间生成的 UTC 时间戳 |
region | 声明的招聘限制 | 保留缺失的值而不是猜测 |
|
description_html
不要从“远程”一词推断雇主的薪资范围、签证政策或全球资格。描述中可能包含标题省略的限制。在源实际提供支持文本之前,保持这些字段可为 null。
源发现与页面抓取有何不同?
源发现从出版商控制的 XML 文档获取最近条目;页面抓取读取网站的 HTML 或渲染文档。两者都可以生成职位记录,但它们的覆盖范围和维护成本有所不同。源可以是一个方便的发现来源,而不代表完整的历史档案。
在本文章的研究中,一般的 WWR 源返回的 RSS 项目包含 title、link、guid、pubDate 和 description 等字段。观察到的响应中存在其他字段,但客户端应能够容忍其缺失。稍后的源响应可能包含不同数量的条目,因此永远不要将样本计数硬编码为完整性保证。
在将源字段映射到你的职位架构时,使用 结构化数据验证。对于更广泛的系统,将 职位市场收集 与资格分类区分开。前者提供证据,后者解释证据,并应保持每个派生标签的可追溯理由。
如何逐步构建抓取工具?
通过获取官方源、规范一小组字段,并使用其源标识符保存记录来构建抓取工具。以下方法代表不同的收集需求;它们是替代方案或顺序阶段,而不是强制访问同一页面的三种方式。
步骤 1:保存源阅读器
将以下内容保存为 wwr_feed.py。该阅读器限制下载的响应大小、去重 ID,并在接受记录之前检查目标主机。它并不假定标题能够可靠地分割成公司和角色字段。
import json
import urllib.request
import xml.etree.ElementTree as ET
from datetime import datetime, timezone
from urllib.parse import urlsplit
url = "https://weworkremotely.com/remote-jobs.rss"
request = urllib.request.Request(url, headers={
"User-Agent": "JobFeedReader/1.0"
})
with urllib.request.urlopen(request, timeout=30) as response:
payload = response.read(5_000_001)
if len(payload) > 5_000_000:
raise RuntimeError("Feed exceeds this reader's size limit")
root = ET.fromstring(payload)
observed = datetime.now(timezone.utc).isoformat()
records, seen = [], set()
for item in root.findall("./channel/item"):
link = (item.findtext("link") or "").strip()
parts = urlsplit(link)
if parts.scheme != "https" or parts.hostname != "weworkremotely.com":
continue
identity = (item.findtext("guid") or link).strip()
title = (item.findtext("title") or "").strip()
if not title or identity in seen:
continue
seen.add(identity)
records.append({
"source_id": identity, "source_url": link, "title": title,
"published_at": item.findtext("pubDate"),
"observed_at": observed, "region": item.findtext("region"),
"description_html": item.findtext("description")
})
if not records:
raise RuntimeError("No accepted feed records; inspect the response")
with open("wwr-jobs.json", "w", encoding="utf-8") as output:
json.dump(records, output, ensure_ascii=False, indent=2)
print("accepted records:", len(records))
步骤 2:运行阅读器
在您的工作目录中运行 python wwr_feed.py。同样的解析器在准备本文时对实时 RSS 响应进行了测试。成功运行将创建一个 JSON 数组并报告一个正数的接受记录;确切的数字随着发布者更新其源而变化。
步骤 3:检查一个接受的记录
打开 wwr-jobs.json,并将记录的标题、网址和地区与其原始列表进行比较。在显示结果时保留原始源链接。如果源对于您的目的不完整,请在添加另一个集合阶段之前记录缺失的字段。
方法 2:添加经过授权的详细页面增强
步骤 1:选择缺失字段
选择一个源确实缺失的字段,例如结构化的就业类型。检查该页面是否提供机器可读的 JobPosting 属性,然后再编写可视选择器。模式词汇记录字段的含义;它并不确定 WWR 在每个页面上都会输出每个属性。
步骤 2:检查一个批准的详细页面
使用 开发者工具 → 元素 将页面的可见内容与任何 JSON-LD 脚本进行比较。记录该字段的源路径,并保留用于推导该字段的文本。在没有检查今天的标记的情况下,不要发布从旧教程复制的选择器。
![截屏:一个已批准的职位详细页面,显示招聘地区文本和相应的 DOM 或结构数据字段。]
步骤 3:单独存储增强
通过源网址将详细结果连接到源记录。包含 enrichment_status、enriched_at 和字段级证据引用。失败的增强应保持有效的源记录不变,并仅标记附加字段不可用。
方法 3:将 Nstdata Crawl 添加到收集工作流
步骤 1:获取当前请求配置
从 Crawl 产品页面 打开 Nstdata Crawl Playground,输入一个经过批准的详细网址,选择 Markdown 进行文本处理,并检查生成的请求。仅在所需内容需要 JavaScript 时配置呈现。使用页面限制和深度限制进行发现,而不是自动抓取整个职位板。
步骤 2:连接 API 客户端
安装 nstdata-ai-crawl,并在您的本地环境中设置 NSTDATA_API_TOKEN。以下包含的托管示例需要您自己的令牌和对 APPROVED_PAGE_URL 的授权;它并未使用客户凭证在 WWR 上执行。SDK 名称会与当前官方包进行检查。
import os
from pathlib import Path
from nstdata_ai_crawl import NstDataClient, ScrapeRequestDto
token = os.environ["NSTDATA_API_TOKEN"]
url = os.environ["APPROVED_PAGE_URL"]
with NstDataClient(token) as client:
result = client.submit_scrape_task_sync(ScrapeRequestDto(
url=url, formats=["markdown"], onlyMainContent=True, timeout=60000
))
if result.success is not True or result.status != "completed":
raise RuntimeError("Page retrieval was not completed successfully")
if result.data is None or result.data.truncated is True:
raise RuntimeError("Missing or partial content requires review")
text = result.data.get_markdown()
if not text or not text.strip():
raise RuntimeError("No usable Markdown returned")
Path("page.md").write_text(text, encoding="utf-8")
print("Saved page.md; validate its content before downstream use")
步骤 3:仅接受可用内容
确认任务完成,检查页面结果,并将返回的文本与目标列表进行比较。拒绝挑战页面、空描述和截断输出,然后再将内容传递给模型。记录任务 ID 以便于诊断,而不记录 API 令牌。
Nstdata Crawl 如何帮助职位数据?
当经过批准的职位数据管道需要一致的页面检索和 LLM 准备的文本超出源时,Nstdata Crawl 会提供帮助。这是一个用于 LLM 准备数据的 Web 爬虫 API,位于网址列表和您的规范化代码之间。站点发现和递归抓取可以在明确的边界内扩展允许的种子。JavaScript 渲染可以收集初始 HTML 中缺失的内容。该服务不会决定候选人是否符合角色的要求或授权重新发布职位描述。
- 输出选择: Markdown 支持有根据的摘要,HTML 支持源感知解析,链接支持发现。JSON、PDF 和视觉文物服务于不同的下游审阅需求;请求一种格式并不验证职位模式。
- 受管代理访问: Nstdata 内置的代理选项避免了标准受管请求的单独代理主机、端口、用户名和密码。代理流量仍然会影响成本;请查看当前的 Crawl 计费。
- 有限操作: 首先提交小作业,保留 ID 和任务结果,仅重试可恢复的失败。您的应用程序仍然负责去重、过期和存储。
职位源何以变得过时或产生重复?
当客户将滚动发现窗口视为完整库存或将重复观察与新发布混淆时,职位源会变得过时。消失的源条目并不证明雇主关闭了该角色。保持 first_seen、last_seen 和单独的可用性状态,以便不确定性保持可见。
| 症状 | 可能原因 | 修复 |
|---|
| 相同角色反复出现 | 每次轮询创建一行新记录 | 通过源 GUID 或标准源网址进行更新 |
| “全球”推荐是错的 | 远程状态替代地点限制 | 保留地区证据并要求明确的资格规则 |
| 成功的 HTTP 响应后没有记录 | 意外的文档、变化的馈送或解析器失败 | 检查内容类型和根元素;保留最后良好的数据集 |
| 摘要包括导航或说明 | 源文本被接受而没有验证 | 将输入限制为职位描述,并隔离不可信内容 |
您应该如何启动作业数据管道?
使用一个小的属性 RSS 数据集、经过验证的字段合同和明确的刷新政策启动管道。在添加丰富性之前,将接受的记录与发布者进行比较,并测量重复率、缺失字段率和记录年龄。一次成功的下载仅仅是可靠作业馈送的开始。
为了更广泛的收集,使用 有界批量爬取 将 URL 发现与详细页面处理分开。Nstdata 的 HTML 和视觉输出可以支持后续对提取失败的审查。
FAQ
问:我可以在没有浏览器自动化的情况下收集 WWR 职位吗?
可以。官方公共 RSS 源可以在没有无头浏览器的情况下提供最新的职位条目。在产品中使用之前,请检查覆盖范围和归属要求。
除非发布者明确记录历史完整性,否则应将馈送视为最近发现窗口。如果您需要时间序列,请前瞻性地存储允许的观察结果。
问:Nstdata Crawl 能保证访问每个职位页面吗?
不能。管理检索服务仍然受目标可用性、访问限制、渲染行为和您的授权影响。
不。缺失的补偿应保持为 null 或明确未知。零不正确地暗示一个已知的值,并扭曲分析。
一个有效的爬虫会生成有效的源链接记录,与手动检查的样本一致,保持刷新状态,并在不覆盖最后接受的数据集的情况下报告失败。
Lena Zhou
Nov. 9th 2026
支持 JavaScript 渲染,成功率达 99.8%
将任意网站转换为 Markdown、HTML、JSON、链接、PDF 等格式,无需管理爬取基础设施。