参考

https://cuiqingcai.com/4244.html

只要你的Scrapy Field字段名字和 数据库字段的名字 一样。那么恭喜你你就可以拷贝这段SQL拼接脚本。进行MySQL入库处理。

    def process_item(self, item, spider):
        if isinstance(item, WhoscoredNewItem):
            table_name = item.pop('table_name')
            col_str = ''
            row_str = ''
            for key in item.keys():
                col_str = col_str + " " + key + ","
                row_str = "{}'{}',".format(row_str, item[key] if "'" not in item[key] else item[key].replace("'", "\\'"))
                sql = "insert INTO {} ({}) VALUES ({}) ON DUPLICATE KEY UPDATE ".format(table_name, col_str[1:-1], row_str[:-1])
            for (key, value) in six.iteritems(item):
                sql += "{} = '{}', ".format(key, value if "'" not in value else value.replace("'", "\\'"))
            sql = sql[:-2]
            self.cursor.execute(sql) #执行SQL
            self.cnx.commit()# 写入操作

这个SQL拼接实现了,如果数据库存在相同数据则 更新,不存在则插入 的SQL语句

具体实现就是第一个for循环,获取key作为MySQL字段名字、VALUES做为SQL的VALUES(拼接成一个插入的SQL语句)

第二个for循环,实现了 字段名 = VALUES的拼接。

和第一个for循环的中的sql就组成了 insert into XXXXX on duplicate key update 这个。存在则更新 不存在则插入的SQL语句。

普通mysql存储

class MySQLPipeline(object):
    def __init__(self, mysql_host, mysql_dbname, mysql_user, mysql_passwd):
        self.connect = pymysql.connect(
            host=mysql_host,
            db=mysql_dbname,
            user=mysql_user,
            passwd=mysql_passwd,
            charset='utf8',
            use_unicode=True
        )
        self.cursor = self.connect.cursor()
        # 从settings中拿到配置

    @classmethod
    def from_crawler(cls, crawler):
        return cls(
            mysql_host=crawler.settings.get('MYSQL_HOST'),
            mysql_dbname=crawler.settings.get('MYSQL_DBNAME'),
            mysql_user=crawler.settings.get('MYSQL_USER'),
            mysql_passwd=crawler.settings.get('MYSQL_PASSWD'),

        )

    def open_spider(self, spider):
        spider.logger.info("mysql start!")

    # 最重要的process_item
    def process_item(self, item, spider):
        # 使用这样的name比较灵活
        name = item.__class__.__name__
        try:
            self.cursor.execute(
                'insert into table values (%s,%s)',
                (item['id'], item['title'], item['abstract']))
            self.connect.commit()
        except Exception as e:
            spider.logger.info(e)

        return item

    def close_spider(self, spider):
        self.connect.close()
        spider.logger.info("mysql close!")

settings中需要配置

MYSQL_HOST = 'localhost'
MYSQL_DBNAME = 'table'
MYSQL_USER = 'root'
MYSQL_PASSWD = '123456'