爬虫进阶 之 Scrapy 框架 2(Item pipeline & scrapy shell 实例: 爬取ITcast 的完善)


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

可以看到

  1. 我把昨天Item 这个保存老师信息的列表注释了,并且使用了ItcastItem() 这个对象,这是是哪来的对象呢,这就是昨天说的 item.py 这个文件,我们说这个是暂时保存spider 爬取的数据,并且交给管道处理。
  2. 我使用的不再是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 这个类,然后爬取一下招聘信息

我又来要赞了,还是希望各位路过的朋友,如果觉得可以学到些什么的话,点个赞再走吧,欢迎各位路过的大佬评论,指正错误,也欢迎有问题的小伙伴评论留言,私信。每个小伙伴的关注都是我更博的动力》》》》奥里给

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值