Scrapy-Redis中的RedisSpider与RedisCrawlSpider有什么不同的地方

  介绍

Scrapy-Redis中的RedisSpider与RedisCrawlSpider有什么不同的地方?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

设置。py配置如下:

 # - * -编码:utf - 8 - *
  
  BOT_NAME=& # 39; dang_dang& # 39;
  
  SPIDER_MODULES=[& # 39; dang_dang.spiders& # 39;】
  NEWSPIDER_MODULE=& # 39; dang_dang.spiders& # 39;
  
  
  负责任地#爬行通过识别自己(和你的网站)> # - * -编码:utf - 8 - *
  进口scrapy
  进口再保险
  进口urllib
  从复制进口deepcopy
  从scrapy_redis。蜘蛛进口RedisSpider
  
  
  类DangdangSpider (RedisSpider):
  name=& # 39;当当网# 39;
  allowed_domains=[& # 39; dangdang.com& # 39;】
  redis_key=& # 39;当当:书# 39;
  模式=re.compile (r" (http | https)://category.dangdang.com/cp(。*和# 63;).html", re.I)
  
  # def __init__(自我,* args, * * kwargs):
  # #动态定义可爬取的域范围
  #域=kwargs.pop(& # 39;域# 39;& # 39;& # 39;)
  #自我。allowed_domains=过滤器(没有domain.split (& # 39; & # 39;))
  #超级(DangdangSpider,自我)。__init__ (* args, * * kwargs)
  
  def解析(自我、响应):#从首页提取图书分类信息
  #提取一级分类元素
  div_list=response.xpath (“//div [@class=& # 39;反对flq_body& # 39;]/div")
  在div div_list:
  项={}
  项目(“b_cate")=div.xpath (“。/dl/dt//text ()“) .extract ()
  项[“b_cate"]=[i.strip()因为我在项目(“b_cate")如果len (i.strip())比;0]
  #提取二级分类元素
  dl_list=div.xpath (“。/div//dl (@class=& # 39; inner_dl& # 39;]“)
  对dl dl_list:
  项目(“m_cate")=dl.xpath (“。//dt//@title") .extract_first ()
  #提取三级分类元素
  a_list=dl.xpath (“。/dd/a")
  对于一个在a_list:
  项目(“s_cate")=a.xpath (“。/text ()“) .extract_first ()
  项目(“s_href")=a.xpath (“。/@href") .extract_first ()
  如果项目(“s_href")不是没有和self.pattern.match(项目(“s_href"))不是没有:
  收益率scrapy.Request(项目(“s_href"),回调=self.parse_book_list,
  元={“item": deepcopy(项)})
  
  def parse_book_list(自我、响应):#从图书列表页提取数据
  项=response.meta[& # 39;项目# 39;】
  li_list=response.xpath (“//ul (@class=& # 39; bigimg& # 39;]/li")
  李在li_list:
  项目(“book_img")=li.xpath(“。/一个[@class=& # 39;图片# 39;]/img/@src") .extract_first ()
  如果项目(“book_img")==巴枷?模型/关/url_none.png":
  项目(“book_img")=li.xpath(“。/一个[@class=& # 39;图片# 39;]/img/@data-original") .extract_first ()
  项目(“book_name")=li.xpath (“。/p [@class=& # 39;名字# 39;]//@title") .extract_first ()
  项目(“book_desc")=li.xpath (“。/p [@class=& # 39;细节# 39;]/text ()“) .extract_first ()
  项目(“book_price")=li.xpath(“。//跨度(@class=& # 39; search_now_price& # 39;]/text ()“) .extract_first ()
  项目(“book_author")=li.xpath (“。/p [@class=& # 39; search_book_author& # 39;]/跨度[1]//text ()“) .extract_first ()
  项目(“book_publish_date")=li.xpath (“。/p [@class=& # 39; search_book_author& # 39;]/跨度[2]/text ()“) .extract_first ()
  如果项目(“book_publish_date")不是没有:
  项目(“book_publish_date")=项目(“book_publish_date") .replace (& # 39;/& # 39; & # 39; & # 39;)
  项目(“book_press")=li.xpath (“。/p [@class=& # 39; search_book_author& # 39;]/跨度[3]//text ()“) .extract_first ()
  收益率deepcopy(项)
  
  #提取下一页地址
  next_url=response.xpath(“//李[@class=& # 39;未来# 39;]//@href") .extract_first ()
  如果next_url不是没有:
  next_url=urllib.parse.urljoin(响应。url, next_url)
  收益率scrapy。请求(next_url调=自我。parse_book_list元={“item":条目})

当复述的当当网:书键所对应的start_urls列表为空时,启动DangdangSpider爬虫会进入到阻塞状态等待列表中被插入数据,控制台提示内容类似下面这样:

2019-05-08 14:02:53 [scrapy.core。引擎]信息:蜘蛛打开
2019-05-08 14:02:53 [scrapy.extensions。logstats]信息:爬0页(在0页/分钟),刮0项(在0项/分钟)
2019-05-08 14:02:53 [scrapy.extensions。telnet)调试:telnet控制台听> lpush当当:书http://book.dangdang.com/

命令执行完后稍等片刻DangdangSpider便会开始爬取数据,爬取到的数据结构如下图所示:

 Scrapy-Redis中的RedisSpider与RedisCrawlSpider有什么不同的地方

Scrapy-Redis中的RedisSpider与RedisCrawlSpider有什么不同的地方