Python爬虫-Scrapy框架(三)- 爬虫数据入库

版权声明:版权声明 https://blog.csdn.net/sunzhihao_future/article/details/88699878

写在前面

之前,我们已经获取到了想要爬取的数据,现在想要将其存储在数据库中,在这里选择SQLite数据库。这一部分主要是爬虫数据入库的内容。这里的内容承接上一篇文章。

爬虫数据入库

创建数据库

这里选择ipython作为交互式命令工具,其相比于python自带的交互式命令模式使用更加方便。打开PyCharm中的Terminal终端,通过命令 ipython 进入ipython工具。

成功进入之后,首先导入SQLite。
In [1]: import sqlite3
接下来连接数据库,如果这里要连接的数据库名称不存在,则会自动创建该数据库。
In [2]: blog = sqlite3.connect(“blog.sqlite”)
数据应该被保存在数据库的表格中,接下来在数据库中创建表格,同样采用sqlite命令。
In [3]: create_table = “create table blog (num varchar(128))”
现在直接通过sqlite语言命令执行刚才建立的命令。
In [4]: blog.execute(create_table)
提示cursor。
Out[4]: <sqlite3.Cursor at 0x268536ee730>

最后通过命令 exit 断开。在工程文件里会出现sqlite文件,将其拖动至Database工作区,可以打开该sqlite文件。

sqlite
稍等一段时间后,可以找到已经创建好的数据库以及数据库中的num表格。

sqlite

SQLite显示异常处理

在新安装的PyCharm中可能会出现一种异常,将新建好的blog.sqlite拖动到Database打开后会发现名字下面出现波浪线,显然这是一个错误提示。点击下拉按钮,发现其中并没有出现刚刚创建的表格,这是由于我们需要下载一些东西来支持SQLite。

Sqlite
这里我们并不需要自己去寻找缺失的文件,可以采用这种方式直接安装。点击新建按钮,在选项中选择SQLite。

Sqlite
这里会发现在左下角出现了感叹号,提示missing driver files,我们直接点击Download,待下载完成时,点击Apply,会发现波浪线消失,同时我们也可以在下属目录中找到创建好的blog。

Sqlite

启用管道文件

之前我们在csdn_sun.py爬虫文件中编写的爬虫只是用来获得数据,并不能完成将获得的数据存入到数据库中的工作。所有获得的数据是在pipelines.py管道文件中进行清理和入库工作,接下来开始设置爬虫管道启用以及添加到整个爬虫工程中。

打开pipelines.py文件,找到类名,此处为CsdnSunPipeline。

pipelines
打开settings.py文件,找到ITEM_PIPELINES,将其取消注释,并检查其中的类名是否替换为刚才在管道文件中确定的类名CsdnSunPipeline,修改后的代码如下。pipelines

ITEM_PIPELINES = {
    'csdn_sun.pipelines.CsdnSunPipeline': 300,
}

我们如何连接爬虫文件与管道文件呢? 在Scrapy框架中,我们必须通过items.py文件中的类,才可以将爬虫文件与管道文件连接起来实现相应功能,因此在这里要修改items.py文件以及之前的csdn_sun.py文件。

在items.py文件中修改CsdnSunItem类,代码如下。

# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# http://doc.scrapy.org/en/latest/topics/items.html

import scrapy


class CsdnSunItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    num = scrapy.Field()
    # pass

在csdn_sun.py文件中导入CsdnSunItem,创建一个类的实例,将获取的数据赋值给该实例,代码如下。

import scrapy
from ..items import CsdnSunItem


class BlogSpider(scrapy.Spider):
    name = "blog"
    start_urls = ['https://blog.csdn.net/sunzhihao_future']

    def parse(self, response):
        print(response)
        csdn = CsdnSunItem()
        num_list = response.xpath("/html/body[@class='nodata ']/div[@id='mainBox']/main"
                                  "/div[@class='article-list']/div[@class='article-item-box csdn-tracking-statistics']"
                                  "/div[@class='info-box d-flex align-content-center']/p[3]"
                                  "/span[@class='read-num']/span[@class='num']/text()").extract()
        for i in num_list:
            csdn['num'] = i
            yield csdn
            # print(i)

数据入库

接下来继续添加代码,实现将管道文件中数据存储至数据库的这一部分功能。
打开pipelines.py管道文件,导入sqlite3,随后添加以下函数:
open_spider - 爬虫启动时执行该函数,将管道文件连接SQLite数据库。
spider_close - 爬虫结束时执行该函数,关闭数据库。
接下来修改以下函数:
process_item - 该函数将爬虫获得的数据,即在items.py文件中的item调入到管道文件中。这里首先定义插入语句,将数据插入到表格;采用execute语句来执行insert_sql命令。此外,数据库的插入和更新操作后需要提交操作。

# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html
import sqlite3


class CsdnSunPipeline(object):
    def open_spider(self, spider):
        self.con = sqlite3.connect("blog.sqlite")
        self.cu = self.con.cursor()

    def process_item(self, item, spider):
        print(spider.name, 'pipelines')
        insert_sql = "insert into blog (num) values ('{}')".format(item['num'], " ")
        print(insert_sql)
        self.cu.execute(insert_sql)
        self.con.commit()
        return item

    def spider_close(self, spider):
        self.con.close()

问题与解决

关闭整个项目,重新打开项目文件时,打开Terminal终端通过scrapy crawl blog执行爬虫时报错如下:

C:\Users\Lenovo\Desktop>scrapy crawl blog
Scrapy 1.4.0 - no active project
Unknown command: crawl
Use “scrapy” to see available commands

这里通常是因为目录位置错误,可以通过cd命令前往爬虫项目所在的文件夹,以此处为例,即进入C:\Users\Lenovo\Desktop\Scrapy\csdn_sun根目录后,重新执行命令,即可解决此报错。
error
到这里,已经简单的接触到了数据库的内容,同时对于一些管道文件中的代码的掌握还不够,相信会在后面的学习中不断深入理解。接下来将进入内置爬虫类型的学习。

猜你喜欢

转载自blog.csdn.net/sunzhihao_future/article/details/88699878