美文网首页
Python爬虫学习13-爬取数据保存到数据库

Python爬虫学习13-爬取数据保存到数据库

作者: MingSha | 来源:发表于2017-04-04 16:35 被阅读0次

保存到Mysql数据库,需要用到mysqlclient模块,需要事先安装,这个模块在django也会用到。

1、数据同步插入数据库

pipelines.py中引入数据库连接模块:
import MySQLdb
写入以下代码

class MysqlPipeline(object):
    def __init__(self):
        self.conn = MySQLdb.connect('127.0.0.1', 'root', 'root', 'jobbole', charset='utf8', use_unicode=True)
        self.cursor = self.conn.cursor()
    def process_item(self, item, spider):
        insert_sql = 'INSERT INTO jobbole_article (`title`, `create_date`, `url`, `url_object_id`, `content`, `front_image_path`, `comment_nums`, `fav_nums`, `praise_nums`, `tags`) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)'
        self.cursor.execute(insert_sql, (item['title'], item['create_date'], item['url'], item['url_object_id'], item['content'], item["front_image_path"], item['comment_nums'], item['fav_nums'], item['praise_nums'], item['tags']))
        self.conn.commit()

__init__是对数据进行初始化,定义连接信息如host,数据库用户名、密码、数据库名称、数据库编码
process_item中进行插入数据操作,格式都是固定的

最后在settings.py中把MysqlPipelint()加入到系统中,需要注意的是优先级要小于之前加入处理图片路径的优先级

ITEM_PIPELINES = {
   'articlespider.pipelines.ArticlespiderPipeline': 300, #系统自动生成pipeline,未用
   'articlespider.pipelines.ArticleimagePipeline': 1,
   'articlespider.pipelines.MysqlPipeline': 4,
}

说明:

先进行ArticleimagePipeline的处理,再进行MysqlPipeline处理

2、异步插入数据库

在同步插入数据库中,把连接信息MySQLdb.connect('127.0.0.1', 'root', 'root', 'jobbole', charset='utf8', use_unicode=True)直接定义在函数中,如果不经常改动的话,可以把相关信息放到settings.py中进行调用。
settings.py

MYSQL_HOST = "127.0.0.1"
MYSQL_DBNAME = "jobbole"
MYSQL_USER = "root"
MYSQL_PASSWORD = "root"

pipelines.py中,定义异常存储数据pipeline

class MysqlyibuPipeline(object):

    @classmethod
    def from_settings(cls, settings):
        host = settings["MYSQL_HOST"]
        pass

通过debug模式,可以看到相应的设置已经传递过来了。通过host = settings["MYSQL_HOST"]赋值即可得到相应数据。

Paste_Image.png

异步操作需要引入twisted:

from twisted.enterprise import adbapi
import MySQLdb
import MySQLdb.cursors

使用twisted进行操作


class MysqlyibuPipeline(object):
    def __init__(self, dbpool):
        self.dbpool = dbpool

    @classmethod
    def from_settings(cls, settings):
        dbparms = dict(
            host = settings["MYSQL_HOST"],
            db = settings["MYSQL_DBNAME"],
            user = settings["MYSQL_USER"],
            passwd = settings["MYSQL_PASSWORD"],
            charset='utf8',
            cursorclass=MySQLdb.cursors.DictCursor,
            use_unicode=True,
        )
        dbpool = adbapi.ConnectionPool("MySQLdb", **dbparms)

        return cls(dbpool)

    def process_item(self, item, spider):
        # 使用twisted将mysql插入变成异步执行
        query = self.dbpool.runInteraction(self.do_insert, item)
        query.addErrback(self.handle_error)

    def handle_error(self, failure):
        print(failure)

    def do_insert(self, cursor, item):
        # 具体执行插入
        insert_sql = 'INSERT INTO jobbole_article (`title`, `create_date`, `url`, `url_object_id`, `content`, `front_image_path`, `comment_nums`, `fav_nums`, `praise_nums`, `tags`) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)'
        cursor.execute(insert_sql, (item['title'], item['create_date'], item['url'], item['url_object_id'], item['content'], item["front_image_path"], item['comment_nums'], item['fav_nums'], item['praise_nums'], item['tags']))

在使用中大部分代码无需改变,只在最后一步,改为自己的信息即可。当量不大时,使用第一种方法。

相关文章

网友评论

      本文标题:Python爬虫学习13-爬取数据保存到数据库

      本文链接:https://www.haomeiwen.com/subject/hcqzottx.html