爬取的数据存入MySQL表,但是Truncate后为什么依然提示Duplicate entry

kgarnett29 2016-08-25 01:41:36
是这个样子的,我这段程序是要爬取内部一个网页的表中的数据,将需要的内容存入MySQL表中,每隔1一分钟刷新一次数据,我的做法是直接truncate表,然后再重新抓一下数据,代码如下:

from urllib import urlopen
from bs4 import BeautifulSoup
import re
import MySQLdb,time,datetime

session_id_list = []
batch_username_list = []
session_status_list = []

def GetUrlContent(url):
global session_id_list,batch_username_list,session_status_list
html = urlopen(url)
bsObj = BeautifulSoup(html,"html.parser")
text_scrapy1 = bsObj.findAll("td",{"class":"boxtext6BB"})
text_scrapy2 = bsObj.findAll("td",{"class":"boxtext6bb"})

# 获取session ID数据
text_scrapy = bsObj.findAll("a",{"name":re.compile("[0-9]+")})
for abc in text_scrapy:
session_id_list.append(abc.attrs['name'].encode())


# 获取batch user数据,13:根据表中的位置,下session同
for j in range(0,len(text_scrapy1)):
try:
if j%13 == 0:
batch_username_list.append(text_scrapy1[0+j].get_text())
except IndexError:
pass

# 获取session状态数据
for k in range(0,len(text_scrapy1)):
try:
if k%13 == 0:
session_status_list.append(text_scrapy1[12+k].get_text())
except IndexError:
pass

def main():
while True:
sql2 = "TRUNCATE TABLE oncall"
try:
conn = MySQLdb.connect(host='localhost',port=3306,user='root',passwd='123456',db='status_for_oncall')
cur = conn.cursor()
cur.execute(sql2)
print "********** truncated previous data **********"
time.sleep(3)

GetUrlContent('https://perfweb.corp.ebay.com/Martini/MARTINI_Sessions.htm')
for i in range(0,len(session_id_list)):
sql1 = "insert into oncall value(%s,%s,%s)"
param = (session_id_list[i],batch_username_list[i],session_status_list[i])
cur.execute(sql1,param)
print "********** finish saving data **********"
time.sleep(60)
conn.commit()
cur.close()
conn.close()

except Exception,e:
print datetime.datetime.now(),Exception,":",e
cur.execute(sql2)
conn.commit()
cur.close()
conn.close()



if __name__ == "__main__":
main()



while循环让程序一直运行。
当第一次循环的时候正常,但是第二遍的时候就会报错,
<type 'exceptions.Exception'> : (1062, "Duplicate entry '*******' for key 'PRIMARY'")
我的理解是主键重复,因为我在MySQL的表中将上面这个数据设为主键。
但是我在MySQL表中查看了内容,明明已经清空了,为什么还会重复呢?
...全文
166 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
kgarnett29 2016-08-25
  • 打赏
  • 举报
回复
引用 1 楼 selecthis 的回复:

            time.sleep(60)
            conn.commit()
            cur.close()
            conn.close()
修改成这样

            conn.commit()
            cur.close()
            conn.close()
            time.sleep(60)
这个样子还是不行,不过最后我想了下应该是列表没有清空。本来以为循环到开始的地方列表应该是空的,但是测试的时候发现变量依然是原来那些。 所以我在try的一开始就讲列表清空,用的是del lst[:] 不过还是多谢回复
李察德-泰森 2016-08-25
  • 打赏
  • 举报
回复

            time.sleep(60)
            conn.commit()
            cur.close()
            conn.close()
修改成这样

            conn.commit()
            cur.close()
            conn.close()
            time.sleep(60)

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