使用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之间
cursor = conn.cursor()
我很抱歉,您并没有提供具体的问题。请您提供一个具体的问题,我将尽力给出解决方案。