Scrapy基础(十三)————ItemLoader的简单使用
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的简单使用的更多相关文章
- Scrapy基础(七)————图片的简单下载
scrapy 提供了自动下载图片到本地的功能,通过项目管道设置 一: 在setting 文件中ITEM_PIPELINE添加: 'scrapy.pipelines.images.ImagesPipel ...
- Learning Scrapy笔记(三)- Scrapy基础
摘要:本文介绍了Scrapy的基础爬取流程,也是最重要的部分 Scrapy的爬取流程 Scrapy的爬取流程可以概括为一个方程式:UR2IM,其含义如下图所示 URL:Scrapy的运行就从那个你想要 ...
- 0.Python 爬虫之Scrapy入门实践指南(Scrapy基础知识)
目录 0.0.Scrapy基础 0.1.Scrapy 框架图 0.2.Scrapy主要包括了以下组件: 0.3.Scrapy简单示例如下: 0.4.Scrapy运行流程如下: 0.5.还有什么? 0. ...
- Bootstrap<基础十三> 按钮组
按钮组允许多个按钮被堆叠在同一行上.当你想要把按钮对齐在一起时,这就显得非常有用.你可以通过Bootstrap 按钮(Button) 插件 添加可选的 JavaScript 单选框和复选框样式行为. ...
- scrapy框架系列 (2) 一个简单案例
学习目标 创建一个Scrapy项目 定义提取的结构化数据(Item) 编写爬取网站的 Spider 并提取出结构化数据(Item) 编写 Item Pipelines 来存储提取到的Item(即结构化 ...
- NHibernate 映射基础(第三篇) 简单映射、联合主键
NHibernate 映射基础(第三篇) 简单映射.联合主键 NHibernate完全靠配置文件获取其所需的一切信息,其中映射文件,是其获取数据库与C#程序关系的所有信息来源. 一.简单映射 下面先来 ...
- Flutter实战视频-移动电商-05.Dio基础_引入和简单的Get请求
05.Dio基础_引入和简单的Get请求 博客地址: https://jspang.com/post/FlutterShop.html#toc-4c7 第三方的http请求库叫做Dio https:/ ...
- 《Entity Framework 6 Recipes》翻译系列 (3) -----第二章 实体数据建模基础之创建一个简单的模型
第二章 实体数据建模基础 很有可能,你才开始探索实体框架,你可能会问“我们怎么开始?”,如果你真是这样的话,那么本章就是一个很好的开始.如果不是,你已经建模,并在实体分裂和继承方面感觉良好,那么你可以 ...
- C#基础系列——委托实现简单设计模式
前言:上一篇介绍了下多线程的相关知识:C#基础系列——多线程的常见用法详解,里面就提到了委托变量.这篇简单介绍下委托的使用.当然啦,园子里面很多介绍委托的文章都会说道:委托和事件的概念就像一道坎,过了 ...
随机推荐
- You are my brother
问题 : You are my brother 时间限制: 1 Sec 内存限制: 128 MB 题目描述 Little A gets to know a new friend, Little B, ...
- Microsoft Visual Studio Community 2017 修改新建项目的默认位置
IDE: Microsoft Visual Studio Community 2017 15.5.2 通过修改默认的设置,在下一次新建项目时,就可以节省一些不必要的操作. 菜单:工具 > 选项, ...
- Rsync 常见错误及解决方法
由于阿里云SLB不提供ECS间的数据同步服务,如果部署在SLB后端ECS上的应用服务是无状态的,那么可以通过独立的ECS或RDS服务来存储数据:如果部署在SLB后端ECS上的应用服务是有状态的,那么需 ...
- Spring.Net 简单实例-01(IOC)
1.话不多说看操作.新建"Windows窗体应用程序" 2:通过配置文件创建IOC容器 首先引入安装包 3:定义一个接口(更好的体现封装性,当然也可以直接使用类) 定义一个类,实现 ...
- Java装饰者模式
定义:在不改变原有对象的基础上,将功能附加到对象自上 提供了比继承更有弹性的替代方案(扩展原有对象功能) 类型:结构型 扩展一个类的功能或给一个类添加附加职责 动态的给一个对象添加功能,这些功能可以再 ...
- SqlServer 四大排名函数(ROW_NUMBER、RANK、DENSE_RANK、NTILE)简介
CREATE TABLE [dbo].[Order]( [ID] [int] IDENTITY(1,1) NOT NULL, [UserId] [int] NOT NULL, [TotalPrice] ...
- Linux(CentOS7)安装Tomcat
概述 Tomcat是运行Jsp文件的容器服务,能够处理URL请求,类似于IIS.相对于IIS,Tomcat可以部署到Linux.Windows.IOS等操作系统.这里主要整理将Tomcat部署到Lin ...
- HDU4185 Oil Skimming 二分图匹配 匈牙利算法
原文链接http://www.cnblogs.com/zhouzhendong/p/8231146.html 题目传送门 - HDU4185 题意概括 每次恰好覆盖相邻的两个#,不能重复,求最大覆盖次 ...
- P1182 数列分段`Section II` P1316 丢瓶盖 二分答案
题目描述 对于给定的一个长度为N的正整数数列A-iA−i,现要将其分成M(M≤N)M(M≤N)段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一数列4 2 4 5 142451要分成 ...
- CodeSignal 刷题 —— matrixElementSum
After they became famous, the CodeBots all decided to move to a new building and live together. The ...