CrawlSpider和分布式爬虫

CrawlSpider

CrawlSpider它是Spider的派生类,Spider类的设计原则是只爬取start_url列表中的网页,而CrawlSpider类定义了一些规则Rule来提供跟进链接的方便的机制,从爬取的网页结果中获取链接并继续爬取的工作.

  • Rule参数

    • link_extractor:是一个Link Extractor对象,用于定义需要提取的链接。
    • callback: 从link_extractor中每获取到链接得到Responses时,会调用参数所指定的值作为回调函数,该回调函数接收一个response作为其一个参数。
    • follow:是一个布尔(boolean)值,指定了根据该规则从response提取的链接是否需要跟进。如果callbacnlNone,follow 默认设置为True ,否则默认为False。
    • process_links:指定spider中哪个的函数将会被调用,从link_extractor中获取到链接列表时将会调用该函数。该方法主要用来过滤。
    • process_request:指定处理函数,根据该Rule提取到的每个Request时,该函数将会被调用,可以对Request进行处理,该函数必须返回Request或者None
    • 注意:当编写爬虫规则时,避免使用parse作为回调函数。由于CrawlSpider使用parse方法来实现其逻辑,如果覆盖了 parse方法,crawl spider将会运行失败
  • Link_extractor参数

    • allow:满足括号中“正则表达式”的URL会被提取,如果为空,则全部匹配。
    • deny:满足括号中“正则表达式”的URL一定不提取(优先级高于allow)。
    • allow_domains:会提取的链接的domains。
    • deny_domains:一定不会被提取链接的domains。
    • restrict_xpaths:使用xpath表达式,和allow共同作用过滤链接。

class XcfcrawlspiderSpider(CrawlSpider):
    #爬虫名称
    name = 'xcfCrawlSpider'
    #设置允许爬取的域
    allowed_domains = ['xiachufang.com']
    #设置起始的url
    start_urls = ['http://www.xiachufang.com/category/']

    # rules:是一个元组(列表),里面存放的是规则Rule规则对象
    # 可以有多个规则

    #Rule:
    #LinkExtractor:设置提取规则
    #callback:设置回调函数(获取响应,解析数据)
    #follow:设置是否需要跟进

    rules = (
        #分类列表地址
        # http://www.xiachufang.com/category/40073/
        Rule(
            LinkExtractor(allow=r'.*?/category/\d+/'),
            callback='parse_item',
            follow=True,
            process_links='check_category_url'
        ),
        # 菜单详情地址,
        # http://www.xiachufang.com/recipe/1055105/
        # http://www.xiachufang.com/recipe/12137/
        # http://www.xiachufang.com/recipe/100147684/
        Rule(
            LinkExtractor(
                allow=r'.*?/recipe/\d+/',
            ),
            callback='parse_caipu_detail',
            follow=False,
        )
    )

其他部分与spider一样的…

分布式爬虫

分布式

下面附上settings 的介绍


# 默认的User-Agent
USER_AGENT = 'scrapy-redis (+https://github.com/rolando/scrapy-redis)'

#这里表示启用scrapy-redis里的去重组件,
不再使用scrapy默认的去重
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

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

#允许暂停,redis请求的记录不会丢失,不清除
Redis队列,可以恢复和暂停
SCHEDULER_PERSIST = True

#下面这些是request的队列模式
#一般情况下使用第一种
#scrapy-redis默认的请求队列形式(有自己的优先级顺序)
#是按照redis的有序集合排序出队列的
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"

#这个是启用了堆的形式,请求先进先出
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderQueue"

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

# scrapy_redis.pipelines.RedisPipeline 必须启用,才能够将数据存储到redis数据库中
ITEM_PIPELINES = {
    'example.pipelines.ExamplePipeline': 300,
    'scrapy_redis.pipelines.RedisPipeline': 400,
}

# log日志等级(可选)
# LOG_LEVEL = 'DEBUG'

# 指定要存储的redis的主机的ip,
默认存储在127.0.0.1

REDIS_HOST = 'redis的主机的ip'

# 定要存储的redis的主机的port,
默认6379

REDIS_PORT = '6379'

# Introduce an artifical delay to make use of parallelism. to speed up the
# crawl.
#下载延时
DOWNLOAD_DELAY = 1

源码地址

https://github.com/rolando/scrapy-redis.git

分布式爬虫注意事项:

  • 不需要写start_urls 而改为redis_key

    allowed_domains = [‘设置允许爬取的域’]
    注意redis-key的格式:
    redis_key = ‘myspider:start_urls’

  • 继承的类需要改变 (具体继承哪一个根据你的要求来)

    from scrapy_redis.spiders import RedisCrawlSpider ----> redis通用爬虫
    from scrapy_redis.spiders import RedisSpider -----> redis 普通爬虫

  • 修改设置

#这里表示启用scrapy-redis里的去重组件,
不再使用scrapy默认的去重
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
使用了scrapy-redis里面的调度器组件,不再使用scrapy默认的调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
允许暂停,redis请求的记录不会丢失,不清除
Redis队列,可以恢复和暂停
SCHEDULER_PERSIST = True
scrapy-redis默认的请求队列形式(有自己的优先级顺序)
是按照redis的有序集合排序出队列的
SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"
scrapy_redis.pipelines.RedisPipeline': 400, scrapy_redis 管道 

redis数据库配置

	指定要存储的redis的主机的ip,
	默认存储在127.0.0.1
	REDIS_HOST = 'redis的主机的ip'	
	定要存储的redis的主机的port,
	默认6379
	REDIS_PORT = '6379'
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值