scrapy-redis分布式爬虫

Posted ArtisticMonk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了scrapy-redis分布式爬虫相关的知识,希望对你有一定的参考价值。

分布式问题:
    request队列集中管理

    去重集中管理

    储存管理

可以上github上面找一下scrapy-redis


相关模块 redis

settings相关设置

#使用scrapy-redis里的去重组件,不使用scrapy默认的去重方式
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

#使用scrapy-redis里的调度器组件,不使用默认的
SCHEDULER = "scrapy_redis.scheduler.Scheduler"

#允许暂停,redis请求记录不丢失
SCHEDULER_PERSIST = True

#默认的scrapy-redis请求队列形式(按优先级)
SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"

#队列形式,先进先出
SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderQueue"

#栈形式,请求先进后出
SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderStack"

#只是将数据放到redis数据库,不需要写pipeline,存储到mysql还是需要写的
ITEM_PIPELINES = {
    scrapy_redis.pipelines.RedisPipeline:400
}




#链接redis数据库

REDIS_URL = redis://:@127.0.0.1:6379

运行分布式爬虫

scrapy runspider myspider.py
#后面的py文件是你需要运行的分布式爬虫的文件名
命令行启动后,会在自行等待监听redis上的url
也就是在spider上面设置的redis_key = ‘mybaike:start_url‘
然后后在redis上lpush一个健名和url
#比如:
    # lpush mybaike:start_url "http://www.baike.com"

redis中默认生成的健有:
myspider:request

myspider:dupefilter

#如果打开item管道存储在redis的数据的话,就还有这这么一个字段
myspider:item

#在redis中删除所有的键命令为:flushdb
#查看所有键:keys *

spider.py ##基于RedisCrawlSpider,也就是翻页的时候使用Crawl的需要继承与这个类
import scrapy
from scrapy.selector import Selector
from Scrapy_Redist.items import ScrapyRedistItem
from scrapy_redis.spiders import RedisCrawlSpider
from scrapy.linkextractor import LinkExtractor
from scrapy.spiders import CrawlSpider,Rule

class MybaidukeSpider(RedisCrawlSpider):                  ##基于RedisCrawlSpider
    name = mybaike
    alloweb_domains = [baike.baidu.com]
    # start_urls = [‘https://baike.baidu.com/item/Python/407313‘]
    redis_key = mybaike:start_url
    rules = [Rule(LinkExtractor(allow=("item/(.*)")),callback="get_parse",follow=True)]
    def get_parse(self,response):
        items = ScrapyRedistItem()

        Seit = Selector(response)
        title = Seit.xpath(//dd[@class="lemmaWgt-lemmaTitle-title"]/h1/text()).extract()
        contentList = Seit.xpath(//div[@class="lemma-summary"]//text())
        content = ‘‘
        for c in contentList:
            content += c.extract().strip()

        items[title] = title
        items[content] = content
        yield items

 

import scrapy
from scrapy.selector import Selector
from Scrapy_Redist.items import ScrapyRedistItem

from scrapy_redis.spiders import RedisSpider

class MybaidukeSpider(RedisSpider):
    name = mybaike
    alloweb_domains = [baike.baidu.com]
    # start_urls = [‘https://baike.baidu.com/item/Python/407313‘]
redis_key = mybaike:start_url
  #这句话很重要哦,也就是写在redis中键

#rules = [Rule(LinkExtractor(allow=("item/(.*)")),callback="get_parse",follow=True)]# 如果自己写一个翻页的花就继承于 RedisSpider

def get_parse(self,response): items = ScrapyRedistItem() Seit = Selector(response) title = Seit.xpath(//dd[@class="lemmaWgt-lemmaTitle-title"]/h1/text()).extract() contentList = Seit.xpath(//div[@class="lemma-summary"]//text()) content = ‘‘ for c in contentList: content += c.extract().strip() items[title] = title items[content] = content yield items

其他的也就差不多一样的了

 




 

 
 

 
































































以上是关于scrapy-redis分布式爬虫的主要内容,如果未能解决你的问题,请参考以下文章

Scrapy-Redis使用教程&&将现有爬虫修改为分布式爬虫

Python爬虫scrapy-redis分布式实例

scrapy-redis分布式爬虫

scrapy-Redis分布式爬虫案例----阳光问政平台爬虫

10 给予scrapy-redis的分布式爬虫

scrapy-redis 更改队列和分布式爬虫