一般来说,爬虫爬取的内容会存储到数据库,然后由数据分析程序对爬取的数据进行分析。
下面在百度新闻爬虫项目基础上,对项目进行改进,将爬虫爬取的内容存储到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,表结构如下:
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"])