Scrapy-Redis 结合 POST 请求获取数据的方法示例

Ivy
Ivy
发布时间:2026-10-11 | 3人浏览过
原创

Scrapy-Redis 默认使用 GET 请求进行数据采集,且官方不支持多个实例同时采集同一站点。若需使用 POST 请求,必须重写相关函数并配置 Redis 调度器。本文详细讲解如何通过修改 Spider 代码和 settings.py 配置文件,实现基于 POST 请求的分布式爬虫,并处理请求去重与队列触发机制。

核心配置与原理

在分布式爬虫场景中,Scrapy-Redis 通过 Redis 存储请求队列和去重指纹。默认情况下,它发送 GET 请求。要实现 POST 请求,关键在于重写 make_request_from_data 函数,该函数负责从 Redis 队列中读取数据并生成对应的 Request 对象。同时,需要在 settings.py 中启用 Redis 调度器、持久化队列以及特定的去重过滤器。

Settings 配置

首先,在项目的 settings.py 文件中添加以下配置,以启用 Scrapy-Redis 的核心功能:

SCHEDULER = "scrapy_redis.scheduler.Scheduler" #启用Redis调度存储请求队列
SCHEDULER_PERSIST = True #不清除Redis队列、这样可以暂停/恢复 爬取
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" #确保所有的爬虫通过Redis去重
SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.SpiderPriorityQueue'
REDIS_URL = "redis://127.0.0.1:6379"

上述配置中,SCHEDULER_PERSIST = True 允许爬虫暂停后恢复时不丢失队列数据;DUPEFILTER_CLASS 指定使用 Redis 进行全局去重,确保不同爬虫实例不会重复发送相同请求。

Spider 代码实现

接下来,编写继承自 RedisSpider 的爬虫类。需要指定 redis_key 以关联 Redis 队列,并重写 make_request_from_data 方法以支持 POST 请求。

# -*- coding: utf-8 -*-
import scrapy
from scrapy_redis.spiders import RedisSpider


class HpbSpider(RedisSpider):
 name = 'hpb'
 redis_key = 'test_post_data'

 def make_request_from_data(self, data):
  """Returns a Request instance from data coming from Redis.
  By default, ``data`` is an encoded URL. You can override this method to
  provide your own message decoding.
  Parameters
  ----------
  data : bytes
   Message from redis.
  """
  return scrapy.FormRequest("https://www.httpbin.org/post",
         formdata={"data":data},callback=self.parse)

 def parse(self, response):
  print(response.body)

在 make_request_from_data 中,使用 scrapy.FormRequest 构造 POST 请求,目标 URL 为 https://www.httpbin.org/post,并通过 formdata 参数传递数据。解析函数 parse 仅打印响应体,实际应用中可根据需求提取数据。

启动与数据触发

配置完成后,通过命令行启动爬虫:

scrapy crawl hpb

启动后,程序会进入等待状态,直到 Redis 队列中有数据写入。此时,需通过 Redis 客户端向队列 test_post_data 写入数据以触发采集。以下是一个简单的 Python 脚本示例,用于向队列推送测试数据:

import redis
rd = redis.Redis('127.0.0.1',port=6379,db=0)
for _ in range(1000):
 rd.lpush('test_post_data',_)

执行该脚本后,爬虫将读取队列中的数据,发送 POST 请求。日志会显示成功读取请求并执行 POST 操作,响应状态码为 200,Content-Type 为 application/x-www-form-urlencoded。

去重机制与注意事项

Scrapy-Redis 默认会对 POST 数据进行去重。若发送相同的数据,爬虫不会再次发送该请求。如果业务需求要求发送相同数据但获取不同的返回值(例如动态内容),则需要重写 RFPDupeFilter,在去重逻辑中忽略 dont_filter 参数或自定义去重规则。否则,重复数据将被过滤,导致请求不发送。

以上就是 Scrapy-Redis 结合 POST 请求获取数据的详细内容,更多关于 Scrapy-Redis 配置与分布式爬虫开发的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表