Logo

郎哥编程

爬取的数据存储到数据库

2020-12-16 278

一般来说,爬虫爬取的内容会存储到数据库,然后由数据分析程序对爬取的数据进行分析。

下面在百度新闻爬虫项目基础上,对项目进行改进,将爬虫爬取的内容存储到MySQL数据库,项目改进步骤如下:

(1)   安装pymysql模块;

(2)   创建MySQL数据库及表结构;

(3)   修改settings.py配置文件;

(4)   建立dbhelp文件;

(5)   添加数据库存储pipelinesmysql.py管道类文件;

(6)   运行爬虫。

1、安装pymysql模块

pymysql是Python用于操作MySQL数据库的模块。若没有安装pymysql模块,需要先安装pymysql模块。

在Windows命令行窗口输入命令:

pip3 install pymysql

pip3会自动下载lxml并安装。

2、 创建MySQL数据库及表结构

在MySQL数据库管理系统建立baidunews数据库,建立表news,表结构如下:

021.PNG

3、 修改settings.py配置文件

在settings.py配置文件修改ITEM_PIPELINES配置项,添加数据库存储管道类NewsbaiduPipeMySql, 该类会在后面创建, 修改后的ITEM_PIPELINES配置项为:

ITEM_PIPELINES = {
  'newsbaidu.pipelines.NewsbaiduPipeline': 300,
  'newsbaidu.pipelinesmysql.NewsbaiduPipeMySql': 301,
}

修改后的ITEM_PIPELINES配置项,表示百度新闻爬虫项目有两个Pipeline管道类,NewsbaiduPipeline类存储Item数据项到CSV文件,NewsbaiduPipeMySql类存储Item数据项到MySQL数据库。

在settings.py配置文件结尾添加MySQL数据库配置项:

# 数据库配置
MYSQL_HOST = 'localhost'
MYSQL_DBNAME = 'baidunews'
# 配置数据库的访问用户
MYSQL_USER = 'root'
# 配置数据库的访问密码
MYSQL_PASSWD = '******'

4、 建立dbhelp文件

dbhelp文件连接MySQL数据,并将scrpy传入的Item数据项存储到MySQL数据库。在项目的newsbaidu目录下建立db包(与spider包在同一目录),在db包下建立dbhelp.py文件。代码文件如下:

'''
1、爬取数据存储到数据库
2、MySQL数据库连接信息存储在settings配置文件
'''
#导入pymysql模块
import pymysql as mysql
#导入twisted的adbapi模块
from twisted.enterprise import adbapi
#导入settings配置读取函数
from scrapy.utils.project import get_project_settings
#导入time模块
import time
 
 
class DBHelper():
 
    # 类构造方法
    def __init__(self):
       
        #获取settings配置数据
        print("DBHelper()")
        settings = get_project_settings() 
 
        dbparams = dict(
            #读取MYSQL_HOST(MySQL主机地址)
            host=settings['MYSQL_HOST'],
            #读取MYSQL_DBNAME(MySQL数据库名称)
            db=settings['MYSQL_DBNAME'],
            #读取MYSQL_USER(MySQL数据库用户名)
            user=settings['MYSQL_USER'],
            #读取MYSQL_PASSWD(MySQL数据库用户登录密码)
            passwd=settings['MYSQL_PASSWD'],
            #设置字符集为utf8编码
            charset='utf8',
            #设置游标的类型,DictCursor以字典类型返回
            cursorclass=mysql.cursors.DictCursor,
           
        )
        #创建一个数据库连接池对象
        #dbparams为字典参数
        dbpool = adbapi.ConnectionPool('pymysql', **dbparams)
        #数据库连接池对象赋值给类属性变量dbpool
        self.dbpool = dbpool
 
    #返回数据库连接ConnectionPool对象
    def connect(self):
        return self.dbpool
 
    #插入数据库记录
    def insert(self, item):
        #sql语句
        sql = "insert into news(title,link,date) values(%s,%s,%s)"
        #调用插入的方法
        query = self.dbpool.runInteraction(self._conditional_insert, sql, item)
        #调用异常处理方法
        query.addErrback(self._handle_error)
        return item
    #记录提交到数据
    def _conditional_insert(self, tx, sql, item):
        datetime = time.strftime('%Y-%m-%d %H:%M:%S',
                                           time.localtime(time.time()))
        params = (item["news_title"], item['news_link'],datetime)
        tx.execute(sql, params)
 
    #错误处理方法
    def _handle_error(self, failue):
        print('--------数据库异常!!---------')
        print(failue)
#关闭连接池对象
    def close(self):
        self.dbpool.close()

dbhelp导入了两个模块,分别是pymysql和twisted,pymysql是是Python用于操作MySQL数据库的模块,twisted模块是是Python一个异步通信编程库,完成客户端与服务端的通信。使用twisted模块可以连接MySQL数据库,建立连接池,并通过连接池实例对象执行MySQL数据库SQL操作。

dbhelp从配置文件读取连接MySQL数据库的配置项,建立连接池实例对象,将Item数据项作为一条记录插入到baidunews数据库的news表内。

5、添加pipelinesmysql.py文件

在项目目录下创建pipelinesmysql.py文件,与pipelines.py同一目录。代码文件如下:

from itemadapter import ItemAdapter
from newsbaidu.db import dbhelp
 
class NewsbaiduPipeMySql:
   
    # 定义构造方法,实例化DBHelper对象
    def __init__(self):
 
        print("连接数据库")
        self.db = dbhelp.DBHelper()
       
    def process_item(self, item, spider):
        # 插入数据库
        self.db.insert(item)
        return item
     
  # 爬虫程序关闭时,该方法被调用
    def close_spider(self,spider):
        # 释放数据库连接资源
        self.db.close()

6、运行爬虫

运行爬虫有两种方式:一种方式在Windows命令行窗口执行scrapy命令来运行爬虫;另外一种方式在项目根目录下创建一个py文件来运行爬虫。

使用第一种方式运行爬虫

在Windows命令行窗口输入下面的命令:

scrapy crawl spider_newsbaidu

crawl是运行爬虫的命令,spider_newsbaidu是爬虫模块名称,该命令不再输出json文件。

使用第二种方式运行爬虫

在项目目录下,建立sql_main.py文件,用于运行爬虫。

文件代码如下:

from scrapy.cmdline import execute
execute(["scrapy","crawl"," spider_newsbaidu"])


代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
暂无评论