爬虫知识8:数据存储的需求实现,Item、Pipeline介绍

   scrapy提取的信息可以保存在文件(csv、txt、json)中,或者数据库中。而scrapy中的Pipeline则是专门用来保存数据的模块。

    以下以爬取豆瓣TOP250电影为例,分别介绍4种不同的数据保存和展示方式。且在案例3和案例4分别介绍了item和pipelines的知识

  • 案例1:不保存到文件,只在屏幕打印出来。直接用print语句即可。

  • 案例2:保存到文件,但不使用items返回数据,初级保存

  • 案例3:保存到文件,使用items返回数据。但无法对保存的数据进行修改。

  • 案例4:保存到文件,同时使用item和pipeline,可以实现对数据处理后再保存。


案例1、不保存到文件,只在屏幕打印出来。直接用print语句即可。

则如下爬虫程序可满足:

640?wx_fmt=png&wxfrom=5&wx_lazy=1


运行runspider.py文件,即可得到所有的电影名称和网址。


案例2:保存到文件,不使用items返回数据,也不对文件做任何处理。也即仅在spider中实现初级保存。

以下爬虫程序即可满足:新增语句在画对勾的地方。主要是打开和写入文件语句。

640?wx_fmt=png

640?wx_fmt=png

案例3:保存到文件,使用items返回数据。但无法对保存的数据进行修改。

运行方式:返回数据后直接在命令行写保存的文件

3-1关于items介绍

    爬虫的目的是为了从非结构性的数据源提供结构性数据,蜘蛛中的parse,解析出来url、title、time、content等数据,但是如何将这些数据包装成结构化的数据呢?scrapy提供了item类来满足这样的需求。Item对象是一种简单的容器,荣来保存爬取到的数据,提供了类似于字典的API以及用于声明可用字段的简单语法。

关于item的一些知识:

  • item:保存提取的数据,类似于字典的形式。

  • item的结构定义:   使用简单的class定义语法以及Field对象来生命。

640?wx_fmt=png

  • Field可以指向任意类型的字段;

  • Item赋值:item['title']="xxxx",其中的title可以为任意的名字

  • Spider中使用yield 处理item对象:需要再parse中导入

    640?wx_fmt=png

  • 支持的存储格式为csv、json、xml

如果在命令行直接输入,语句分别为:

  • Json格式:scrapy crawl 爬虫名称 -t json -o 文件名称.json,如果需要转码则可写成:scrapy crawl 爬虫名称 -t json -o 文件名称.json -s FEED_EXPORT_ENCODING='utf-8'

  • csv格式:scrapy crawl 爬虫名称 -t csv -o 文件名称.csv

  • TXT格式:scrapy crawl 爬虫名称 -t txt -o 文件名称.txt

存储的问题:

  • FEED_URL:存储路径

  • FEED_FORMAT:存储格式

  • FEED_EXPORT_ENCODING:存储编码

  • FEED_EXPORT_FIELDS:存储字段


3-2 程序的实现

这个程序需要对3个py文件做修改:爬虫程序.py、items.py、运行爬虫的程序.py


1)自己写的爬虫程序spider_ex1.py如下:

640?wx_fmt=png


2) items.py的程序如下:

640?wx_fmt=png


3)运行爬虫的程序,新建一个runspider.py文件,程序如下。使用这个程序就可以直接在pycharm中运行程序了,不需要切换到命令栏再运行爬虫了。

如果要保存其他格式,则参考语法改成txt、或者json对应的语句。

640?wx_fmt=png

如果是json,需要转码,可使用以下语句

640?wx_fmt=png

运行runspider.py文件,即可得到想要结果。


案例4::保存到文件,同时使用item和pipeline,可以实现数据处理后再保存。

4-1 关于pipeline介绍

    当Item在Spider中被收集之后,它将会被传递到Item Pipeline,这些Item Pipeline组件按定义的顺序处理Item。主要任务是清洗、验证和存储数据。每个Item Pipeline都是实现了简单方法的Python类,因此我们也可以编写自己的Item Pipeline。以下是item pipeline的一些典型应用:

  • 清理HTML数据

  • 验证解析到的数据(检查Item是否包含必要的字段)

  • 检查是否是重复数据(如果重复就删除)

  • 将解析到的数据存储到数据库或文件

 

可以在Pipeline.py类的以下方法中自定义功能:

  • open_spider:spider打开时调用,比如打开存储文件的动作放在这里

  • close_spider:spider结束时调用,比如关闭存储文件的动作放在这里

  • process_item:会对每一个item进行处理,且必须返回一个item对象实例或raise DropItem异常。如果是丢弃item,则被丢掉的item将不会在管道组件进行执行。

  • from_crawler:创建一个pipeline实例,可以访问settings.py中自定义的变量。比如获取文件路径的变量path=crawler.settings.getint('PATH')。settings中的变量必须大写

  • _init_方法:封装参数。


丢弃item的方法:

    如果不丢弃,则使用语句“return item”,如果需要丢弃,则先导入模块“from scrapy.exceptions import DropItem”,再使用语句“raise DropItem()”

640?wx_fmt=png

如果想将pipeline单独应用于一个蜘蛛,可通过此语句

if spider.name=='test'


Pipeline设置:

在settings.py文件中,找到字典“ITEM_PIPELINES”,激活如下:

640?wx_fmt=png

可以添加多个PIPELINES,谁的序号小先执行谁。


4-2爬虫的程序实现

这个程序执行对应的5个py文件:爬虫程序.py、items.py、settings.py、pipelines.py、运行爬虫的程序.py


1)爬虫程序.py,和案例3相同,只需要有item即可

640?wx_fmt=png


2)items.py的程序如下,和案例3一样,需要用items都要这样设置

640?wx_fmt=png


3)pipelines.py程序,因为要实现同时保存到text文件和json文件中,要写两个pipeline文件。当然也可以写更多的。

  • 第一个直接在pipline中写路径

640?wx_fmt=png

  • 第二个pipeline使用settings.py中自定义的参数获取路径

640?wx_fmt=png

4)settings.py,需要把ITEM_PIPELINES激活,对应的写上两个pipelines。序号小的优先执行。

640?wx_fmt=png

自定义的路径参数:

640?wx_fmt=png

5)运行爬虫的程序,新建一个runspider.py文件,程序如下。使用这个程序就可以直接在pycharm中运行程序了,不需要切换到命令栏再运行爬虫了。

640?wx_fmt=png

运行runspider.py文件,即可得到想要结果。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值