使用mysql存储数据报错:pymysql.err.ProgrammingError: Cursor closed

使用mysql存储数据报错:pymysql.err.ProgrammingError: Cursor closed

import random
import time

import pymysql
import requests
# 随机生成User-Agent:
from fake_useragent import UserAgent
from lxml import etree


class lianjiaspider:
    def __init__(self):
        self.url="https://sh.lianjia.com/ershoufang/pg{}/"
        self.db=pymysql.Connect(host='localhost',user='root',password='pzy123456',db='tengxun_job_db')
        self.cursor=self.db.cursor()

        self.data=[]

    def get_html(self,url,enconding="utf-8"):
        headers={'User-Agent':UserAgent().random}
        html=requests.get(url=url,headers=headers).text
        #tree3 = html.tostring(encoding='utf-8')
        #print(tree3)
        #没有行会乱码
        self.parse_html(html)
        self.save()

    def parse_html(self,html):
        p=etree.HTML(html)

        li_list=p.xpath('//li[@class="clear LOGVIEWDATA LOGCLICKDATA"]')
        # print(li_list)


        item={}

        for li in li_list:
            # print(li)
            name_list=li.xpath('.//div[@class="positionInfo"]/a[1]/text()')
            item["name"]=name_list[0].strip() if name_list else None
            address_list=li.xpath('.//div[@class="positionInfo"]/a[2]/text()')
            item["address"]=address_list[0].strip() if address_list else None
            #4室2厅 | 151.23平米 | 东南 | 精装 | 高楼层(共25层) | 板塔结合
            info_li=li.xpath('.//div[@class="houseInfo"]/text()')
            # print(info_li)
            if info_li:
                info_li=info_li[0].split("|")
                if len(info_li)==7:
                    item["modle"] = info_li[0].strip()
                    item["area"] = info_li[1].strip()
                    item["direct"] = info_li[2].strip()
                    item["perfect"] = info_li[3].strip()
                    item["floor"] = info_li[4].strip()
                    item["year"] = info_li[5].strip()
                    item["type"] = info_li[6].strip()


                else:
                    item["modle"] = item["area"] = item["direct"] = item["perfect"] = item["floor"] =  item["type"] = None
            else:
                item["modle"] = item["area"] = item["direct"] = item["perfect"] = item["floor"]  = item["type"] = None
            total_list=li.xpath('.//div[@class="totalPrice totalPrice2"]/span/text()')
            item["total"]=total_list[0].strip() if total_list else None
            unit_list=li.xpath('.//div[@class="unitPrice"]/span/text()')
            item["unit"]=unit_list[0].strip() if unit_list else None
            print(item)
            # #csv存取的是列表,先将字典类型数据转换为列表,在存取

            data_small = []
            for i in item:
                data_small.append(item[i])
            self.data.append(data_small)
            # self.save()
            # print(self.data)
            #
            # with open('lianjiaspider2.csv', "a", encoding="utf-8", errors='ignore', newline='') as f:
            #     writer = csv.writer(f)
            #     writer.writerows(data)
    def save(self):
        ins = 'insert into lianjia_tab values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)'
        self.cursor.executemany(ins, self.data)
        self.db.commit()
        self.cursor.close()
        self.db.close()
    def run(self):
        for pg in range(1,6):
            url=self.url.format(pg)
            self.get_html(url)
            # self.save()
            # time.sleep(random.randint(1,3))

            #print("第{}页抓取完成".format(pg))


if __name__=='__main__':     #if __name__ == '__main__':
    spider=lianjiaspider()
    spider.run()
    print("抓取完成")



#游标已经结束了???,怎么解决?

你在run里执行了个循环
但是在save里直接close掉了
你应该全部循环完一起close,而不是每保存一次就close一次
或者每次都open,而不是只open一次
-=-=-=-=
根源就是只open了1次而close了5次,那么第2次再执行的时候根本没连接
所以要么改成open1次,close1次
要么改成open5次,close5次
要保证插入操作在open和close之间

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这篇博客: pymysql的使用(pycharm与mysql的连接)中的 2、创建游标对象(cursor) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    cursor = conn.cursor()
    
  • 以下回答来自chatgpt:

    我很抱歉,您并没有提供具体的问题。请您提供一个具体的问题,我将尽力给出解决方案。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^