虽然有点跳脱,从Aconda直接跳到爬虫,但是作者目前从事爬虫工作(非大学专业,属自学,基础相当不扎实),在将已经爬取好的txt文件导入到mysql时遇到了以下的问题:
1、首先我已经爬取了需要的四个字段,但是分别存放在两个txt文件中,因为爬取的时候,这四个字段分别在根页面和子页面中,所以使用了两个txt分别进行存储,如图:
图1:四个字段在两个txt文件里面的分布
2、然后接下来,我需要将这个四个字段全部塞进一个表中,这个表长这样:
图2:表的结构
从左到右分别是自增的主键col_id,col_name(名称字段),col_address(地址字段),col_city(城市字段),col_countrys(国家字段)。
3、我第一时间是使用insert方法先将只有单独一个字段的名称字段先塞进去,但是首先要将名称字段塞进咱们的python中,使用的代码是这样:
import os#两个可能需要的相关库
import sys
file_coltd=open(r'txt文件路径','r',encoding='utf-8')#三个属性分别是,路径,读写模式和编码格式,一个都别少!!
lines_coltd=file_coltd.readlines()#将txt文件按照行进行读入
图3:读取文件,按行读取
4、由于txt文件内我的数据存储格式是一行然后回车然后又一行,那实际写出去的时候也会是这样的,其中"\n"就是回车的符号:
图4:读入的数据有“\n”这样的制表符
这种制表符吧,出现在这个地方还是很不舒服的,所以之后要想办法去掉,同时这个地方还有个忠告,就是每次做类似于这样的数据清洗的时候,每个文件存放的数据方式是不一样的,不能完全照抄这个文章,如果说这后面跟着的不是“\n”而是逗号呢?这就要我们具体问题具体分析,接下来提供一个可行的框架。代码如下:
for i in lines_coltd:
sql_insert="insert into coltd(col_name) values (%s)"
#%s为占位符,它的作用就是你在exexute这个命令中的变量会出现在这里,比如这里,就是下一句的i变量
#代入到这个%s,而且是按照顺序的,不一定只有一个%s,出现两个则execute中就要有两个对应的变量。
cursor.execute(sql_insert,i)
#其中第一个变量一定是sql语句,不然后面的变量是不知道要占据哪一个语句中的占位符的
conn.commit()
#提交,完成一次数据的插入,conn是数据库链接变量啊,不是cursor
5、执行完上述代码之后,数据库就完成了对名称字段的插入就会变成这个样子:
图5:完成名称字段插入后
由于col_id是自增的,所以每插入一条数据,就会自动补齐,然后现在就是重头戏,如何对后面三个字段进行插入呢?不能直接使用insert这个语句了,需要使用一些判断语句了我是用的sql语句是update,也就是更新,代码公式是这样的:“update ‘数据表名’ set ‘字段名’ where ‘主键’=?”使用的代码如下:
insert=[]#在提取数据的时候发现,如果使用lines按行提取,一行的数据就会被作为一个元素输出
#这样不符合需求,所以先将其输出到一个变量中,然后使用数组承接,然后再使用split进行分割,从而
#获得单个的数据。
id=1
for i in range(len(lines)):#按照txt文本的行数,按行读取数据,这里就是读取第一个元素,
#(这个元素里有我需要的三个字段)
str=lines[i]
insert=str.split(',')#split按照“,”将元素切分,塞进这个队列中
a=insert[0]#这个就是地址字段
b=insert[1]#这个就是城市字段
c=insert[2]#这个就是国家字段
sql_address='update coltd set col_address="%s" where col_id="%s"'
#插入地址字段需要的sql,其中通过for循环插入时,以主键作为插入关键词
sql_city='update coltd set col_city="%s" where col_id="%s"'
#插入城市字段需要的sql,update后面的coltd是表名,set后面是字段名
sql_countrys='update coltd set col_countrys="%s" where col_id="%s"'
#插入国家字段需要的sql
param_address=(a,id)#将需要的数据塞进元组,元组会按顺序被读入
param_city=(b,id)
param_countrys=(c,id)
id=id+1#col_id+1,也就是跳到下一行写
cursor.execute(sql_address,param_address)#执行sql语句
cursor.execute(sql_city,param_city)
cursor.execute(sql_countrys,param_countrys)
conn.commit()#提交
insert.clear()#每完成一行数据的插入就要清空一次,不然就会重复写入数据
id=1
如果执行的很快,说明上面的file读入被不知名原因关闭了,需要再执行以下,以上代码不能直接粘贴使用,需要仔细阅读备注,修改变量为所需写入的变量才能成功,所以写代码还是要多思考。
6、执行完成第五点的代码之后,数据库就写入完成了,如图:
图6:完成空缺字段的写入,数据库完整
这些问题都是作者在发布的时候遇到的问题,搞了两个小时才明白其中缘由,所以,代码要多想多练。