爬取的内容存储到数据库
课程    Python爬虫实战

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

下面将在爬取百度热点新闻案例基础上,对项目进行改进,将爬虫爬取的内容存储到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,表结构如下:

16.png

修改settings.py配置文件

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

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

stock.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。

郎宏林
授课老师
授课老师简介
项目经理,系统分析和架构师,从事多年中文信息处理技术。熟悉项目管理、擅长项目需求分析和设计、精通Java、C#、Python等编程语言。
  • 备案号:鲁ICP备15001146号
  • @1997-2018 潍坊米粒花网络技术有限公司版权所有