You need to enable JavaScript to run this app. Scrapy提取的可访问URL被Apache Nutch1.18判定格式错误如何修复
优惠活动
大模型
产品
解决方案
定价
更多

Scrapy提取的可访问URL被Apache Nutch1.18判定格式错误如何修复

问题根因与修复方案

1 核心错误1:提取字段类型错误

response.css().extract()方法返回的是匹配结果的列表,而非单个URL字符串。你直接将列表存入items['link'],后续将列表传入URL校验逻辑时,urlparse无法解析列表类型的输入,直接判定为无效。
修复方案:
如果每个页面对应唯一目标链接,将提取代码修改为extract_first()获取单个字符串:

# 原代码
# link = response.css('dd.details__item.details__item--long a::attr(href)').extract()
# 修改后代码
link = response.css('dd.details__item.details__item--long a::attr(href)').extract_first()

如果单页存在多个链接,后续遍历列表逐个处理即可。

2 核心错误2:相对路径未补全为绝对路径

网页源代码中的href通常是省略域名、协议头的相对路径(比如/project/1001),浏览器访问时会自动基于当前父页面的域名补全为完整可访问的URL,但爬虫不会自动做该处理,因此urlparse校验时会识别到scheme、netloc为空,判定为格式错误。
修复方案:
使用Scrapy内置的response.urljoin()方法自动拼接相对路径为合法绝对URL:

link = response.urljoin(response.css('dd.details__item.details__item--long a::attr(href)').extract_first())

3 历史存量JSON修复方案

如果你不想重新爬取数据,可以直接在解析JSON的环节完成类型修正+路径补全,示例代码如下:

from urllib.parse import urljoin
import simplejson

if __name__ == '__main__':
    print('starting link extraction')
    # 替换为你爬取的目标站点根域名
    BASE_SITE_URL = "https://你爬取的站点域名.com"
    fname = "aifos.json"
    with open(fname, "r", encoding='utf-8') as f:
        json_data = simplejson.load(f)

    all_links =[]
    for item in json_data:
        # 修正列表类型问题
        raw_link = item['link']
        if isinstance(raw_link, list) and len(raw_link) > 0:
            raw_link = raw_link[0]
        # 补全绝对路径
        full_link = urljoin(BASE_SITE_URL, raw_link)
        all_links.append(full_link)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 15:06:01