ITcast 后续 之 pipeline
昨天我们初步认识了Scrapy 并写了一个入门小案例,爬取了ITcast 的教师的信息,今天我们将使用管道和item来操作一下这个案例
Item pipeline
当item 在 spider 中被收集后, 会被传到 Item pipeline 组件按照定义的顺序处理item
每个Item pipeline 都是 实现了简单的python 方法类,比如决定是丢弃item 还是储存 ,最基本有下面三个
- 查重
- 保存到文件或数据库
- 验证爬取的数据
话不多说,先看看我们主程序,itcast.py ,伙伴们可以对照昨天的代码来看,更清楚
# -*- coding: utf-8 -*-
import scrapy
from ITcast.items import ItcastItem
class ItcastSpider(scrapy.Spider):
name = 'itcast'
allowed_domains = ['itcast.cn'] # 这个里面没有http这些东西,直接写后面的主机
# 爬虫的第一个请求就是这里面的
start_urls = ['http://www.itcast.cn/channel/teacher.shtml#apython']
def parse(self, response): # 这个是解析的部分,默认执行这个解析
# 保存老师信息的集合
# Items = []
teacherlist = response.xpath(
"//div[@class='li_txt']")
for t in teacherlist:
#item 是 items.py 里封装的对象ItcastItem()
item = ItcastItem()
# extract 返回的是一个unicode 字符串,如果不用这个方法,返回的还是一个xpath对象列表,里面有个data是数据.
name = t.xpath("./h3/text()").extract()
title = t.xpath("./h4/text()").extract()
info = t.xpath("./p/text()").extract()
# 还是列表,我们取下标来得到其中内容
item["name"] = name[0]
item["title"] = title[0]
item["info"] = info[0]
# Items.append(item)都保存在Items这个列表,如果数据量大了会很费内存,我们用写一个管道来操作
# 用yield 在for 循环里返回,每次都是返回给管道处理。然后继续执行for循环
yield item
# 用retrun 返回完后,函数就结束了,不经过管道
# return Items
可以看到
- 我把昨天
Item
这个保存老师信息的列表注释了,并且使用了ItcastItem()
这个对象,这是是哪来的对象呢,这就是昨天说的 item.py 这个文件,我们说这个是暂时保存spider 爬取的数据,并且交给管道处理。 - 我使用的不再是return item ,而是再for 循环里使用了 yield item 这个方法,这两个的区别代码里的注释很清楚了,就不细说了。
下面我们看看 items.py 和 pipelines.py 这两个文件,
在item.py 里我们定义了ItcastItem() 这个类
# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html
import scrapy
class ItcastItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
# pass
# 老师姓名
name = scrapy.Field()
# 老师的职位
title = scrapy.Field()
# 老师简介
info = scrapy.Field()
这里,Field()我们可以看一看他的源码,是一个python的字典,使用这个方法就是定义类似字典里的键,
管道文件 pipelines.py 就是我们 yield 这个方法返回的位置,管道拿到数据后,就开始了处理
# -*- coding: utf-8 -*-
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
# 记得去setting 里把管道的注释打开
import json
class ItcastPipeline(object):
def __init__(self):
# pass
self.f = open("itcast_pipelinee.json", "w")
# self.f = open("itcast_pipeline.csv", "w")
# 这个函数就接受爬虫返回的item ,然后可以处理了
def process_item(self, item, spider):
content = json.dumps(dict(item), ensure_ascii=False) + ",\n"
self.f.write(content)
# 这里还是要返回,返回给引擎,告诉它,item已经处理完了
return item
# pass
def close_spider(self, spider):
self.f.close()
可以看到,我们初始化了一个 json文件 并把字典使用json 的 dumps 方法转换为字符串类型,写入了文件,当然记得去setting文件里打开管道的配置项,可以看到,setting里管道的名字默认的就是process_item 所以当item 返回时,就执行这个函数。当然,在爬虫结束后,我们还要执行关闭文件的操作。
最后我们就可以在项目位置打开cmd 输入 指令scrapy crawl itcast
来执行爬虫了。我们在那个位置运行,写入的文件就回在当前位置,好了,看看结果吧。
这个json 的截图是我忘了取列表的第一个元素,所以是个列表,如果按照我代码里取了下标,那么就直接是字符串。
好了昨天的实例就说这么多,如果小伙伴写入后有乱码等问题,欢迎私聊,评论。
Scrapy shell
这个是个好东西,虽然不算重要,但是,它可以模拟scrapy发送请求
在cmd里执行
scrapy shell "http://www.itcast.cn/channel/teacher.shtml#apython"
执行完后会有响应返回, 返回的就是我们引号里的url 请求到的东西
response.body
将输出response 的整体内容
我们如果怕xpath 解析错误就可以在这里测试, 执行 response.xpath("//h3")
就回返回所有的 h3 标签
还可以
itemlist=response.xpath("//h3").extract()
for i in itemlist:
print (i)
这样就取到了内容,同样的还有
css():传入css表达式,返回表达式对应的节点的所有列表,需要用extract()来序列化节点为Unicode 字符串
re();根据正则表达式提取数据,返回Unicode字符串列表
明天继续学习 scrapy spider 这个类,然后爬取一下招聘信息
我又来要赞了,还是希望各位路过的朋友,如果觉得可以学到些什么的话,点个赞再走吧,欢迎各位路过的大佬评论,指正错误,也欢迎有问题的小伙伴评论留言,私信。每个小伙伴的关注都是我更博的动力》》》》奥里给