Scrapy爬虫框架第七讲【ITEM PIPELINE用法】

ITEM PIPELINE用法详解:

 ITEM PIPELINE作用:

  • 清理HTML数据
  • 验证爬取的数据(检查item包含某些字段)
  • 去重(并丢弃)【预防数据去重,真正去重是在url,即请求阶段做】
  • 将爬取结果保存到数据库中



ITEM PIPELINE核心方法(4个)

(1)、open_spider(spider)

(2)、close_spider(spider)

(3)、from_crawler(cls,crawler)

(4)、process_item(item,spider)

下面小伙伴们我们依次来分析:

1、open_spider(spider) 【参数spider 即被开启的Spider对象】

该方法非必需,在Spider开启时被调用,主要做一些初始化操作,如连接数据库等

2、close_spider(spider)【参数spider 即被关闭的Spider对象】

该方法非必需,在Spider关闭时被调用,主要做一些如关闭数据库连接等收尾性质的工作

3、from_crawler(cls,crawler)【参数一:Class类 参数二:crawler对象】

该方法非必需,Spider启用时调用,早于open_spider()方法,是一个类方法,用@classmethod标识,它与__init__函有关,这里我们不详解(一般我们不对它进行修改)

4、process_item(item,spider)【参数一:被处理的Item对象 参数二:生成该Item的Spider对象】

该方法必需实现,定义的Item pipeline会默认调用该方法对Item进行处理,它返回Item类型的值或者抛出DropItem异常



