爬取伯乐在线文章(五)itemloader
ItemLoader
在我们执行scrapy爬取字段中,会有大量的CSS或是Xpath代码,当要爬取的网站多了,要维护起来很麻烦,为解决这类问题,我们可以根据scrapy提供的loader机制。
导入ItemLoader
from scrapy.loader import ItemLoader
实例化ItemLoader对象
要使用Itemloader,必须先将它实例化。查看一下ItemLoader的源码,有2个重要的传入参数,item和response

# 通过ItemLoader对象实例化item
item_loader = ItemLoader(item=JobBoleArticleItem(), response=response)
# 针对CSS选择器
item_loader.add_css('title', '.entry-header h1::text')
item_loader.add_css('create_date', '.entry-meta .entry-meta-hide-on-mobile::text')
item_loader.add_css('praise_num', '.vote-post-up h10::text')
item_loader.add_css('collect_num', '.post-adds .bookmark-btn::text')
item_loader.add_css('comment_num', '.post-adds .hide-on-480::text')
# 针对直接取值的情况
item_loader.add_value('url', response.url)
item_loader.add_value('url_object_id', get_md5(response.url))
item_loader.add_value('front_image_url', [front_image_url])
# 把结果返回给item对象
article_item = item_loader.load_item()
Debug调试查看情况

调用默认的item方法目前有2个问题:
(1)默认情况下传入的都是一些list
(2)像parise_num和comment_num传入的一些值我们还需要在进行一次过滤,加一些处理函数
MapCompose
如果解决上面两个问题?如何取list第一个值,如何在某些字段上加一些处理函数?为了解决这个问题,我们需要重新修改items.py,需要导入MapCompose类
from scrapy.loader.processors import MapCompose

MapCompose里面可以传入任意多的函数,也可以传入一些lambda表达式
title = scrapy.Field(
# 代表当item传入值的时候,我们可以对这些值进行一些预处理,MapCompose可以传入任意多个函数
input_processor = MapCompose(lambda x:x+"-jobbole")
)
此时在进行Debug调试,title上会添加-jobbole

我们可以在加入一个函数,现在MapCompose里面有一个lambda表达式,一个函数,Debug看是否能够连续处理

Debug

经测试可以从左到右依次连续进行处理
TakeFirst
那如何获取list中的第一个值,此时需要TakeFirst函数
导入
from scrapy.loader.processors import MapCompose, TakeFirst
调用
create_date = scrapy.Field(
input_processor = MapCompose(date_convert),
output_processor = TakeFirst()
)
Debug调试,此时获取的create_time就是一个date类型的值了而不是一个list

自定义ItemLoader
如果所有的字段都去第一个值,是否每个字段都需要添加
output_processor = TakeFirst()
此时太麻烦,我们可以自己定义一个ItemLoader,需要继承scrapy的ItemLoader类
from scrapy.loader import ItemLoader
class ArticleItemLoader(ItemLoader):
pass
查看ItemLoader的源码,有一个默认的

修改默认的default_output_processor方法
class ArticleItemLoader(ItemLoader):
default_output_processor = TakeFirst()
在修改我们爬虫里面ItemLoader为我们自定义的ItemLoader,在jobbole.py里面修改
from EnterpriseSpider.items import JobBoleArticleItem, ArticleItemLoader
# 通过ItemLoader对象实例化item
item_loader = ArticleItemLoader(item=JobBoleArticleItem(), response=response)
Debug调试,此时item返回的是单个的值而不是一个list

