15158846557 在线咨询 在线咨询
15158846557 在线咨询
所在位置: 首页 > 营销资讯 > 网站运营 > 第三章 第一节 Item与Pipeline

第三章 第一节 Item与Pipeline

时间:2023-06-03 14:00:01 | 来源:网站运营

时间:2023-06-03 14:00:01 来源:网站运营

第三章 第一节 Item与Pipeline:如果觉得文章对您产生帮助的话, 欢迎关注Python开发之路(微信公众号: python-developer), 获取更多教程

一、Item

Item是把非规范化的东西进行规范化, Item类就用来规定数据的字段结构

import scrapyclass ArticleItem(scrapy.Item): title = scrapy.Field() url = scrapy.Field() content = scrapy.Field()Item类继承的dict类型, 所以操作的方法和dict是一样的

item = ArticleItem()item['title'] = '这是一个文章的标题'item['url'] = 'http://www.baidu.com'# 获取一个item的值item.get('title')# 修改item的值item['title'] = '这是修改后的标题'# 获取所有的keyitem.keys()# 从dict中创建一个itemArticle({'title': '这是另外一个标题', 'url': 'http://www.qq.com'})# 判断key是否存在'title' in item# 复制一个itemitem.copy()

二、Pipeline

1. pipeline的基本使用

Pipeline 可以负责数据的清洗, 去重, 以及item的一些处理, 以及存储

Pipeline类含有的方法

process_item(self, item, spider)
每个item被传入pipeline后的实际处理类, item是传入的item, spider是指产生item的爬虫
open_spider(self, spider)
当指定的爬虫启动的时候被执行到的方法
spider: 被启动的爬虫
close_spider(self, spider)
当爬虫被关闭的时候调用的方法
spider: 被关闭的爬虫
from_crawler(cls, crawler)
当pipeline类被创建的时候调用的方法
现在可以查看一个pipeline的例子

from scrapy.exceptions import DropItemclass ArticlePipeline(object): def process_item(self, item, spider): if 'title' not in item: raise DropItem('Missing title in %s' item) else: # 存入数据库或者别的处理 return item # return item供别的pipeline继续处理 def open_spider(self, spider): spider.logger.info('pipeline被创建了!') def close_spider(self, spider): spider.logger.info('pipeline被关闭了')

2. 将pipeline配置进爬虫

在settings.py中

ITEM_PIPELINES = { 'testSpider.pipelines.ArticlePipeline': 300,}前面是指向pipeline的模块路径, 后面的300是优先级, 执行顺序是优先级从小到大。 所以当item产生的时候, 也是从较低的pipeline类中处理, 如果有return item, 则会继续在较高的pipeline中继续执行, 直到完毕。

三、Item和Pipeline结合的例子

这个例子我们抓取http://www.ccidcom.com这个网站,
抓取链接是http://www.ccidcom.com/yaowen/index.html

1. 编写Item规则

# items.pyimport scrapyclass ArticleItem(scrapy.Item): title = scrapy.Field() url = scrapy.Field()

2. 编写pipeline

我们编写输出传递到pipeline的item, 并且过滤重复的item

# pipelines.py# -*- coding: utf-8 -*-from scrapy.exceptions import DropItemclass ArticlePipeline(object): def __init__(self): self.title_sets = set() def process_item(self, item, spider): # 标题已存在, 则忽略, 否则输出 if item['title'] in self.title_sets: raise DropItem('重复的标题: %s' % item['title']) else: self.title_sets.add(item['title']) # 这里可以换成保存到数据库的方法 print(item) return item def open_spider(self, spider): spider.logger.info('pipeline被启动了!!!') def close_spider(self, spider): spider.logger.info('pipeline被关闭了!!!')现在将编写好的pipeline加入到settings.py文件

# settings.pyITEM_PIPELINES = { 'ccidcom.pipelines.ArticlePipeline': 300,}

3. 编写spider

# -*- coding: utf-8 -*-import scrapyfrom ccidcom.items import ArticleItemclass CcidcomspiderSpider(scrapy.Spider): name = 'ccidcomSpider' allowed_domains = ['ccidcom.com'] def start_requests(self): yield scrapy.Request('http://www.ccidcom.com/yaowen/index.html') def parse(self, response): # 解析获取到文章列表 article_list = response.css('div.article-item') # 循环selectorList for info in article_list: # 声明一个item对象 item = ArticleItem() # 解析页面并且将值赋值给item item['title'] = info.css( 'div.article-cont div.title a font::text').get() item['url'] = info.css( 'div.article-cont div.title a::attr("href")').get() # 将item yield到pipeline中 yield item

4. 运行爬虫

...# 这是我们开启的pipeline2019-10-30 21:09:24 [scrapy.middleware] INFO: Enabled item pipelines:['ccidcom.pipelines.ArticlePipeline']# 这是pipeline的open_spider方法输出的信息2019-10-30 21:09:24 [scrapy.core.engine] INFO: Spider opened2019-10-30 21:09:24 [ccidcomSpider] INFO: pipeline被启动了!!!...# 以下都是在pipeline的process_item的方法输出的数据{'title': '对话河源高新区党工委书记、管委会主任孙锋:向全球手机创新高地迈进', 'url': '/yaowen/20190930/hb5cY2QtjOcUQc2D116xpnpcdg7ok.html'}{'title': '中国移动牵头完成国际电信联盟《IMT-2020及未来网络智能化分级》标准', 'url': '/yaowen/20191030/h3OpxsU8p5UtmqwNQ170a1olcrlb0.html'}{'title': '信息通信展:“5G”议题刷屏 将成会议焦点', 'url': '/yaowen/20191029/lmntlfGvVHeE1PbAu1706elooedw4.html'}{'title': '2019中国5G终端创新峰会暨天鹅奖颁奖礼准备就绪,11月6日河源见!', 'url': '/yaowen/20191029/48d9nTli79xvCV4Jy1705qlyzz0b0.html'}{'title': '中兴通讯前三季度财报发布:净利41.3亿元 研发投入占比14.6%', 'url': '/yaowen/20191028/D38FPmYP3uktcVR5T1703xpvip21o.html'}{'title': '11月6日!2019中国手机设计最高奖天鹅奖河源揭晓!', 'url': '/yaowen/20191028/feFeeyFbKf1CoFnsi1702sslwodhc.html'}{'title': '直击七场对接会:“块状经济”如何快速驶入工业互联网', 'url': '/yaowen/20191028/jmmTZgwIsP6Y5ywvl1702qze9ixog.html'}{'title': '李颖:三举措推动工业互联网平台发展', 'url': '/yaowen/20191027/xMxGIGYNR9ecx4z6F1700n0ogf7hk.html'}{'title': '高通孟樸:5G商用前期主要服务大众,2020年将有更多手机支持5G', 'url': '/yaowen/20191026/Jm68cP3rhpFcTnJDG16zxnf7bpgjo.html'}{'title': '英特尔2019第三季度财报发布:营收192亿美元超预期', 'url': '/yaowen/20191025/1o6DjxQS5h9qVZKaY16zv9i7zbbq0.html'}...# 以下都是pipeline的close_spider2019-10-30 21:09:24 [scrapy.core.engine] INFO: Closing spider (finished)2019-10-30 21:09:24 [ccidcomSpider] INFO: pipeline被关闭了!!!

关键词:

74
73
25
news

版权所有© 亿企邦 1997-2025 保留一切法律许可权利。

为了最佳展示效果,本站不支持IE9及以下版本的浏览器,建议您使用谷歌Chrome浏览器。 点击下载Chrome浏览器
关闭