0%

Scrapy小技巧-MySQL存储

吃惊表情1 这两天上班接手,别人留下来的爬虫发现一个很好玩的 SQL 脚本拼接。 只要你的 Scrapy Field 字段名字和 数据库字段的名字 一样。那么恭喜你你就可以拷贝这段 SQL 拼接脚本。进行 MySQL 入库处理。 具体拼接代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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 语句。 QQ图片20161021225948 我只能所 6666666666 写这个拼接的小哥儿有想法。还挺通用。 不知道你们有没有想到这种方法 反正我是没想到。