参考
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'