pymysql.err.InterfaceError: (0, ‘‘) 数据库连接超时

发现问题

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 数据库连接对象,我按上述方法处理之后问题得以解决。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值