ItemLoader的简单使用:目的是解决在爬虫文件中代码结构杂乱,无序,可读性差的缺点

经过之前的基础,我们可以爬取一些不用登录,没有Ajax的,等等其他的简单的爬虫
回顾我们的代码,是不是有点冗长,将所需字段通过xpath或者css解析出来,再自定义语句(还不是函数中)
进行清洗;然后再装入Item中,有没有这样一种方法:从Item中可以直接清洗岂不是很简单
今天就学习 ItemLoader这样一种对戏,简单代码,可读增强

思路:

1,创建一个ItemLoad对象

2,通过该对象的add_css或者add_xpath或者add_value方法将解析语句装入ItemLoader
    3,在Item.py中在Filder()中调用函数,用来清洗,处理数据
    4,artical_item = item_loader.load_item() 调用这个对象的此方法,写入到Item中

具体代码:

在爬虫文件中:

 #先引入
from ArticalSpider.items import JobboleArticalItem,ArticalItemLoader
#使用Itemloader来简化这个解析,装入Item这个过程,使得代码量减少
#先创建一个itemLoader()这样一个对象,不需解析list第一个等问题
#这里的ArticalItemLoader是继承了itemloader,并重写了部分功能,实现定制
item_loader = ArticalItemLoader(item=JobboleArticalItem(), response=response)
#使用ItemLoader这个对象的xpath解析器
item_loader.add_xpath("title",'/html//div[@class="entry-header"]/h1/text()')
#使用get_value()直接从response中选取内容
item_loader.add_value("url_object_id",get_md5(response.url))
item_loader.add_xpath("add_time", '/html//p[@class="entry-meta-hide-on-mobile"]/text()')
item_loader.add_value("url", response.url)
item_loader.add_value("front_image_url", [front_image_url])
item_loader.add_value("front_image_url2",front_image_url)
item_loader.add_xpath("tags",'/html//p[@class="entry-meta-hide-on-mobile"]/a/text()')
item_loader.add_xpath("comment_num",'//span[@class="btn-bluet-bigger href-style hide-on-480"]/text()')
item_loader.add_xpath("fav_num",'//span[contains(@class,"bookmark-btn")]/text()')
item_loader.add_xpath("like_num",'//span[contains(@class,"vote-post-up")]/h10/text()')
item_loader.add_xpath("content",'//div[@class="entry"]')
#装入Item
artical_item = item_loader.load_item() yield artical_item

在Item.py中

 #继承ItemLoader这个方法,并自定义自己的方法(属性)
class ArticalItemLoader(ItemLoader):
#实现之前的extract_first()方法
#这里只是重载这个属性,设置为只选取第一个值
default_output_processor = TakeFirst() #以下将之前的各种清洗语句整合到函数中
def add_title_jobbole(value):
return value+"---jobbole" def get_time(value):
#这个好像更改不了
try:
add_time = datetime.datetime.strptime(value,"%Y/%m/%d").data()
except Exception as e:
print(e)
add_time = datetime.datetime.now().date()
return add_time def get_tags(value):
tag_list = [x for x in value if not str(x).strip().endswith("评论") ] return tag_list
def get_comment_num(value):
re_comment = re.match(".*(\d+).*",value)
if re_comment:
comment_num = int(re_comment.group(1))
else:
comment_num = 0
return comment_num
def get_fav_num(value):
re_fav_num = re.match(".*(\d+).*",value)
if re_fav_num:
fav_num = int(re_fav_num.group(1))
else:
fav_num = 0
return fav_num
#小技巧:在出IteaLoad时,将之前进入的类型按原先的返回,怎么进入怎么返回
def get_value(value):
return value
class JobboleArticalItem(scrapy.Item):
title = scrapy.Field(
#调用方法,为传进的数据字段进行清洗,调用外部的方法
#input_processor 方法是将进入的数据进行调用函数清洗
#MapCompose 调用函数名
input_processor = MapCompose(add_title_jobbole)
)
add_time = scrapy.Field(
input_processor = MapCompose(get_time),
#只获取传入Item的这个列表中的第一个值作为Item的值
#但是要是字段太多,都得写下面这个语句,岂不麻烦,所以可以继承ItemLoader这个类,完成自己类
#TakeFirsr()就是 extrct_first()
output_processor = TakeFirst()
)
url = scrapy.Field()
content = scrapy.Field()
#不同url长度不同,通过md5统一长度
url_object_id = scrapy.Field() front_image_url = scrapy.Field(
#自定义的类之后,所有的Item都默认了list的第一个值,但传入下载图片的管道时会报错,因为下载图片的Item为list
#出去ItemLoader时处理数据的方法
output_processor = MapCompose(get_value)
)
front_image_url2 = scrapy.Field()
#url本地存放路径
front_image_path = scrapy.Field() tags = scrapy.Field(
input_processor = MapCompose(get_tags),
#使用processor自带的Join拼接方法
output_processor = Join(",")
)
comment_num = scrapy.Field(
input_processor = MapCompose(get_comment_num)
)
fav_num = scrapy.Field(
input_processor = MapCompose(get_fav_num)
)
like_num = scrapy.Field( )

注意:
  在保存要下载的图片的URL时,保存在Item中的应该是List;否则报错:

  raise ValueError: Missing scheme in request url: h

  原因:1,我们继承了Itemloader并重写了default_output_processor = TakeFirst();所以,这时图片URL为str

  解决办法:

    自定义方法:将怎样进来的value怎样出去(因为进来的是list)  

  

