vlambda博客
学习文章列表

爬虫入门(3):爬取的数据存储到MySQL数据库

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

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

(1)安装pymysql模块;

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

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

(4)建立dbhelp文件

(5)修改pipelines.py文件;

(6)运行爬虫。

安装pymysql模块

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

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


pip3 install pymysql


pip3会自动下载lxml并安装。

创建MySQL数据库及表结构

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


修改settings.py配置文件

在settings.py配置文件需要添加ITEM_PIPELINES配置项,ITEM_PIPELINES配置项用于配置对爬取数据进行处理的模块, ITEM_PIPELINES配置项为:


ITEM_PIPELINES = {
    'stock.pipelines.StockPipeline': 300,
}


tock.pipelines.StockPipeline指定了用于处理爬取数据的类,数据处理类StockPipeline在stock包pipelines模块内。pipelines.py模块文件在项目的stock目录下。

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


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


建立dbhelp文件

dbhelp文件连接MySQL数据,并将scrpy传入的StockItem数据项存储到MySQL数据库。在项目的stock目录下建立db包,在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)


修改pipelines.py文件

pipelines.py文件在项目的stcok目录下,pipelines.py是用于处理爬取数据的模块文件。修改后的代码文件如下:


from itemadapter import ItemAdapter
from stock.db import dbhelp
class StockPipeline:
    # 连接数据库
    def __init__(self):
        print("连接数据库")
        self.db = dbhelp.DBHelper()
    
    def process_item(self, item, spider):
        # 插入数据库
        self.db.insert(item)
        return item


运行爬虫

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

使用第一种方式运行爬虫

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


scrapy crawl spider_stockstar


crawl是运行爬虫的命令,spider_stockstar是爬虫名称。

在Windows命令行窗口运行爬虫,scrapy会给出更多爬虫运行信息,调试爬虫程序时建议使用该方式运行爬虫。

使用第二种方式运行爬虫

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

文件代码如下:


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



文中案例代码可在编程训练营APP下载。






END




编程训练营APP
创新在线学习模式,学习编程不再半途而废
安卓手机应用商店
搜索编程训练营下载