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的更多相关文章

  1. 爬取伯乐在线文章(四)将爬取结果保存到MySQL

    Item Pipeline 当Item在Spider中被收集之后,它将会被传递到Item Pipeline,这些Item Pipeline组件按定义的顺序处理Item. 每个Item Pipeline ...

  2. 第三天,爬取伯乐在线文章代码,编写items.py,保存数据到本地json文件中

        一. 爬取http://blog.jobbole.com/all-posts/中的所有文章     1. 编写jobbole.py简单代码 import scrapy from scrapy. ...

  3. 爬取伯乐在线文章(二)通过xpath提取源文件中需要的内容

    爬取说明 以单个页面为例,如:http://blog.jobbole.com/110287/ 我们可以提取标题.日期.多少个评论.正文内容等 Xpath介绍 1. xpath简介 (1) xpath使 ...

  4. Scrapy爬取伯乐在线文章

    首先搭建虚拟环境,创建工程 scrapy startproject ArticleSpider cd ArticleSpider scrapy genspider jobbole blog.jobbo ...

  5. scrapy爬取伯乐在线文章数据

    创建项目 切换到ArticleSpider目录下创建爬虫文件 设置settings.py爬虫协议为False 编写启动爬虫文件main.py

  6. python爬虫scrapy框架——爬取伯乐在线网站文章

    一.前言  1. scrapy依赖包: 二.创建工程 1. 创建scrapy工程: scrapy staratproject ArticleSpider 2. 开始(创建)新的爬虫: cd Artic ...

  7. 爬虫实战——Scrapy爬取伯乐在线所有文章

    Scrapy简单介绍及爬取伯乐在线所有文章 一.简说安装相关环境及依赖包 1.安装Python(2或3都行,我这里用的是3) 2.虚拟环境搭建: 依赖包:virtualenv,virtualenvwr ...

  8. Scrapy爬取伯乐在线的所有文章

    本篇文章将从搭建虚拟环境开始,爬取伯乐在线上的所有文章的数据. 搭建虚拟环境之前需要配置环境变量,该环境变量的变量值为虚拟环境的存放目录 1. 配置环境变量 2.创建虚拟环境 用mkvirtualen ...

  9. Scrapy基础(六)————Scrapy爬取伯乐在线一通过css和xpath解析文章字段

    上次我们介绍了scrapy的安装和加入debug的main文件,这次重要介绍创建的爬虫的基本爬取有用信息 通过命令(这篇博文)创建了jobbole这个爬虫,并且生成了jobbole.py这个文件,又写 ...

随机推荐

  1. Your local changes to the following files would be overwritten by merge:

    在服务器改动之后,用sourcetree提交会产生冲突,解决办法:

  2. 2; HTML 基本结构

    1. HTML 的基本结构 2. HTML 控制标记的格式 3. 最常用的控制标记 本章讲解最基本的 HTML 元素,也就是创建文档结构所需的元素.例如:标题.段落. 页面分隔.注释等等. 2.1 H ...

  3. [待优化笔记]原生JS实现验证框架 checkFun

    ;(function(){ /** 验证框架 checkFun * 使用方法: * <input class="required" type="text" ...

  4. 前端整理——css部分

    (1)盒模型(普通盒模型.怪异盒模型) 1.元素的content(内容).padding(内边距).border(边框).margin(外边距)构成了CSS盒模型 2.IE盒模型和W3C盒模型 1)I ...

  5. 基于Docker的TensorFlow机器学习框架搭建和实例源码解读

    概述:基于Docker的TensorFlow机器学习框架搭建和实例源码解读,TensorFlow作为最火热的机器学习框架之一,Docker是的容器,可以很好的结合起来,为机器学习或者科研人员提供便捷的 ...

  6. Android为TV端助力 史上最简单易懂的跨进程通讯(Messenger)!

    不需要AIDL也不需要复杂的ContentProvider,也不需要SharedPreferences或者共享存储文件! 只需要简单易懂的Messenger,它也称为信使,通过它可以在不同进程中传递m ...

  7. Android为TV端助力 handler ,message消息发送方式

    1.Message msg =  Message.obtain(mainHandler) msg.obj=obj;//添加你需要附加上去的内容 msg.what = what;//what消息处理的类 ...

  8. Android内存优化(三)详解内存分析工具MAT

    前言 在这个系列的前四篇文章中,我分别介绍了DVM.ART.内存泄漏和内存检测工具的相关知识点,这一篇我们通过一个小例子,来学习如何使用内存分析工具MAT. 1.概述 在进行内存分析时,我们可以使用M ...

  9. Testlink1.9.17使用方法(第十一章 其他易用性功能)

    第十一章 其他易用性功能 QQ交流群:585499566 一. 自定义 一). 自定义字段管理 在主页点击[自定义字段管理]按钮-->进入自定义字段管理页面,点击[创建]按钮,可以创建一个字段, ...

  10. Django创建新项目

    1.安装Django       终端中输入:pip install Django==2.1.4   等于号后面的为版本,选则适合自己python的版本,如下图   Django version Py ...