[Python爬蟲]scrapy-redis快速上手(爬蟲分散式改造)
阿新 • • 發佈:2020-12-08
作者的話
對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
- master(主)上的redis安裝後,需要做以下幾件事:
- 配置redis.conf設定從外網訪問:#bind 127.0.0.1
-
最好設定個密碼
- 取消保護模式 protected-mode no
-
master啟動redis,使用./redis-server redis.conf(改為你的設定檔案所在位置)
- 嘗試從slave(從)連線master的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
image2
上傳了個demo原始碼,供大家修改使用:
有問題請留言或郵件[email protected]
參考
scrapy-redis官方文件