学习笔记
最近在学习使用python编写爬虫爬取自己学校网站的信息并存入mysql中,在爬取过程中异常顺利,但是在存入Mysql的过程中却踩了好几个坑,分享一下在用pymysql存数据时踩过的几个坑。
Pymysql向mysql存入数据,我写的是先链接数据库,然后用字符串的形式编写好mysql的指令块,再通过pymysql的execute和commit上交执行,所以其实在这个过程中容易发生错误的就是这些mysql指令的编写。
遇到的其中一个坑就是:
pymysql.err.InternalError: (1054, "Unknown column 'XXXXX' in 'field list'")
这个坑上网搜了一下网上都是这样的:
pymysql.err.InternalError: (1054, "Unknown column 'nan' in 'field list'")
这说是在存入mysql时要将nan替换成none,然后我就根据这个去检查我的代码,然后还是没发现错误在哪,最后又上网查,终于查到了我那个报错,才知道这是由于引号引起的,
最初写的插入Mysql的指令是:
'''INSERT INTO XXXXXXX(标题, 日期, 作者, 阅读量, 正文) VALUES(%s,%s,%s,%s,%s)'''
然后改成了:
'''INSERT INTO XXXXXXXX(标题, 日期, 作者, 阅读量, 正文) VALUES("%s","%s","%s","%s","%s")'''
这个报错就解决了。
还有一个坑,让我搞了好久才搞定,就是:
pymysql.err.ProgrammingError: (1064, "You have an error in your SQL syntax; check the...
对于这个报错,上网一搜,就有很多,说是在将数据插入到mysql过程中,这些python的字符串需要转义,要用:
pymysql.escape_string(字符串变量)
来处理,然后我就试了一下,一开始我直接把execute语句中的元组args加上这一句,然后报错:
AttributeError: 'tuple' object has no attribute 'translate'
然后我又把这个元组建立时每个变量都加上这个函数,还是没用,还是显示
pymysql.err.ProgrammingError: (1064, "You have an error in your SQL syntax; check the...
可是还是上网搜,都是说需要转义,又试了改成execute(sql%args),和改成format但是就还是不行,然后我就试了一下新建一个python文件重新写,直接把要存进去的内容写进字符串,没用爬虫,然后他居然没报错!!
最后回到爬虫的那一个文件看了一下发现创建table的语句我写的是:
'''reate table if not exists passage(
标题 char(100) not null,
日期 char(30) not null,
作者 char(50) not null,
阅读量 char(20) not null,
正文 text(5000) not null)
'''
然后插入的语句:
'''INSERT INTO pasage(标题, 日期, 作者, 阅读量, 正文) VALUES("%s","%s","%s","%s","%s")'''
把创建的passage写成了pasage,将插入的pasage改为passage,再运行,它就过了。。。。
其实还遇到了:
TypeError: not all arguments converted during string formatting
这个是
'''INSERT INTO pasage(标题, 日期, 作者, 阅读量, 正文) VALUES("%s","%s","%s","%s","%s")'''
这个语句中"%s"漏了一个加上就好了。
总的就是,写mysql的指令时要仔细一些。