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
源码地址
分布式爬虫注意事项:
-
不需要写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'