You need to enable JavaScript to run this app. Scrapy爬取Upwork职位数据格式混乱,如何扁平化嵌套JSON结果
优惠活动
大模型
产品
解决方案
定价
更多

Scrapy爬取Upwork职位数据格式混乱,如何扁平化嵌套JSON结果

Upwork爬取Angular嵌套混杂数据的处理方案

现有爬取逻辑的核心问题

你当前使用的jobs = response.xpath("//div[@class='m-md-bottom d-none d-lg-block']").getall(),本质是选到了页面渲染完成后的外层展示容器,根本没有定位到真正存储职位结构化数据的源头节点。Upwork是Angular驱动的单页应用,首屏加载时会把全量职位列表数据序列化后直接塞在页面的内联脚本块里,你爬的这个div只是这些JSON数据渲染完挂在DOM上的展示壳子,自然会混着一堆转义字符、嵌套HTML标签,完全没法直接用。

优先方案:直接调整爬取逻辑拿源头结构化数据

与其事后费劲拆解混杂的HTML字符串,不如直接把选择器对准内嵌的初始化JSON块,从源头拿到干净的结构化数据,比事后规整效率高太多:

  • 第一步,换掉原来的div选择器,直接定位存储职位数据的内联脚本:
    可以用这个匹配规则:response.xpath('//script[contains(text(), "jobSearchResults") or contains(text(), "window.__APOLLO_STATE__")]/text()').get()
    这类脚本块是纯文本存储,没有混着渲染后的HTML标签,Upwork会把首屏所有职位的标题、预算、技能要求、项目描述全量存在这里,比爬DOM节点干净得多。
  • 第二步,提取纯JSON做解析:
    先把文本开头类似window.xxx = 的赋值前缀剥掉,如果直接json.loads()报转义错误,先调用html.unescape()把串里的HTML实体(比如"、\u0026、\/这类被转义的字符)全部解码,再解析就能直接拿到规整的职位字段,根本不需要拆DOM拼数据。

备用方案:已拿到混杂转义字符串的规整流程

如果暂时不想改现有爬取逻辑,手里已经攒了一堆混着HTML标签、嵌套转义JSON的字符串,可以按下面的步骤扁平化处理:

  • 先做全量HTML解码:用Python标准库的html.unescape()把字符串里所有被转义的HTML标签、引号、特殊字符全部还原,先消掉一层嵌套转义。
  • 正则定位核心JSON块:用带职位特征字段的正则(比如匹配jobTitle、hourlyBudget这类固定字段的前后边界),把藏在HTML标签缝隙里的职位数据JSON单独抠出来,跳过没用的导航、推荐位的冗余HTML。
  • 二次处理转义:把抠出来的JSON块里多余的转义反斜杠(比如把\"还原成")处理干净,再用json.loads()解析成字典结构。
  • 清理残留HTML:对字典字段里还带着HTML标签的职位描述内容,用BeautifulSoup的get_text()提取纯文本,去掉冗余标签。

提醒下:Upwork的DOM类名是动态生成的,隔几个版本就会随机调整类名后缀,靠爬渲染后div的逻辑稳定性很差,优先抓内嵌初始化JSON的方案,不仅数据干净,也不容易因为页面改版失效。


内容的提问来源于stack exchange,提问作者monicab

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.03 12:27:04