爬虫入门(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下载。