zoukankan      html  css  js  c++  java
  • pythonscrapy之MySQL同步存储

    假设我们已经能获取到item里定义的字段的数据,接下来就需要保存item的数据到mysql数据库.

    pipeline用来存储item中的数据,将爬取到的数据进行二次处理

    首先,要做的准备的工作,安装MySQLdb,我安装的是Python-MySQL1.2.5模块.

    自定义一个pipeline用mysql来存储item中的数据

    class MySQLPipeline(object):
        #自定义一个pipeline用mysql来存储item中的数据
        def __init__(self):
            # 代码连接数据库
            # 1)连接
            # 连接的数据库必须存在
            db = MySQLdb.Connect(host='localhost', user='root', passwd='123456', db='testdb', charset='utf8',use_unicode=True)
            # 游标/指针
            cursor = db.cursor()
            self.db=db
            self.cursor=cursor
            #先删除表
    
            sql="drop table IF EXISTS test"
            self.cursor.execute(sql)
            self.db.commit()
    
    
            sql = "create table if not exists test (id INT PRIMARY KEY auto_increment NOT NULL , title VARCHAR(50) NOT NULL,category_name VARCHAR (100),date_time VARCHAR (20) NOT NULL ,likes INT DEFAULT 0,content longtext ,comment INT DEFAULT 0,collect INT DEFAULT 0,detail_url VARCHAR (255) UNIQUE,src VARCHAR (255))"
            # 参数1:query,填写sql语句
            # 参数2:args,参数,默认是空,填写元组
            self.cursor.execute(sql)
            self.db.commit()
    
        def process_item(self, item, spider):
    
            #2)执行相关操作
    
            # #3)关闭连接,先关cursor,再关db
            # cursor.close()
            # db.close()
    
            #如果要给所有列添加数据,列名可以不写
            try:
                sql="insert into test (title,category_name, date_time,likes,content, comment,collect, detail_url,src) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s)"
                self.cursor.execute(sql, (item['title'],item['category_name'],item['date_time'],item['likes'], item['content'],item['comment'], item['collect'],item['detail_url'],item['src'][0]))
                self.db.commit()
            except:
                print u'数据重复忽略不计'
    
            return item
    
    
        def __del__(self):
    
            self.cursor.close()
            self.db.close()

    process_item(self,item,spider)这个方法会被每个item pipeline组件调用,并且该方法必须返回一个字典数据,item或者抛出一个DropItem异常.

    在settings注册下

    ITEM_PIPELINES = {
    
        #MySQL同步写入
        "JobboleSpider.pipelines.MySQLPipeline": 2,
    
    
    }

    还有可以直接通过模型对象操作数据库的方式称为ORM

    特点:不需要写sql语句,可以直接操作数据库

    添加:item.save(),

    删除:item.delete()

    ............................

  • 相关阅读:
    .NET简谈互操作(七:数据封送之介绍)
    C# utf8编码时转换成shiftjis时出现乱码问题的处理
    .NET简谈特性(代码属性)
    著名Channel 9 主持人Robert Green 采访微软一站式示例代码库录像
    SharePoint 2007运行 Edit In DataSheet 时在IE 6下页面卡死的分析和处理方法
    截图工具
    Resharper上手指南
    .NET简谈互操作(三:基础知识之DllImport特性)
    .NET简谈互操作(五:基础知识之提升平台调用性能)
    深度训练(DotNet专场)
  • 原文地址:https://www.cnblogs.com/kidl/p/7392322.html
Copyright © 2011-2022 走看看