You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Scrapy爬虫框架持续跟踪链接?SCP wiki爬取报错如何解决

问题原因

报错的核心是你写的下一页链接XPath选择器不稳定,部分SCP条目页面的结构和你预设的路径不匹配,导致response.xpath(...).get()返回了None,直接拿字符串和None做拼接操作就触发了类型错误。

同时你现有代码还存在两个可优化的问题:

  • 手动拼接域名的操作完全多余,response.urljoin本身就支持自动补全相对路径的域名,重复拼接反而可能导致URL异常
  • 提取字段的XPath用了全局搜索语法//,就算你在scp选择器下调用也会全局匹配内容,不符合预期,应该改为相对路径前缀.//
修复方案

你可以直接使用修正后的代码:

import scrapy

class QuotesSpider(scrapy.Spider):
    name = "scp"
    start_urls = [
        'https://scp-wiki.wikidot.com/scp-002',
    ]

    def parse(self, response):
        for scp in response.xpath('//*[@id="main-content"]'):
            yield {
                'title': scp.xpath('.//*[@id="page-content"]/p[1]').get(),
                'tags': scp.xpath('.//*[@id="main-content"]/div[4]').get(),
                'class': scp.xpath('.//*[@id="page-content"]/p[2]').get(),
                'scp': scp.xpath('.//*[@id="page-content"]/p[3]').get(),
                'desc': scp.xpath('.//*[@id="page-content"]/p[6]').get(),
            }
        # 优化下一页选择逻辑,优先匹配导航区的下一页链接,同时加非空判断
        next_page = response.xpath('//div[contains(@class, "page-tags") or contains(@class, "pager")]//a[contains(text(), ">") or contains(text(), "下一页")]/@href').get()
        if next_page:
            # 直接用urljoin处理,不需要手动拼接域名
            next_page = response.urljoin(next_page)
            print(next_page)
            yield response.follow(next_page, callback=self.parse)

如果部分特殊页面还是匹配不到下一页链接,你可以根据实际页面结构调整XPath的匹配规则,只要保留非空判断逻辑就能避免报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 18:30:01