1. 程式人生 > 資料庫 >[Python爬蟲]scrapy-redis快速上手(爬蟲分散式改造)

[Python爬蟲]scrapy-redis快速上手(爬蟲分散式改造)

作者的話

對Python爬蟲如何實現大批量爬取感興趣的讀者可以看下scrapy爬蟲框架,並且使用本文的scrapy-redis將你的爬蟲升級為分散式爬蟲。

前言

閱讀本文章,您需要:

  • 瞭解scrapy爬蟲框架,知道scrapy的基本使用,最好已經有了可以單機執行的scrapy爬蟲。

  • 瞭解scrapy-redis可以用來幹嘛。

  • 已經嘗試了一些反反爬措施後仍然覺得爬取效率太低。

  • 已經看了無數scrapy-redis文章,卻和我一樣不得要領。(自己太笨)

  • 已經看了無數scrapy-redis文章,被辣雞文章坑的生活不能自理,到現在還沒配置好。(可能還是自己太笨)

提示:本文為快速上手文章,有些操作的具體步驟不詳細講,自行百度通用解法,省略的部分我認為你可以自行解決,如果遇到問題,請留言提問

使用scrapy-redis將scrapy改造為分散式

安裝需要的python庫和資料庫

  • 安裝scrapy-redis:pip install scrapy-redis

  • 安裝redis:可以僅在master(主)端安裝

  • 安裝其他資料庫(可選):mysql,mangoDB,用來儲存大量資料,當然也可以選擇不安裝。用其他方法處理資料。

提示:請注意版本問題,不要過低。

配置redis

  1. master(主)上的redis安裝後,需要做以下幾件事:
    • 配置redis.conf設定從外網訪問:#bind 127.0.0.1
  • 最好設定個密碼

  • 取消保護模式 protected-mode no
  1. master啟動redis,使用./redis-server redis.conf(改為你的設定檔案所在位置)

  2. 嘗試從slave(從)連線master的redis,連線成功(盜的圖):
    [Python爬蟲]scrapy-redis快速上手(爬蟲分散式改造)
    image

修改scrapy:setting.py

新增如下程式碼:

# scrapy-redis
REDIS_URL = 'redis://:[email protected]:6379'  # for master
# REDIS_URL = 'redis://:[email protected]:6379'  # for slave (master's ip)
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
SCHEDULER_PERSIST = True
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

對於itempipeline:你以前怎麼存的資料還是怎麼存,當然你也可以用redis先存,之後再一起轉移出來。像我就直接存到mysql了

ITEM_PIPELINES = {
    # 'JD.pipelines.JdPipeline': 300,
    # 'scrapy_redis.pipelines.RedisPipeline': 400,
    'JD.mysqlpipelines.pipelines.JDPipeline': 300,
}

修改scrapy:spiders/xxxxx.py(自己命名的爬蟲檔案)

將繼承改為繼承Redisspider

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import scrapy
from JD.items import JdItem
import logging
from scrapy_redis.spiders import RedisSpider
import time

# class JDcat(scrapy.Spider):
class JDcat(RedisSpider):
    name = "JDcate"
    allowed_domains = ["jd.com"]

    # scrapy-redis
    redis_key = "JDcate:JD_urls"

    def start_requests(self):
        # designed by yourself
        # yield scrapy.Request(url=url, callback=self.parse)
        pass

    def parse(self, response):
        # designed by yourself
        pass

修改slave的儲存資料庫設定(可選)

如果你想要讓slave抓取到的資料直接存入master的資料庫,您別忘了修改slave的資料庫連線設定

# for master
db_item = pymysql.connect(host="localhost", user="root", password="root",
                          db="pricemonitor", port=3306, charset='utf8')

# for slave
# db_item = pymysql.connect(host="10.140.0.2", user="root", password="root",
#                           db="pricemonitor", port=3306, charset='utf8')

啟動分散式爬蟲

啟動master:scrapy crawl xxxxx
啟動slave: crawl xxxxx
[Python爬蟲]scrapy-redis快速上手(爬蟲分散式改造)
image2

上傳了個demo原始碼,供大家修改使用:

有問題請留言或郵件[email protected]

參考


scrapy-redis官方文件