图片下载处理
此时返回的front_image_url是一个字符串,此时在交给ImagePipeline进行下载的时候就会抛出异常,我们必须覆盖掉默认的output_processor方法
def return_value(value):
return value
front_image_url = scrapy.Field(
output_processor=MapCompose(return_value)
)
此时还需要修改插入数据库的语句,还需要修改ArticleImagePipeline
class ArticleImagePipeline(ImagesPipeline):
def item_completed(self, results, item, info):
if "front_image_url" in item:
for ok, value in results:
image_file_path = value["path"]
item["front_image_url"] = image_file_path
return item
default_output_processor
爬取伯乐在线文章(五)itemloader的更多相关文章
- 爬取伯乐在线文章(四)将爬取结果保存到MySQL
Item Pipeline 当Item在Spider中被收集之后,它将会被传递到Item Pipeline,这些Item Pipeline组件按定义的顺序处理Item. 每个Item Pipeline ...
- 第三天,爬取伯乐在线文章代码,编写items.py,保存数据到本地json文件中
一. 爬取http://blog.jobbole.com/all-posts/中的所有文章 1. 编写jobbole.py简单代码 import scrapy from scrapy. ...
- 爬取伯乐在线文章(二)通过xpath提取源文件中需要的内容
爬取说明 以单个页面为例,如:http://blog.jobbole.com/110287/ 我们可以提取标题.日期.多少个评论.正文内容等 Xpath介绍 1. xpath简介 (1) xpath使 ...
- Scrapy爬取伯乐在线文章
首先搭建虚拟环境,创建工程 scrapy startproject ArticleSpider cd ArticleSpider scrapy genspider jobbole blog.jobbo ...
- scrapy爬取伯乐在线文章数据
创建项目 切换到ArticleSpider目录下创建爬虫文件 设置settings.py爬虫协议为False 编写启动爬虫文件main.py
- python爬虫scrapy框架——爬取伯乐在线网站文章
一.前言 1. scrapy依赖包: 二.创建工程 1. 创建scrapy工程: scrapy staratproject ArticleSpider 2. 开始(创建)新的爬虫: cd Artic ...
- 爬虫实战——Scrapy爬取伯乐在线所有文章
Scrapy简单介绍及爬取伯乐在线所有文章 一.简说安装相关环境及依赖包 1.安装Python(2或3都行,我这里用的是3) 2.虚拟环境搭建: 依赖包:virtualenv,virtualenvwr ...
- Scrapy爬取伯乐在线的所有文章
本篇文章将从搭建虚拟环境开始,爬取伯乐在线上的所有文章的数据. 搭建虚拟环境之前需要配置环境变量,该环境变量的变量值为虚拟环境的存放目录 1. 配置环境变量 2.创建虚拟环境 用mkvirtualen ...
- Scrapy基础(六)————Scrapy爬取伯乐在线一通过css和xpath解析文章字段
上次我们介绍了scrapy的安装和加入debug的main文件,这次重要介绍创建的爬虫的基本爬取有用信息 通过命令(这篇博文)创建了jobbole这个爬虫,并且生成了jobbole.py这个文件,又写 ...
随机推荐
- C#如何通过属性名称反射出属性本身
A a = new A(); Type t = typeof(A); var v1 = t.GetField("n").GetValue(a);//获取字段值,你的类A.n是字段, ...
- angularJs学习笔记-入门
1.angularJs简介 angularJs是一个MV*的javascript框架(Model-View-Whatever,不管是MVVM还是MVC,统归MDV(model drive view)) ...
- js 两数组去除重复数值
//两数组去除重复数值 mergeArray: function(arr1, arr2) { for (var i = 0; i < arr1.length; i++) { for (var j ...
- 小tips:JS之浅拷贝与深拷贝
浅拷贝: function extendCopy(p) { var c = {}; for (var i in p) { c[i] = p[i]; } return c; } 深拷贝: functio ...
- JS之函数实际参数转换成数组的方法[].slice.call(arguments)
实际参数在函数中我们可以使用 arguments 对象获得 (注:形参可通过 arguments.callee 获得),虽然 arguments 对象与数组形似,但仍不是真正意义上的数组. 我们可以通 ...
- django模型基础(三)
本文转载自https://blog.csdn.net/xiaogeldx/article/details/88084034 表关系 一对一(OneToOne) 通过本表的主键外键关联另一张表的主键 创 ...
- 如何用ABP框架快速完成项目(9) - 用ABP一个人快速完成项目(5) - 不要执着于设计模式和DDD理论,避免原教旨主义
为什么要写这节文章呢? 首先主动看我这系列文章和参加活动课程的同学, 肯定是积极好学的. 所以很大概率是学过设计模式和DDD理论的. 很大概率不是走一点都不懂设计模式和DDD理论这个极端, 而是走 ...
- C# 实现连连看功能
本文是利用C#实现连连看的小例子,以供学习分享使用.如有不足之处,还望指正. 思路: 初始化布局(横竖十行十列,共100个单元格,每一个格一个按钮,背景图为水果图片,随机生成) . 初始化对应棋盘(用 ...
- [TensorFlow]Tensor维度理解
http://wossoneri.github.io/2017/11/15/[Tensorflow]The-dimension-of-Tensor/ Tensor维度理解 Tensor在Tensorf ...
- html-edm(邮件营销)编写规则
最近写了一个edm邮件 以前没有接触过 使用的是很老的html页面编写规则 只能用table标签 在此记录一下edm编写的一些规则 个人参考的是这两个网址,转载一下 http://www.zco ...