• 爬虫数据的存储


    1,Json

    class JsonWithEncodingPipeline(object):
        #自定义json文件的导出
        def __init__(self):
            self.file = codecs.open('article.json', 'w', encoding="utf-8")
        def process_item(self, item, spider):
            lines = json.dumps(dict(item), ensure_ascii=False) + "
    "
            self.file.write(lines)
            return item
        def spider_closed(self, spider):
            self.file.close()
    
    
    class JsonExporterPipleline(object):
        #调用scrapy提供的json export导出json文件
        def __init__(self):
            self.file = open('articleexport.json', 'wb')
            self.exporter = JsonItemExporter(self.file, encoding="utf-8", ensure_ascii=False)
            self.exporter.start_exporting()
    
        def close_spider(self, spider):
            self.exporter.finish_exporting()
            self.file.close()
    
        def process_item(self, item, spider):
            self.exporter.export_item(item)
            return item

    open_spider 当spider开启时,这个方法被调用

    close_spider 当scrapy关闭时,这个方法会被调用。

    最主要的是process_item这个方法执行了数据库的插入操作

    2,MYSQL

    from twisted.enterprise import adbapi  # 将MySQL操作异步化
    import MySQLdb.cursors
    class MysqlPipeline(object):
        #采用同步的机制写入mysql
        def __init__(self):
            self.conn = MySQLdb.connect('192.168.0.106', 'root', 'root', 'article_spider', charset="utf8", use_unicode=True)
            self.cursor = self.conn.cursor()
    
        def process_item(self, item, spider):
            insert_sql = """
                insert into jobbole_article(title, url, create_date, fav_nums)
                VALUES (%s, %s, %s, %s)
            """
            self.cursor.execute(insert_sql, (item["title"], item["url"], item["create_date"], item["fav_nums"]))
            self.conn.commit()
    
    
    class MysqlTwistedPipline(object):
        def __init__(self, dbpool):
            self.dbpool = dbpool
    
        @classmethod
        def from_settings(cls, settings):  # 这个方法会将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, item, spider) #处理异常
        def handle_error(self, failure, item, spider):
            # 处理异步插入的异常
            print (failure)
    
        def do_insert(self, cursor, item):
            #执行具体的插入
            #根据不同的item 构建不同的sql语句并插入到mysql中
            insert_sql, params = item.get_insert_sql()
            print (insert_sql, params)
            cursor.execute(insert_sql, params)

    使用MySQLTwistedPipline是因为爬取速度远超插入关系型数据库的速度,因此用它来实现异步插入数据库的操作,一般都是使用下面的这种

  • 相关阅读:
    TOMCAT清理
    tomcat 热部署、热加载 精析
    TOMCAT配置数据库连接池
    TOMCAT修改端口号
    TOMCAT配置管理员
    Go语言net/http 解读.
    《coredump问题原理探究》Linux x86版7.7节 set对象
    Asp.net与office web apps的整合
    【设计模式】代理模式实现连接池
    手把手实现Java权限(1)-Shiro介绍
  • 原文地址:https://www.cnblogs.com/zhoulixiansen/p/9886287.html
Copyright © 2020-2023  润新知