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. Android Studio 创建不恰当的虚拟设备导致程序不正常运行

    操作系统:Windows 10 x64 IDE:Android Studio 3.2.1 使用Android Studio新建第一个Android程序,一开始在虚拟设备上面调试,不管程序怎么修改,运行 ...

  2. 关于The specified Android SDK Build Tools version (26.0.2) is ignored, as it is below the minimum...

    今天将项目迁移到另一台笔记本,进行build出现以下问题,导致build失败 The specified Android SDK Build Tools version (26.0.2) is ign ...

  3. 使用python解决算法和数据结构--使用栈实现符号匹配

    现在要自己来实现这些数据结构和常用算法了. 把基础再打牢一些. 栈的作用很大,无须多言. 我尽量看了题目要求,自己来实现代码的. # coding = utf-8 class Stack: def _ ...

  4. Elasticsearch和HDFS 容错机制 备忘

    1.Elasticsearch 横向扩容以及容错机制http://www.bubuko.com/infodetail-2499254.html 2.HDFS容错机制详解https://www.cnbl ...

  5. 使用Github Pages和Hexo构建个人博客

    Github Pages可以创建免费的静态站点,支持自带主题.支持自制页面等,并且可以使用Jekyll或者Hexo等静态博客框架进行管理. 独立博客是博客园等博客平台之外的一个良好补充,相比使用虚拟主 ...

  6. zTree的使用教程

    1.首先去官网下载http://www.ztree.me/v3/main.php#_zTreeInfo 2.之后引入: <script src="js/jquery.ztree.all ...

  7. mysql binary

    mysql在比较字符串的时候是忽略大些写的 比如有用户叫ABC和abc select * from `sys_user` where username = 'abc' 会出来两条记录 select * ...

  8. [转]xshell使用技巧

    https://yq.aliyun.com/articles/44721 xshell是我用过的最好用的ssh客户端工具,没有之一.这个软件完全免费,简单易用,可以满足通过ssh管理linux vps ...

  9. day8.python文件操作

    打开和关闭文件 open函数 用Python内置的open()函数打开一个文件,创建一个file对象,相关的方法才可以调用它进行读写. file = open(file_name [, access_ ...

  10. 基于springboot通过自定义注解和AOP实现权限验证

    一.移入依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spri ...