一文教你使用scrapy-redis组件

  介绍

今天就跟大家聊聊有关一文教你使用scrapy-redis组件,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

scrapy-redis是一个基于复述的scrapy组件,用于快速实现scrapy项目的分布式部署和数据爬取,其运行原理如下图所示。

一文教你使用scrapy-redis组件

<强>分布式爬取

你可以启动多个共享同一复述队列的爬虫实例,多个爬虫实例将各自提取到或者已请求的请求在队列中统一进行登记,使得调度器在请求调度时能够对重复请求进行过滤,即保证已经由某一个爬虫实例请求过的请求将不会再被其他的爬虫实例重复请求。

<强>分布式数据处理

将scrapy爬取到的物品汇聚到同一个复述队列中,意味着你可以根据你的需要启动尽可能多的共享这个项目队列的后处理程序。

<强> scrapy即插即用组件

调度器调度器+重重复复过滤器,项目管道,基础蜘蛛爬虫

<强>

本文将以爬取京东所有图书分类下的图书信息为例对scrapy-redis的用法进行示例。

开发环境

    <李> Python 3.7 <李>复述3.2.100李

下面列举出了Python中scrapy-redis所需要的各个模块及其版本:

    <李>复述2.10.6李 <>李redis-py-cluster 1.3.6李 <>李scrapy-redis 0.6.8李 <>李scrapy-redis-cluster 0.4
      李,

在开发之前需要先安装好以上模块,以scrapy-redis-cluster模块为例,使用脉冲进行安装的命令如下:

 pip安装scrapy-redis-cluster #安装模块
  pip安装scrapy-redis-cluster==0.4 #安装模块时指定版本
  pip安装,升级scrapy-redis-cluster #升级模块版本

在Windows命令行执行如下命令完成项目创建:

d: \ scrapy> scrapy startproject jd_book

执行完该命令后,将会在当前目录下创建包含下列内容的jd_book目录:

一文教你使用scrapy-redis组件

在物品。py中把我们将要爬取的图书字段预先定义好。

 # - * -编码:utf - 8 - *
  
  进口scrapy
  
  类JdBookItem (scrapy.Item):
  b_cate=scrapy.Field() #图书所属一级分类名称
  s_cate=scrapy.Field() #图书所属二级分类名称
  s_href=https://www.yisu.com/zixun/scrapy.Field() #图书所属二级分类地址
  book_name=scrapy.Field() #名称
  book_img=scrapy.Field() #封面图片地址
  book_author=scrapy.Field() #作者
  book_press=scrapy.Field() #出版社
  book_publish_date=scrapy.Field() #出版日期
  book_sku=scrapy.Field() #商品编的号
  book_price=scrapy.Field() #价格

在Windows命令行执行如下命令完成蜘蛛创建:

d: \ scrapy \ jd_book> cd jd_book   d: \ scrapy \ jd_book> scrapy genspider jdbook jd.com

执行完该命令后,将会在jd_book的蜘蛛目录下生成一个jdbook。py文件:

一文教你使用scrapy-redis组件

, jdbook。py的完整爬虫代码如下。

 # - * -编码:utf - 8 - *
  进口scrapy
  进口json
  进口urllib
  从复制进口deepcopy
  从jd_book。项目导入JdBookItem
  
  类JdbookSpider (scrapy.Spider):
  name=& # 39; jdbook& # 39;
  allowed_domains=[& # 39; jd.com& # 39; & # 39; 3. cn # 39;】
  start_urls=[& # 39; https://book.jd.com/booksort.html& # 39;]
  
  def解析(自我、响应):#处理图书分类页
  dt_list=response.xpath (“//div [@class=& # 39; mc # 39;]/dl/dt") #提取一级分类元素
  对dt dt_list:
  项=JdBookItem ()
  项目(“b_cate")=dt.xpath(“。//文本()“).extract_first() #提取一级分类名称
  em_list=dt.xpath(“。/祖辈:dd [1]/em") #提取二级分类元素
  em的em_list:
  项目(“s_cate")=em.xpath(“。//文本()“).extract_first() #提取二级分类名称
  项目(“s_href")=em.xpath (“。//@href") .extract_first() #提取二级分类地址
  如果项目(“s_href")不是没有:
  项目(& # 39;s_href& # 39;]=癶ttps:“+项目[& # 39;s_href& # 39;] #补全二级分类地址
  收益率scrapy.Request(项目[& # 39;s_href& # 39;],回调=自我。parse_book_list元={“item": deepcopy(项)})
  
  def parse_book_list(自我、响应):#处理二级分类下图书列表页
  项=response.meta[& # 39;项目# 39;】
  li_list=response.xpath (“//div [@ id=& # 39; plist # 39;]/ul/li") #提取所有的图书元素
  李在li_list:
  项目(“book_img")=li.xpath (“。//div [@class=& # 39; p-img& # 39;]//img/@data-lazy-img") .extract_first ()
  如果项目(“book_img")是没有:
  项目(“book_img")=li.xpath (“。//div [@class=& # 39; p-img& # 39;]//img/@src") .extract_first ()
  如果项目(“book_img")不是没有:
  项目(“book_img")=癶ttps:“+项目(“book_img")
  项目(“book_name")=li.xpath (“。//div [@class=& # 39; p-name& # 39;]//em/text ()“) .extract_first () .strip ()
  项目(“book_author")=li.xpath(“。//跨度(@class=& # 39; author_type_1& # 39;]//text ()“) .extract ()
  项目(“book_press")=li.xpath(“。//跨度(@class=& # 39; p-bi-store& # 39;]//@title") .extract_first ()
  项目(“book_publish_date")=li.xpath(“。//跨度(@class=& # 39; p-bi-date& # 39;]/text ()“) .extract_first () .strip ()
  项目(“book_sku")=li.xpath (“。/div/@data-sku") .extract_first ()
  price_url=癶ttps://p.3.cn/prices/mgets& # 63; skuIds=j_ {}“.format(项目(“book_sku")) #提取图书价格请求地址
  收益率scrapy。请求(price_url调=自我。parse_book_price元={“item": deepcopy(项)})
  
  #提取列表页下一页地址
  next_url=response.xpath (“//[@class=& # 39; pn-next& # 39;]/@href") .extract_first ()
  如果next_url不是没有:
  next_url=urllib.parse.urljoin(响应。url, next_url)
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null

一文教你使用scrapy-redis组件