Scrapy爬虫MySQL管道格式字符错误求助:占位符适配问题
解决Scrapy爬虫切换MySQL时的占位符报错问题
我之前也踩过Scrapy切换数据库的这个坑,给你拆解下问题根源和解决办法:
问题原因分析
- 用
?报错TypeError:SQLite默认支持?作为占位符,但MySQL的常用驱动(比如pymysql、MySQLdb)并不认这个符号,它们默认使用%s作为参数占位符。直接把SQLite的写法搬过来,驱动无法正确解析参数,就会抛出“参数未完全转换”的错误。 - 改
%s后报错ValueError:这个大概率是你的SQL语句里本身包含了**百分号(%)**字符(比如LIKE '%关键词%'这种模糊查询,或者爬取的字段值里带%)。Python的字符串格式化会把这些%当成占位符,和你用来传参数的%s冲突,导致“不支持的格式字符”错误。
正确解决方案
方案1:使用驱动原生的参数化查询(推荐)
不要手动拼接SQL字符串,而是把参数作为第二个参数传给execute()方法,让驱动自动处理参数转义和占位符匹配。示例代码:
# 以pymysql为例,Scrapy Pipeline中的写法 def process_item(self, item, spider): sql = "INSERT INTO your_table (title, content) VALUES (%s, %s)" # 把参数以元组形式传给execute,不要拼到SQL里 self.cursor.execute(sql, (item['title'], item['content'])) self.conn.commit() return item
这种方式既避免了占位符冲突,还能防止SQL注入,是最安全规范的写法。
方案2:转义SQL中的百分号字符
如果你的SQL语句里确实需要用到%(比如模糊查询),要把单个%写成%%来转义,示例:
# 模糊查询包含"python"的内容,正确写法 sql = "SELECT * FROM your_table WHERE title LIKE %s" # 把模糊匹配的%放在参数里,不要写在SQL中 self.cursor.execute(sql, ('%python%',)) # 或者如果必须写在SQL里(不推荐),要转义: sql = "SELECT * FROM your_table WHERE title LIKE '%%python%%'" self.cursor.execute(sql)
额外提醒
永远不要用字符串拼接的方式构造SQL(比如sql = f"INSERT INTO ... VALUES ({item['title']})"),这种写法不仅会引发格式错误,还存在严重的SQL注入风险。
内容的提问来源于stack exchange,提问作者meow
相关产品推荐
相关产品推荐

