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

如何让Scrapy爬虫仅抓取起始URL?

解决方案

方法一:改用普通Spider类

CrawlSpider 本身是为批量爬取、自动跟进链接设计的,如果你只需要抓取起始URL,直接用 Scrapy 的基础 Spider 类更简单——它默认只会处理 start_urls 里的地址,不会自动跟进任何链接:

from scrapy.spiders import Spider

class Spider(Spider):
    name = 'spider'
    user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'

    def __init__(self, mode, *args, **kwargs):
        if mode == 'scan':
            self.start_urls = ['https://www.example.com/']
            self.custom_settings = {
                'COMPRESSION_ENABLED': True,
                'URLLENGTH_LIMIT': 100,
                'DOWNLOAD_DELAY': 1
            }          
        elif mode == 'crawl':
            # 原有爬取逻辑
            pass
        super().__init__(*args, **kwargs)

    def parse(self, response):
        # 这里写入你原parse_obj函数里的页面处理逻辑
        pass

方法二:修复现有CrawlSpider的问题

如果坚持要用 CrawlSpider,你的代码存在两个可能的问题,对应修正方式如下:

  1. 规则初始化时机错误:CrawlSpider 父类初始化时会提前读取 rules 生成链接提取器,你在子类 __init__ 里设置 rules 后再调用 super(),会导致父类无法正确识别你的规则。需将 rules 赋值放在 super() 之前。
  2. 回调函数主动生成请求:检查你的 parse_obj 函数,是否手动 yield 了新的 Request 对象?哪怕 follow=False,这类手动生成的请求仍会被执行,需要删除相关代码。

修正后的 CrawlSpider 示例:

from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor

class Spider(CrawlSpider):
    name = 'spider'
    user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'

    def __init__(self, mode, *args, **kwargs):
        if mode == 'scan':
            self.start_urls = ['https://www.example.com/']
            # 用LinkExtractor(allow=()) 明确表示不提取任何页面链接
            self.rules = (Rule(LinkExtractor(allow=()), callback="parse_obj", follow=False),)                   
            self.custom_settings = {
                'COMPRESSION_ENABLED': True,
                'URLLENGTH_LIMIT': 100,
                'DOWNLOAD_DELAY': 1
            }          
        elif mode == 'crawl':
            # 原有爬取逻辑
            pass

        # 先设置规则再调用父类初始化
        super().__init__(*args, **kwargs)

    def parse_obj(self, response):
        # 仅处理当前页面数据,不要yield任何新的Request
        pass

内容的提问来源于stack exchange,提问作者John M.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 11:55:35