Scrapy基础(十三)————ItemLoader的简单使用的更多相关文章

  1. Scrapy基础(七)————图片的简单下载

    scrapy 提供了自动下载图片到本地的功能,通过项目管道设置 一: 在setting 文件中ITEM_PIPELINE添加: 'scrapy.pipelines.images.ImagesPipel ...

  2. Learning Scrapy笔记(三)- Scrapy基础

    摘要:本文介绍了Scrapy的基础爬取流程,也是最重要的部分 Scrapy的爬取流程 Scrapy的爬取流程可以概括为一个方程式:UR2IM,其含义如下图所示 URL:Scrapy的运行就从那个你想要 ...

  3. 0.Python 爬虫之Scrapy入门实践指南(Scrapy基础知识)

    目录 0.0.Scrapy基础 0.1.Scrapy 框架图 0.2.Scrapy主要包括了以下组件: 0.3.Scrapy简单示例如下: 0.4.Scrapy运行流程如下: 0.5.还有什么? 0. ...

  4. Bootstrap<基础十三> 按钮组

    按钮组允许多个按钮被堆叠在同一行上.当你想要把按钮对齐在一起时,这就显得非常有用.你可以通过Bootstrap 按钮(Button) 插件 添加可选的 JavaScript 单选框和复选框样式行为. ...

  5. scrapy框架系列 (2) 一个简单案例

    学习目标 创建一个Scrapy项目 定义提取的结构化数据(Item) 编写爬取网站的 Spider 并提取出结构化数据(Item) 编写 Item Pipelines 来存储提取到的Item(即结构化 ...

  6. NHibernate 映射基础(第三篇) 简单映射、联合主键

    NHibernate 映射基础(第三篇) 简单映射.联合主键 NHibernate完全靠配置文件获取其所需的一切信息,其中映射文件,是其获取数据库与C#程序关系的所有信息来源. 一.简单映射 下面先来 ...

  7. Flutter实战视频-移动电商-05.Dio基础_引入和简单的Get请求

    05.Dio基础_引入和简单的Get请求 博客地址: https://jspang.com/post/FlutterShop.html#toc-4c7 第三方的http请求库叫做Dio https:/ ...

  8. 《Entity Framework 6 Recipes》翻译系列 (3) -----第二章 实体数据建模基础之创建一个简单的模型

    第二章 实体数据建模基础 很有可能,你才开始探索实体框架,你可能会问“我们怎么开始?”,如果你真是这样的话,那么本章就是一个很好的开始.如果不是,你已经建模,并在实体分裂和继承方面感觉良好,那么你可以 ...

  9. C#基础系列——委托实现简单设计模式

    前言:上一篇介绍了下多线程的相关知识:C#基础系列——多线程的常见用法详解,里面就提到了委托变量.这篇简单介绍下委托的使用.当然啦,园子里面很多介绍委托的文章都会说道:委托和事件的概念就像一道坎,过了 ...

随机推荐

  1. Dom,查找标签和操作标签

    Dom,查找标签和操作标签 文档对象模型(Document Object Model,DOM)是一种用于HTML和XML文档的编程接口.它给文档提供了一种结构化的表示方法,可以改变文档的内容和呈现方式 ...

  2. exec函数族

    进程程序替换 进程程序替换原理 fork创建子进程执行的是和父进程相同的程序(也有可能是某个分支),通常fork出的子进程是为了完成父进程所分配的任务,所以子进程通常会调用一种exec函数(六种中的任 ...

  3. JS 中 ~~符号

    它被用作一个更快的替代 Math.floor() . 参考:http://rocha.la/JavaScript-bitwise-operators-in-practice

  4. CTAP: Complementary Temporal Action Proposal Generation (ECCV2018)

    互补时域动作提名生成 这里的互补是指actionness score grouping 和 sliding window ranking这两种方法提proposal的结合,这两种方法各有利弊,形成互补 ...

  5. JavaScript动态加载CSS和JS文件

    var dynamicLoading = { css: function(path){ if(!path || path.length === 0){ throw new Error('argumen ...

  6. 基于STM32单片机光学指纹识别模块(FPM10A)全教程(基于C语言)

    本文转载,其来源在参考中:1,稍加修改,因为近期使用到这个模块,故而加以整理! 1.平台 首先我使用的是 奋斗 STM32 开发板 MINI板 基于STM32单片机光学指纹识别模块(FPM10A)全教 ...

  7. 基于nopcommerce b2c开源项目的精简版开发框架Nop.Framework

    http://www.17ky.net/soft/70612.html?v=1#0-sqq-1-39009-9737f6f9e09dfaf5d3fd14d775bfee85 项目详细介绍 该开源项目是 ...

  8. seafile数据的备份与恢复

    seafile数据备份包括MySQL数据备份与seafile,seahub数据备份两个部分.所以在备份的时候需要注意这一点. 我的存储底层用glusterfs数据共享,为了防止一台服务器宕机以后另一台 ...

  9. JMeter学习笔记2-图形界面简单介绍

    废话少说直接干活的给: 一.打开和运行JMeter,出现UI界面.如图下所示: 工具栏:常见操作的图标集合,有New(新建), Template(模板) ,Save(保存),Start(开始) ,St ...

  10. Android ADB命令教程二——ADB命令详解

    Android ADB命令教程二——ADB命令详解 转载▼ 原文链接:http://www.tbk.ren/article/249.html       我们使用 adb -h 来看看,adb命令里面 ...