Python中如何便捷地向scrapy-redis添加大量start_urls?

scrapy-redis 的 start_urls 需要去 redis 添加,可是当添加多个 url 的时候很麻烦,有没有方便的做法
Python中如何便捷地向scrapy-redis添加大量start_urls?

12 回复

麻烦之处 在哪


在Scrapy-Redis中批量添加start_urls,最直接的方式是通过Redis的lpush命令。你可以写个简单的Python脚本来处理。

假设你的Redis键名是默认的myspider:start_urls,下面是一个完整的示例:

import redis
import json

def push_urls_to_redis(url_list, redis_key='myspider:start_urls', host='localhost', port=6379, db=0):
    """
    将URL列表批量推送到Redis队列
    """
    # 连接Redis
    r = redis.Redis(host=host, port=port, db=db)
    
    # 使用pipeline批量操作提升性能
    with r.pipeline() as pipe:
        for url in url_list:
            # 如果URL需要附带其他参数,可以构建字典
            # item = {'url': url, 'meta': {'some_key': 'some_value'}}
            # pipe.lpush(redis_key, json.dumps(item))
            
            # 如果只是纯URL,直接推送字符串
            pipe.lpush(redis_key, url)
        
        # 执行所有命令
        pipe.execute()
    
    print(f"成功推送 {len(url_list)} 个URL到Redis键 {redis_key}")

if __name__ == '__main__':
    # 示例:从文件读取URL列表
    with open('urls.txt', 'r') as f:
        urls = [line.strip() for line in f if line.strip()]
    
    # 或者直接定义列表
    # urls = [
    #     'http://example.com/page1',
    #     'http://example.com/page2',
    #     # ... 更多URL
    # ]
    
    push_urls_to_redis(urls)

关键点说明:

  1. 使用lpush:Scrapy-Redis默认从Redis列表的左侧弹出URL,所以要用lpush(左侧插入)。
  2. 管道(pipeline):当需要插入大量数据时,使用Redis管道可以显著减少网络往返时间,提升性能。
  3. 数据格式:如果只是简单的URL字符串,直接推送即可。如果需要携带额外的请求参数(如headers、meta信息),可以构建字典然后序列化为JSON字符串推送。
  4. 键名:确保redis_key与你的Spider中设置的redis_key一致(默认是<spider_name>:start_urls)。

运行前准备:

  • 安装redis-py:pip install redis
  • 确保Redis服务已启动
  • 将你的URL列表准备好(可以从数据库、文件或API获取)

一句话建议: 用redis-py的pipeline批量lpush最高效。

start_requests

同问怎么麻烦?虽然没用 scrapy-redis

#1
#3
需要很长一串啊 一个一个加进去 比如我有 50 个页码怎么加
<br>127.0.0.1:6379&gt; lpush yourspider:start_urls <a target="_blank" href="https://www.v2ex.com/t/363913" rel="nofollow noopener">https://www.v2ex.com/t/363913</a><br>
这样的 url 不是要写 50 个?

#2 这个写在 spider 里面吗

循环啊,你是手动加的么?直接写个 py 脚本不一下加进去了

#6 我才不会手动呢,我想着应该会有更便捷的高级方法

我还是老老实实写脚本吧

start_requests 读文件

大哥,你写个 python 脚本来导入这么难吗?

#10 看这便捷的方法不是找到了吗, start_requests 读文件啊

回到顶部