发现问题
1、我在做爬虫,定时往数据库存数据的时候,出现这个错误,pymysql.err.InterfaceError: (0, ‘’)
2、你在网上看到的原因是,超过8小时没有操作MySQL连接时,MySQL会自动断开连接。推荐的方法是使用db.ping(),也就是说,在每次执行查询或插入相关操作时,通常检查数据库连接,如果断开连接,则重新连接。
解决问题
1、在 pymysql 创建的数据库连接对象下,有这么一个方法:ping(),直接进去查看源码。
def ping(self, reconnect=True):
"""
Check if the server is alive.
:param reconnect: If the connection is closed, reconnect.
:raise Error: If the connection is closed and reconnect=False.
"""
if self._sock is None:
if reconnect:
self.connect()
reconnect = False
else:
raise err.Error("Already closed")
try:
self._execute_command(COMMAND.COM_PING, "")
self._read_ok_packet()
except Exception:
if reconnect:
self.connect()
self.ping(False)
else:
raise
2、将我的代码改动:
class News1(object):
def __init__(self):
self.url = 'http://www.mot.gov.cn/jiaotongyaowen/'
self.headers = {'User-Agent': random.choice(ua_list)}
self.db = pymysql.connect('ip', 'user', 'password', 'database', charset='utf8')
self.cur = self.db.cursor()
self.i = 0
# 爬取数据之前先到数据库中查询比对
def is_go_on(self,title):
sel = 'SELECT title FROM dj_news WHERE type=1 ORDER BY id DESC LIMIT 200'
self.db.ping(reconnect=True) # 检查连接是否存在,断开的话重连
self.cur.execute(sel)
result = self.cur.fetchall()
tit_r = []
for i in result:
tit_r.append(i[0])
# print(tit_r)
if title in tit_r:
return False
else:
return True
# 保存数据
def save_news(self,title,fromWhere,datetime,content):
title = title
abstractM = title
fromWhere = fromWhere
datetime = datetime
content = content
type = '1'
status = '1'
source = '2'
# 数据库操作
sql = "insert into dj_news (title,type,abstractM,fromWhere,createTime,content,status,source) values (%s,%s,%s,%s,%s,%s,%s,%s)"
self.db.ping(reconnect=True) # 检查连接是否存在,断开的话重连
self.cur.execute(sql, [title, type, abstractM, fromWhere, datetime, content, status, source])
self.db.commit()
print('数据存储完成')
上面的处理,其实只是在使用 execute() 方法执行sql前,加了一行代码:self.db.ping(reconnect=True),而 self.db 则是代码里创建的 pymysql 数据库连接对象,我按上述方法处理之后问题得以解决。