实例分析(以下实例来自官网:https://doc.scrapy.org/en/latest/topics/item-pipeline.html)

 1 from scrapy.exceptions import DropItem
 2
 3 class PricePipeline(object):
 4
 5     vat_factor = 1.15
 6
 7     def process_item(self, item, spider):
 8         if item[‘price‘]:
 9             if item[‘price_excludes_vat‘]:
10                 item[‘price‘] = item[‘price‘] * self.vat_factor
11             return item
12         else:
13             raise DropItem("Missing price in %s" % item)

代码分析:

首先定义了一个PricePipeline类

定义了增值税税率因子为1.15

主函数process_item方法实现了如下功能:判断Item中的price字段,如没计算增值税,则乘以1.15,并返回Item,否则直接抛弃

总结:该方法要么return item给后边的管道处理,要么抛出异常



数据去重

 1 from scrapy.exceptions import DropItem
 2
 3 class DuplicatesPipeline(object):
 4
 5     def __init__(self):
 6         self.ids_seen = set()
 7
 8     def process_item(self, item, spider):
 9         if item[‘id‘] in self.ids_seen:
10             raise DropItem("Duplicate item found: %s" % item)
11         else:
12             self.ids_seen.add(item[‘id‘])
13             return item

代码分析:

首先定义了一个DuplicatesPipeline类

这里比上面多了一个初始化函数__init__,set()---去重函数

主函数process_item方法首先判断item数据中的id是否重复,重复的就将其抛弃,否则就增加到id,然后传给下个管道



将数据写入文件

 1 import json
 2
 3 class JsonWriterPipeline(object):
 4
 5     def open_spider(self, spider):
 6         self.file = open(‘items.jl‘, ‘w‘)
 7
 8     def close_spider(self, spider):
 9         self.file.close()
10
11     def process_item(self, item, spider):
12         line = json.dumps(dict(item)) + "\n"
13         self.file.write(line)
14         return item

代码分析:

首先我们定义了一个JsonWritePipeline类

定义了三个函数:

first:open_spider()在Spider开启时启用作用很简单即打开文件,准备写入数据

second:close_spider()在Spider关闭时启用作用也很简单即关闭文件

third(主要):process_items()作用如下首先将item转换为字典类型,在用json.dumps()序列化为json字符串格式,再写入文件,最后返回修改的item给下一个管道



综合实例

 1 import pymongo
 2
 3 class MongoPipeline(object):
 4
 5     collection_name = ‘scrapy_items‘
 6
 7     def __init__(self, mongo_uri, mongo_db):
 8         self.mongo_uri = mongo_uri
 9         self.mongo_db = mongo_db
10
11     @classmethod
12     def from_crawler(cls, crawler):
13         return cls(
14             mongo_uri=crawler.settings.get(‘MONGO_URI‘),
15             mongo_db=crawler.settings.get(‘MONGO_DATABASE‘, ‘items‘)
16         )
17
18     def open_spider(self, spider):
19         self.client = pymongo.MongoClient(self.mongo_uri)
20         self.db = self.client[self.mongo_db]
21
22     def close_spider(self, spider):
23         self.client.close()
24
25     def process_item(self, item, spider):
26         self.db[self.collection_name].insert(dict(item))
27         return item

代码分析:

首先我们定义了一个MongoPipeline类

这里我们修改了初始化函数__init__,给出了存储到Mongodb的链接地址和数据库名称所以更改了from_crawler()工厂函数函数(生产它的对象),这里指定了链接地址和数据表名称

最后我们定义了三个函数:

first:open_spider()在Spider开启时启用作用是打开mongodb数据库

second:close_spider()在Spider关闭时启用作用是关闭数据库

third:process_items()作用如下在数据库中插入item



项目实战:(我们以58同城镇江房屋出租为例)抓取出租信息的标题、价格、详情页的url

我是在ubuntu16.04环境下跑的

启动终端并激活虚拟环境:source course_python3.5/bin/activate

创建一个新目录project:mkdir project

创建项目:scrapy startproject city58-----cd city58----创建爬虫(这里小伙伴们注意项目名不能与爬虫名重名)scrapy genspider city58_test

下面我们正式开始

(1)、修改items.py

(2)修改city58_test.py文件(这里我们使用pyquery选择器)

(3)、重点来了,修改pipelines.py文件,小伙伴们可参考上面的案例分析

(4)最后通过settings.py启动pipeline

这里向小伙伴们科普一个小知识点:后面的数字是优先级,数字越小,越优先执行

(5)项目运行结果(部分)----下次小伙伴们想了解出租信息可以找我,我帮你秒下。哈哈!

并且我们可以在同级目录下找到我们写入的文件

总结:

(1)、首先了解了管道的作用

(2)、掌握了核心的方法,其中特别是process_item()方法

(3)、最后我们通过实例和项目进行实战,后面我们会继续学习如何使用管道进行高级的操作,敬请期待,记得最后一定要在配置文件中开启Spider中间件

原文地址:https://www.cnblogs.com/518894-lu/p/9053939.html

时间: 2024-11-05 20:41:03

Scrapy爬虫框架第七讲【ITEM PIPELINE用法】的相关文章

Scrapy爬虫框架第一讲(Linux环境)

1.What is Scrapy? 答:Scrapy是一个使用python语言(基于Twistec框架)编写的开源网络爬虫框架,其结构清晰.模块之间的耦合程度低,具有较强的扩张性,能满足各种需求.(前面我们介绍了使用requests.beautifulsoup.selenium等相当于你写作文题,主要针对的是个人爬虫:而Scrapy框架的出现给了我们一个方便灵活爬虫程序架构,我们只需针对其中的组件做更改,即可实现一个完美的网络爬虫,相当于你做填空题!) 基于Scrapy的使用方便性,下面所有的S

一个咸鱼的python爬虫之路(五):scrapy 爬虫框架

介绍一下scrapy 爬虫框架 安装方法 pip install scrapy 就可以实现安装了.我自己用anaconda 命令为conda install scrapy. 1 Engine从Spider处获得爬取请求(Request)2Engine将爬取请求转发给Scheduler,用于调度 3 Engine从Scheduler处获得下一个要爬取的请求4 Engine将爬取请求通过中间件发送给Downloader5 爬取网页后,Downloader形成响应(Response)通过中间件发给En

Python之Scrapy爬虫框架安装及简单使用

题记:早已听闻python爬虫框架的大名.近些天学习了下其中的Scrapy爬虫框架,将自己理解的跟大家分享.有表述不当之处,望大神们斧正. 一.初窥Scrapy Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. 其最初是为了 页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫. 本文档将

Python爬虫教程-31-创建 Scrapy 爬虫框架项目

本篇是介绍在 Anaconda 环境下,创建 Scrapy 爬虫框架项目的步骤,且介绍比较详细 Python爬虫教程-31-创建 Scrapy 爬虫框架项目 首先说一下,本篇是在 Anaconda 环境下,所以如果没有安装 Anaconda 请先到官网下载安装 Anaconda 下载地址:https://www.anaconda.com/download/ Scrapy 爬虫框架项目的创建 0.打开[cmd] 1.进入你要使用的 Anaconda 环境 1.环境名可以在[Pycharm]的[Se

【Scrapy】Scrapy爬虫框架的基本用法

Scrapy爬虫框架的基本用法 Scrapy爬虫框架是一个好东西,可以十分简单快速爬取网站,特别适合那些不分离前后端的,数据直接生成在html文件内的网站.本文以爬取 杭电OJ http://acm.hdu.edu.cn 的题目ID和标题为例,做一个基本用法的记录 可参考 https://www.jianshu.com/p/7dee0837b3d2 安装Scrapy 使用pip安装 pip install scrapy 代码编写 建立项目 myspider scrapy startproject

scrapy爬虫框架(四)-爬取多个网页

scrapy爬虫框架(四) 爬取多个网页 思路:通过判断句子控网站中,下一页是否还有a标签来获取网址,拼接后继续爬取,最终写入json文件中. juziSpider.py # -*- coding: utf-8 -*- import scrapy from juzi.items import JuziItem class JuzispiderSpider(scrapy.Spider): name = 'juziSpider' allowed_domains = ['www.juzikong.co

一篇文章教会你理解和定义Scrapy爬虫框架中items.py文件

在前面几篇文章中我们已经学会了如何了编写Spider去获取网页上所有的文章链接及其对应的网页目标信息.在这篇文章中,我们将主要介绍Scrapy中的Item. 在介绍Item之前,我们需要知道明确一点,网络爬虫的主要目标就是需要从非结构化的数据源中提取出结构化的数据,在提取出结构化的数据之后,怎么将这些数据进行返回呢?最简单的一种方式就是将这些字段放到一个字典当中来,然后通过字典返回给Scrapy.虽然字典很好用,但是字典缺少一些结构性的东西,比方说我们容易敲错字段的名字,容易导致出错,比方说我们

scrapy爬虫框架(五)-CrawlSpider

scrapy爬虫框架(五)-CrawlSpider 通过CrawlSpider的链接提取器爬取微信小程序社区的文章 创建爬虫文件 此前要进入爬虫文件夹,使用cd命令,再创建模版(templ)爬虫 scrapy genspider -t crawl 爬虫名 网站域名 # -*- coding: utf-8 -*- import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import Craw

Scrapy爬虫框架的使用

#_author:来童星#date:2019/12/24# Scrapy爬虫框架的使用#1.安装Twisted模块 https://www.lfd.uci.edu/~gohlke/pythonlibs/#2.单击Twisted索引import scrapyfrom scrapy.crawler import CrawlerProcess# 导入获取项目设置信息from scrapy.utils.project import get_project_settingsclass QuotesSpid