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
相关产品推荐
相关产品推荐

