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. mac 显示/不显示"任何来源"_ mac打开安装文件显示文件破损解决办法

    系统: macOS_10.12 导致文件破损原因: 软件有经过了汉化或者破解,所以可能被Mac认为「已损坏」 解决问题办法: 系统偏好设置 -> 安全性与隐私 -> 通用 -> 选择 ...

  2. selenium 操作键盘

    send_keys(Keys.ENTER) 按下回车键send_keys(Keys.TAB) 按下Tab制表键send_keys(Keys.SPACE) 按下空格键spacesend_keys(Kye ...

  3. 论文阅读笔记十八:ENet: A Deep Neural Network Architecture for Real-Time Semantic Segmentation(CVPR2016)

    论文源址:https://arxiv.org/abs/1606.02147 tensorflow github: https://github.com/kwotsin/TensorFlow-ENet ...

  4. 跨域 jQuery库ajax请求

    XMLHttpRequest是原生ajax,缺点是使用起来比较繁琐. jQuery库提供了一组简洁的ajax请求方法. ajax() get() post() 具体使用参考官方API: http:// ...

  5. 字典树HihoCoder - 1014

    输入的第一行为一个正整数n,表示词典的大小,其后n行,每一行一个单词(不保证是英文单词,也有可能是火星文单词哦),单词由不超过10个的小写英文字母组成,可能存在相同的单词,此时应将其视作不同的单词.接 ...

  6. C#本质论第四版-1,抄书才能看下去,不然两三眼就看完了,一摞书都成了摆设。抄下了记忆更深刻

    C#本质论第四版-1,抄书才能看下去,不然两三眼就看完了,一摞书都成了摆设.抄下了记忆更深刻 本书面向的读者 写作本书时,我面临的一个挑战是如何持续吸引高级开发人员眼球的同时,不因使用assembly ...

  7. MySql中 delimiter 详解

    转载于:http://blog.csdn.net/yuxin6866/article/details/52722913 其实就是告诉MySQL解释器,该段命令是否已经结束了,mysql是否可以执行了. ...

  8. C# float与UInt16互转

    //float拆分成两个UInt16 public static UInt16 FloatToTwoUInt16(float f) { byte[] bs = BitConvert.GetBytes( ...

  9. h5网页在微信里打开 右上角分享到微信好友或者朋友圈

    首先你需要一个分享接口地址,然后在自定义图片 标题 描述 如下: <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js& ...

  10. 056 Java搭建kafka环境

    1.使用Java项目搭建 2.新目录 3.添加项目支持 4.添加mavem与scala 5.修改pom <?xml version="1.0" encoding=" ...