python爬虫:scrapy-redis实现分布式爬虫

环境搭建

  1. 需要安装 scrapy 和 scrapy-redis

    pip install scrapy
    pip install scrapy-redis
    
  2. 安装配置好 redis
    如果是mac种用homebrew安装的redis,配置文件路径为:

/usr/local/etc/redis.conf

修改配置文件

# bind 127.0.0.0
bind 0.0.0.0

第一步,配置settings.py

# 指定Redis数据库
REDIS_URL = "redis://localhost:6379"

# 使用scrapy-redis 的调度器替代原版调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"

# 使用scrapy-redis 的去重过滤器替代原版
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

# 启用scrapy-redis 的 RedisPipeline
ITEM_PIPELINES = {
    "scrapy_redis.pipelines.RedisPipeline": 300,
}

# 爬虫停止后保留请求队列和去重集合
SCHEDULER_PERSIST = True, # False: 清理(默认)

第二步,修改爬虫文件

from scrapy_redis.spiders import RedisSpider

# 1. 修改基类: Spider -> RedisSpider
class BooksSpider(RedisSpider):
    name = "books"
    # 2. 删除start_urls

第三步,启动爬虫

在各个服务器启动爬虫,爬虫将会进入等待状态

scrapy crawl books

第四步,发送爬虫起点

books 为爬虫名称

# 先启动redis
$ redis-cli
> lpush books:start_urls "http://www.baidu.com"

# 查看过滤器数量
> scard books:dupefilter
(integer) 36001

# 查看请求队列数量
> zcard books:requests
(integer) 27410

# 查看保存数据数量
> llen books:items
(integer) 478118

第五步,导出数据

# -*- coding: utf-8 -*-

# @File    : export_data.py
# @Date    : 2018-05-21

# 从redis数据库导出数据

import json
import redis
from pprint import pprint

# redis中存放数据的key
ITEM_KEY = "books_distribution:items"

def process_item(item):
    """处理数据
    :param
        item{dict}: 单条数据
    :return:
        None
    """
    pprint(item)


r = redis.Redis(host="localhost", port=6379)

for _ in range(r.llen(ITEM_KEY)):
    data = r.lpop(ITEM_KEY)
    item = json.loads(data)
    process_item(item)

你可能感兴趣的:(python,scrapy)