介绍
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有什么不同的地方