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

如何在Python爬虫框架Scrapy中仅发送HEAD请求检测域名状态码

在Scrapy中改用HEAD请求检测状态码

要实现只发HEAD请求获取状态码、不下载页面内容的高效爬取,有两种常用方式:

1. 单个请求手动指定HEAD方法

如果只是部分请求需要用HEAD,或者在start_requests里初始化请求时,直接在构造scrapy.Request时指定method='HEAD'即可:

import scrapy

class StatusCheckerSpider(scrapy.Spider):
    name = 'status_checker'

    def start_requests(self):
        # 你的域名列表
        domain_list = ['http://example.com', 'http://example.net', 'http://example.org']
        for domain in domain_list:
            # 明确指定请求方法为HEAD
            yield scrapy.Request(
                url=domain,
                method='HEAD',
                callback=self.parse_status,
                errback=self.handle_errors  # 可选:处理请求失败的情况
            )

    def parse_status(self, response):
        # 只提取状态码和URL,不处理响应体
        yield {
            'url': response.url,
            'status_code': response.status
        }

    def handle_errors(self, failure):
        # 捕获请求失败的情况,比如连接超时、DNS解析失败等
        yield {
            'url': failure.request.url,
            'error': str(failure.value)
        }

2. 全局设置所有请求为HEAD方法

如果你的爬虫所有请求都需要用HEAD,可以通过下载中间件统一修改请求方法:

第一步:编写中间件

在你的Scrapy项目的middlewares.py里添加如下中间件:

class GlobalHeadRequestMiddleware:
    def process_request(self, request, spider):
        # 将所有请求的方法强制改为HEAD
        request.method = 'HEAD'

第二步:启用中间件

在项目的settings.py里找到DOWNLOADER_MIDDLEWARES配置,添加你的中间件(注意权重值,确保它在其他可能修改请求的中间件之前执行):

DOWNLOADER_MIDDLEWARES = {
    'your_project_name.middlewares.GlobalHeadRequestMiddleware': 543,
}

注意事项

  • 部分服务器可能不支持HEAD请求(会返回405 Method Not Allowed),如果需要兼容这种情况,可以在错误回调里重试时改用GET请求;
  • 使用HEAD请求时,Scrapy不会下载响应体,能大幅减少带宽占用和爬取时间,非常适合批量域名状态检测。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 23:27:28