这是我自己的第一篇博客嘿嘿嘿. 感觉各种各样的教程网上都很多的, 所以我想就记录一下自己踩的坑吧. 前两天刚刚入门学习 Python 爬虫, 用的是 Scrapy 这个框架, 用起来很方便, 好用, 爬下来的数据可以存 JSON,CSV 等格式, 然后考虑到以后还要对数据处理分析, 要存到数据库里面, 所以就照着网上的教程试了一下, 然后就踩了几个坑.
1. <class 'pymysql.err.OperationalError'>: (1045, "Access denied for user'root'@'localhost'(usingpassword: NO)")
这个错误纯属自己粗心大意, 这个大概是说连接 MySQL 时密码错了, 可是我看了好几遍密码没错啊, 最后发现是 settings.py 的变量名和 pipelines.py 中的变量名取名取得不一样: 一个是 MYSQL_PASSWORD 一个是 MYSQL_PWD. 然后改了一样名字就好了.
2. <class 'TypeError'>: %d format: a number is required, not str
这个是我看别人的博客教程被坑到了, 这是我看的博客里的
图片截取自: https://blog.csdn.net/B_Ben/article/details/88918646
!!! 注意数据库端口 3306 , 没错是吧, 3306 是没错, 但是问题就出在单引号, 把 '3306' 两边的单引号去掉这个 bug 就没了.
3. TypeError: can't concat bytes to tuple
这个是这次坑了我最久的一个一个 bug, 看了好多篇中文博客都没解决这个问题, 最后在 stack overflow 上面找到了解决办法, 先上链接
https://stackoverflow.com/questions/50038859/how-to-avoid-sql-injection-if-i-insert-data-from-csv-file-with-variables-in-pyth?r=SearchResults
他的解决办法大概就是把 sql 语句和你要插入的值分开,
Finally, I find out the way, It seems like if I want to use variable in cursor.execute(), I have to separate the sql syntax and value.If I want to use sql syntax and value in one line, I have to use cursor.execute(sql syntax and value) directly and double quotes or triple quotes are both fine.
简单说就是这样做不安全, 容易出错
- sql = "INSERT INTO table1 (v1, v2) VALUES (%s, %s)", (item['value1'], item['value2'])
- self.cursor.execute(sql)
应该这样:
第一步, 编写 sql 语句
第二步, 把数据放入数据集合
第三步, execute 执行
下面是我的代码:
- # 创建 sql 语句
- sql = "INSERT INTO table1 (v1,v2) VALUES (%s,%s)"
- # 暂存数据
- value1 = item['value1']
- value2 = item['value2']
- # 把数据放进 data
- data = (value1,value2)
- # 执行 sql 语句
- cursor.execute(sql,data)
- # 在控制台打印一下, 测试语句
- print(sql)
好了, 到这也就结束了, 第一次写博客排版有点不堪, 估计也没啥人看 8. 就是记录一下我自己学习中遇到的问题, 如果能帮到别人那就更好了.
来源: http://www.jianshu.com/p/b5fae42b0ec7