Scrapy框架中的Pipeline组件
简介
在下图中可以看到items.py与pipeline.py,其中items是用来定义抓取内容的实体;pipeline则是用来处理抓取的item的管道
Item管道的主要责任是负责处理有蜘蛛从网页中抽取的Item,他的主要任务是清晰、验证和存储数据。当页面被蜘蛛解析后,将被发送到Item管道,并经过几个特定的次序处理数据。每个Item管道的组件都是有一个简单的方法组成的Python类。获取了Item并执行方法,同时还需要确定是否需要在Item管道中继续执行下一步或是直接丢弃掉不处理。简而言之,就是通过spider爬取的数据都会通过这个pipeline处理,可以在pipeline中不进行操作或者执行相关对数据的操作。
管道的功能
1.清理HTML数据
2.验证解析到的数据(检查Item是否包含必要的字段)
3.检查是否是重复数据(如果重复就删除)
4.将解析到的数据存储到数据库中
Pipeline中的操作
process_item(item, spider)
每一个item管道组件都会调用该方法,并且必须返回一个item对象实例或raise DropItem异常。被丢掉的item将不会在管道组件进行执行。此方法有两个参数,一个是item,即要处理的Item对象,另一个参数是spider,即爬虫。
此外,我们也可以在类中实现以下方法
open_spider(spider)
当spider执行的时候将调用该方法
close_spider(spider)
当spider关闭的时候将调用该方法
定制自己的Pipeline组件:
1.生成json数据
class JsonWithEncodingPipeline(object):
def __init__(self):
self.file=codecs.open('article.json', 'w', encoding="utf-8")
def process_item(self, item, spider):
lines=json.dumps(dict(item), ensure_ascii=False) + '\n'
self.file.write(lines)
return item
def spider_closed(self, spider):
self.file.close()
2.操作mysql关系数据库
class MysqlPipeline(object):
def __init__(self):
self.conn=MySQLdb.connect('localhost', 'root', '*****', 'article_spider', charset="utf8", use_unicode=True)
self.cursor=self.conn.cursor()
def process_item(self, item, spider):
insert_sql="""
insert into article_items(title, url, url_object_id , create_date)
VALUES(%s, %s, %s, %s)
"""
self.cursor.execute(insert_sql, (item["title"], item["url"], item['url_object_id'], item["create_date"]))
self.conn.commit()
3.异步操作mysql关系数据库
# 异步处理关系数据库
class MysqlTwistedPipline(object):
def __init__(self, dbpool):
self.dbpool=dbpool
@classmethod
def from_settings(cls, settings):
dbparms=dict(
host=settings["MYSQL_HOST"], #这里要在settings中事先定义好
db=settings["MYSQL_DBNAME"],
user=settings["MYSQL_USER"],
passwd=settings["MYSQL_PASSWORD"],
charset="utf8",
cursorclass=MySQLdb.cursors.DictCursor,
use_unicode=True,
)
dbpool=adbapi.ConnectPool("MySQLdb", **dbparms)
return cls(dbpool)
def process_item(self, item, spider):
# 使用twisted将mysql插入变成异步执行
query = self.dbpool.runInteraction(self.do_insert, item)
query.addErrback(self.handle_error)
def handle_error(self, failure, item, spider):
#处理异步插入的异常
print(failure)
def do_insert(self, cursor, item):
#执行具体的插入
insert_sql = """
insert into article_items(title, url, url_object_id , create_date)
VALUES(%s, %s, %s, %s)
"""
self.cursor.execute(insert_sql, (item["title"], item["url"], item['url_object_id'], item["create_date"]))
4.数据去重
from scrapy.exceptions import DropItem
class DuplicatesPipeline(object):
def __init__(self):
self.ids_seen = set()
def process_item(self, item, spider):
if item['id'] in self.ids_seen:
raise DropItem("Duplicate item found: %s" % item)
else:
self.ids_seen.add(item['id'])
return item
使用组件
# Configure item pipelines
# See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
# 'ArticleSpider.pipelines.ArticlespiderPipeline': 300,
# 'scrapy.pipelines.images.ImagesPipeline': 1,
'ArticleSpider.pipelines.MysqlPipeline': 1,
# 'ArticleSpider.pipelines.JsonExporterPipeline': 2,
# 'ArticleSpider.pipelines.ArticleImagePipeline': 1
}
每个pipeline后面有一个数值,这个数组的范围是0-1000,这个数值是这些在pipeline中定义的类的优先级,越小越优先。
在异步处理数据库的时候会传递一个参数为后面的操作进行初始化,process_item()函数实际上是将处理的操作传回给这个_init__。
Scrapy框架中的Pipeline组件的更多相关文章
- scrapy框架中Item Pipeline用法
scrapy框架中item pipeline用法 当Item 在Spider中被收集之后,就会被传递到Item Pipeline中进行处理 每个item pipeline组件是实现了简单的方法的pyt ...
- Python爬虫从入门到放弃(十六)之 Scrapy框架中Item Pipeline用法
当Item 在Spider中被收集之后,就会被传递到Item Pipeline中进行处理 每个item pipeline组件是实现了简单的方法的python类,负责接收到item并通过它执行一些行为, ...
- Python之爬虫(十八) Scrapy框架中Item Pipeline用法
当Item 在Spider中被收集之后,就会被传递到Item Pipeline中进行处理 每个item pipeline组件是实现了简单的方法的python类,负责接收到item并通过它执行一些行为, ...
- Scrapy框架中的CrawlSpider
小思考:如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法). 方法二: ...
- scrapy框架中Spiders用法
scrapy框架中Spiders用法 Spider类定义了如何爬去某个网站,包括爬取的动作以及如何从网页内容中提取结构化的数据 总的来说spider就是定义爬取的动作以及分析某个网页 工作流程分析 以 ...
- Scrapy框架中选择器的用法【转】
Python爬虫从入门到放弃(十四)之 Scrapy框架中选择器的用法 请给作者点赞 --> 原文链接 Scrapy提取数据有自己的一套机制,被称作选择器(selectors),通过特定的Xpa ...
- scrapy框架中Download Middleware用法
scrapy框架中Download Middleware用法 Downloader Middleware处理的过程主要在调度器发送requests请求的时候以及网页将response结果返回给sp ...
- scrapy框架中选择器的用法
scrapy框架中选择器的用法 Scrapy提取数据有自己的一套机制,被称作选择器(selectors),通过特定的Xpath或者CSS表达式来选择HTML文件的某个部分Xpath是专门在XML文件中 ...
- Ant Design框架中不同的组件访问不同的models中的数据
Ant Design框架中不同的组件访问不同的models中的数据 本文记录了我在使用该框架的时候踩过的坑,方便以后查阅. 一.models绑定 在某个组件(控件或是页面),要想从某个models中获 ...
随机推荐
- ACM学习历程—CodeForces 601A The Two Routes(最短路)
题目链接:http://codeforces.com/problemset/problem/601/A 题目大意是有铁路和陆路两种路,而且两种方式走的交通工具不能在中途相遇. 此外,有铁路的地方肯定没 ...
- redis源码笔记 - redis-cli.c
这份代码是redis的client接口,其和server端的交互使用了deps目录下的hiredis c库,同时,在这部分代码中,应用了linenoise库完成类似history命令查询.自动补全等终 ...
- LCS(最长公共子序列问题)
LCS(Longest Common Subsequence),即最长公共子序列.一个序列,如果是两个或多个已知序列的子序列,且是所有子序列中最长的,则为最长公共子序列. 原理: 事实上,最长公 ...
- Python:str.ljust()、str.rjust()、str.center()函数
str.ljust().str.rjust().str.center()函数 功能:调整字符串站位宽度,并确定字符串对齐方式: #可以用其它字符填充字符: #字符串长度 = 字符串个数(包含空格.标点 ...
- Go语言命令行操作命令详细介绍
转自:http://www.jb51.net/article/56781.htm Go 命令 Go语言自带有一套完整的命令操作工具,你可以通过在命令行中执行go来查看它们: 图 Go命令显示详细的信息 ...
- oracle--pl/sql变量定义----
一.变量介绍 在编写pl/sql程序时,可以定义变量和常量:在pl/sql程序中包括有: 1).标量类型(scalar) 2).复合类型(composite) --用于操作单条记录 3).参照类型(r ...
- ORA-12504:tns:监听程序在 CONNECT_DATA中未获得SERVICE_NAME
在VS2008中创建一个数据源时,提示以下错误 “ORA-12504:tns:监听程序在 CONNECT_DATA中未获得SERVICE_NAME” 本机安装ORACLE客户端,找出以下路径的文件D: ...
- JDBC编程之数据更新
-------------------siwuxie095 JDBC 编程之数据更新 首先下载 MySQL 的 JDBC ...
- mac上如何查看gif
今天生成了一个gif,结果用mac自带的图片预览功能打开,图片被切成一张一张的,不是动图效果了.原以为还得下第三方看图软件,后来百度下发现mac本身也可以打开. 方法一: 鼠标右击图片,选择“快速查看 ...
- 获取显示屏的个数和分辨率 --- 通过使用OpenGL的GLFW库
获取显示屏的个数和分辨率 - 通过使用OpenGL的GLFW库 程序 #include <iostream> // GLFW #include <GLFW/glfw3.h> i ...