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#基础系列——多线程的常见用法详解,里面就提到了委托变量.这篇简单介绍下委托的使用.当然啦,园子里面很多介绍委托的文章都会说道:委托和事件的概念就像一道坎,过了 ...
随机推荐
- CF451E
一道不错的题,对排列组合能力的要求较高 题意:给定s个相同的小球放在n个不同的盒子里,可以不放,每个盒子有一个放的上限,求一共有多少种放法 解析:首先考虑没有上限的情况,这里比较好解决,采用隔板法,可 ...
- 阿里云服务器配置SSL证书成功开启Https(记录趟过的各种坑)
环境: 阿里云云服务器 Windows Server 2008 标准版 SP2 中文版(趁1212优惠买的一年的水货配置) 阿里云购买的域名(已备案.已解析) 服务器:phpstudy:php5 ...
- Jmeter测试demo
复制代码,保存为.jmx文件 需要安装插件: JMeterPlugins-ExtrasLibs E:\软件\apache-jmeter-3.0\lib\ext <?xml version=&qu ...
- docker批量删除none镜像
1.直接用docker images | grep none | awk ‘{print $3}’ |xgars docker rmi 通过关键字搜索,得到docker id,进行删除
- Ubuntu16.04安装vim8
Ubuntu16.04安装vim8 在Ubuntu16.04下编译安装vim8,并配置vim-plug插件管理器,以及安装YouCompleteMe等插件. 安装依赖 sudo apt-get ins ...
- windows解压.tar00文件
通常是单个文件太大分拆出来的,例如data.tar00, data.tar01, data.tar02等 cmd命令行进入几个tar0x文件所在目录,执行: copy /b data.tar0* da ...
- 视频H265格式压缩,软件压缩方法,硬件的没有条件,没法测试。
libx265软压c:/ffmpeg/ffmpeg.exe -i input.mp4 -c:v libx265 -preset:v fast output.mp4 原文件大小:610.87mb 目标文 ...
- 一脸懵逼学习Struts数据校验以及数据回显,模型驱动,防止表单重复提交的应用。
1:Struts2表单数据校验: (1)前台校验,也称之为客户端校验,主要是通过Javascript编程的方式进行数据的验证. (2)后台校验,也称之为服务器校验,这里指的是使用Struts2通过xm ...
- Python_tuple部分功能介绍
x.count():元素在元组内的个数 x.index():元素在元组内的位置
- tomcat配置介绍
第一节java的介绍 java需要一个java的运行环境 JDK:包含了好几个java组件,包含类库(API) 开发工具(java) jvm(java虚拟机)JRE(类库) tomcat:开源 企业 ...