提示
閱讀本文章,您需要:
了解scrapy侦高,知道scrapy-redis可以用來干嘛嫉柴,最好已經(jīng)有了可以單機(jī)運(yùn)行的scrapy爬蟲。
已經(jīng)嘗試了一些反反爬措施后仍然覺得爬取效率太低奉呛。
已經(jīng)看了無數(shù)scrapy-redis文章,卻和我一樣不得要領(lǐng)计螺。(自己太笨)
已經(jīng)看了無數(shù)scrapy-redis文章,被辣雞文章坑的生活不能自理瞧壮,到現(xiàn)在還沒配置好登馒。(可能還是自己太笨)
提示:本文為快速上手文章,有些操作的具體步驟不詳細(xì)講咆槽,自行百度通用解法陈轿,省略的部分我認(rèn)為你可以自行解決,如果遇到問題罗晕,請(qǐng)留言提問
使用scrapy-redis將scrapy改造為分布式
安裝需要的python庫(kù)和數(shù)據(jù)庫(kù)
安裝scrapy-redis:pip install scrapy-redis
安裝redis:可以僅在master(主)端安裝
安裝其他數(shù)據(jù)庫(kù)(可選):mysql济欢,mangoDB赠堵,用來保存大量數(shù)據(jù)小渊,當(dāng)然也可以選擇不安裝。用其他方法處理數(shù)據(jù)茫叭。
提示:請(qǐng)注意版本問題酬屉,不要過低。
配置redis
- master(主)上的redis安裝后,需要做以下幾件事:
配置redis.conf設(shè)置從外網(wǎng)訪問:#bind 127.0.0.1
最好設(shè)置個(gè)密碼
取消保護(hù)模式 protected-mode no
master啟動(dòng)redis呐萨,使用./redis-server redis.conf(改為你的設(shè)置文件所在位置)
嘗試從slave(從)連接master的redis杀饵,連接成功(盜的圖):
修改scrapy:setting.py
添加如下代碼:
# scrapy-redis
REDIS_URL = 'redis://:yzd@127.0.0.1:6379' # for master
# REDIS_URL = 'redis://:yzd@10.140.0.2:6379' # for slave (master's ip)
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
SCHEDULER_PERSIST = True
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
對(duì)于itempipeline:你以前怎么存的數(shù)據(jù)還是怎么存,當(dāng)然你也可以用redis先存谬擦,之后再一起轉(zhuǎn)移出來切距。像我就直接存到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的存儲(chǔ)數(shù)據(jù)庫(kù)設(shè)置(可選)
如果你想要讓slave抓取到的數(shù)據(jù)直接存入master的數(shù)據(jù)庫(kù),您別忘了修改slave的數(shù)據(jù)庫(kù)連接設(shè)置
# 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')
啟動(dòng)分布式爬蟲
啟動(dòng)master:scrapy crawl xxxxx
啟動(dòng)slave: crawl xxxxx
上傳了個(gè)demo源碼惨远,供大家修改使用:
https://github.com/qqxx6661/scrapy_redis_demo
有問題請(qǐng)留言或郵件qqxx6661@gmail.com