如何让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,你的代码存在两个可能的问题,对应修正方式如下:
- 规则初始化时机错误:CrawlSpider 父类初始化时会提前读取
rules生成链接提取器,你在子类__init__里设置rules后再调用super(),会导致父类无法正确识别你的规则。需将rules赋值放在super()之前。 - 回调函数主动生成请求:检查你的
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.
相关产品推荐
相关产品推荐

