一杖狼、配置redis
- 對redis配置文件進(jìn)行配置:
- 注釋該行:bind 127.0.0.1,表示可以讓其他ip訪問redis
- 將yes該為no:protected-mode no,表示可以讓其他ip操作redis
二、scrapy基于redis的數(shù)據(jù)持久化操作流程
1.安裝scrapy-redis組件:
- pip install scrapy-redis
- scrapy-redis是基于scrapy框架開發(fā)出的一套組件,其作用就是可以讓scrapy實現(xiàn)分布式爬蟲。
2.編寫爬蟲文件:
- 同之前scrapy中基于Spider或者CrawlSpider的編寫方式一致晶疼。
3.編寫管道文件:
- 在scrapy-redis組件中已經(jīng)幫助我們封裝好了一個專門用于連接存儲redis數(shù)據(jù)庫的管道(RedisPipeline)酒贬,因此我們直接使用即可,無需自己編寫管道文件翠霍。
4.編寫配置文件:
- 在settings.py中開啟管道锭吨,且指定使用scrapy-redis中封裝好的管道。
ITEM_PIPELINES = {
'scrapy_redis.pipelines.RedisPipeline': 400
}
- 該管道默認(rèn)會連接且將數(shù)據(jù)存儲到本機(jī)的redis服務(wù)中寒匙,如果想要連接存儲到其他redis服務(wù)中需要在settings.py中進(jìn)行如下配置:
REDIS_HOST = 'redis服務(wù)的ip地址'
REDIS_PORT = 6379
REDIS_ENCODING = ‘utf-8’
REDIS_PARAMS = {‘password’:’123456’}
- 使用scrapy-redis組件中封裝好的調(diào)度器零如,將所有的url存儲到該指定的調(diào)度器中,從而實現(xiàn)了多臺機(jī)器的調(diào)度器共享锄弱。
# 使用scrapy-redis組件的去重隊列
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 使用scrapy-redis組件自己的調(diào)度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 是否允許暫停
SCHEDULER_PERSIST = True
5.啟動redis
- 啟動服務(wù)端
- mac/linux: redis-server redis.conf
- windows: redis-server.exe redis-windows.conf
- 啟動客戶端
6.執(zhí)行當(dāng)前爬蟲文件:
- scrapy runspider 爬蟲文件 (注意爬蟲文件必須加上后綴名.py)
7. 向隊列中扔一個起始url
- 在redis-cli執(zhí)行扔的操作(lpush redis_key的value值 起始url)
例:爬蟲文件
# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from scrapy_redis.spiders import RedisCrawlSpider
from redisScrapyPro.items import RedisscrapyproItem
#-1.將redis數(shù)據(jù)庫的配置文件進(jìn)行改動: protected-mode no #bind 127.0.0.1
#0.下載scrapy-redis
#1.創(chuàng)建工程
#2.創(chuàng)建基于scrawlSpider的爬蟲文件
#3.導(dǎo)入RedisCrawlSpider類
#4.將start_urls更換成redis_key屬性
#5.在現(xiàn)有代碼的基礎(chǔ)上進(jìn)行連接提取和解析操作
#6.將解析的數(shù)據(jù)值封裝到item中考蕾,然后將item對象提交到scrapy-redis組件中的管道里('scrapy_redis.pipelines.RedisPipeline': 400,)
#7.管道會將數(shù)據(jù)值寫入到指定的redis數(shù)據(jù)庫中(在配置文件中進(jìn)行指定redis數(shù)據(jù)庫ip的編寫)
#8.在當(dāng)前工程中使用scrapy-redis封裝好的調(diào)度器(在配置文件中進(jìn)行配置)
#9.將起始url扔到調(diào)度器隊列(redis_key)中
#10.啟動redis服務(wù)器:redis-server redis.windows.conf
#11.啟動redis-cli
#12.執(zhí)行當(dāng)前爬蟲文件:scrapy runspider 爬蟲文件
#13.向隊列中扔一個起始url:在redis-cli執(zhí)行扔的操作(lpush redis_key的value值 起始url)
class RedisdemoSpider(RedisCrawlSpider):
name = 'redisDemo'
#allowed_domains = ['www.xxx.com']
#start_urls = ['http://www.xxx.com/']
#scrapy_redis的調(diào)度器隊列的名稱,最終我們會根據(jù)該隊列的名稱向調(diào)度器隊列中扔一個起始url
redis_key = "redisQueue"
link = LinkExtractor(allow=r'/pic/page/\d+\?s=\d+')
link1 = LinkExtractor(allow=r'/pic/page/1')
rules = (
Rule(link, callback='parse_item', follow=True),
Rule(link1, callback='parse_item', follow=True),
)
def parse_item(self, response):
div_list = response.xpath('//div[@class="thumb"]')
for div in div_list:
img_url = "https:"+div.xpath('./a/img/@src').extract_first()
item = RedisscrapyproItem()
item['imgUrl'] = img_url
yield item