前言
"又回到最初的起点,申请日期为2017年4月。专利摘要显示,呆呆地站在镜子前"。
本来这篇是打算写Spider中间件的,本发明提供一种检测方法及装置,但是因为这一块涉及到Item,通过确定终端群组和对应的相同发单UE形成的UE群组为群组并作出处罚操作,所以这篇文章先将Item讲完,达到了防止司机群体和乘客群体合作刷单的目的,顺便再讲讲Pipeline,净化了打车服务行业。,然后再讲Spider中间件。
Item和Pipeline
依旧是先上架构图。
Scrapy架构
从架构图中可以看出,当下载器从网站获取了网页响应内容,通过引擎又返回到了Spider程序中。我们在程序中将响应内容通过css或者xpath规则进行解析,然后构造成Item对象。
而Item和响应内容在传递到引擎的过程中,会被Spider中间件进行处理。最后Pipeline会将引擎传递过来的Item持久化存储。
总结:Item是数据对象,Pipeline是数据管道。
模块
Item
Item说白了就是一个类,里面包含数据字段。目的是为了让你把从网页解析出来的目标数据进行结构化。需要注意的是,我们通常要先确定Item的结构,然后再在程序中构造、在pipeline中处理。
这里依旧还是以斗罗为例。
Item类定义
Item在「items.py」中定义。我们先看看此py文件中的Item定义模板。
items.py
如图所示,即是模板,要点有二。
Item类继承scrapy.Item
字段 =scrapy.Field()
这里根据我们在斗罗页面需要采集的数据字段,进行Item定义。
Item数据构造
当我们将Item类定义之后,就要在spider程序中进行构造,即填充数据。
代码如上,一个Item数据对象就被构造完成。
发射Item到Pipeline
在Item对象构造完成之后,还需要一行代码就能将Item传递到Pipeline中。
至此,Pipeline,我来了。
Pipeline
Pipeline直译就是管道,负责处理Item数据,从而实现持久化。说白了就是将数据放到各种形式的文件、数据库中。
功能
官方给出的Pipeline功能有:
清理HTML数据
验证数据(检查item包含某些字段)
查重(并丢弃)
将爬取结果保存到数据库
在实际中,4的场景比较多。
定义Pipeline
Pipeline定义在pipeline.py中,这里依旧先看看Pipeline给定的模板。
如图,只实现了process_item()方法,来处理传递过来的Item。但是在实际中,我们通常要实现三个方法:
__init__:用来构造对象属性,例如数据库连接等
from_crawler:类方法,用来初始化变量
process_item:核心逻辑代码,处理Item
这里,我们就自定义一个Pipeline,将Item数据放入数据库。
配置Pipeline
和middleware一样在settings.py中进行配置,这里对应的是ITEM_PIPELINE参数。
Key依旧对应的是类全路径,Value为优先级,数字越小,优先级越高。Item会根据优先级依次通过每个Pipeline,这样可以在每个Pipeline中对Item进行处理。
为了直观,后续我将Pipeline在代码中进行配置。
pipeline连接数据库
1. 配置数据库属性
我们首先在setttings.py中将数据库的IP、账号、密码、数据库名称配置,这样在pipeline中就可直接读取,并创建连接。
2. 定义pipeline
主要使用pymysql驱动连接数据库、twisted的adbapi来异步操作数据库,这里异步划重点,基本上异步就是效率、快的代名词。
这里要重点强调一下上面代码中的几个点。
process_item()中为什么使用isinstance来判断item的类型?
这个是为了解决多种Item经过同一个Pipiline时,需要调用不同的方法来进行数据库操作的场景。如下图所示:
不同的Item具有不同的结构,意味着需要不同的sql来插入到数据库中,所以会先判断Item类型,再调用对应方法处理。
sql中update、describe字段为什么要加反引号?
update、describe和select一样,都是MySQL的关键字,所以如果想要在字段中使用这些单词,在执行sql和建表语句汇总都要加上反引号,否则就会报错。
3. 生成Item放入pipeline
即将迎面而来的依旧是熟悉的代码,Item结构在上面的items.py中已经定义。pipeline也将在代码内配置,这个不清楚的可以看第二篇文章。
4.程序测试
启动程序,可以看到控制台打印了已经启用的pipeline列表,同时也可以看到item的内容。程序执行结束后,我们去数据库查看数据是否已经放到数据库。
如图,在数据库的DLDLItem表中已经可以查到数据。
结语
Item和Pipeline让数据结构存储流程化,我们可以定义并配置多个Pipeline,Scrapy入门到放弃03:理解Settings配置,监控Scrapy引擎当yield item之后,数据就会根据存储在文件里、数据库里
与之相关的还有一个ItemLoaders,我基本上没有用过,但是后面还是当做扩展来写一下。期待下一次相遇。
感谢每一份关注
标签: