最近收到小伙伴们的私信,说如何将爬取的数据批量存到数据库中?数据入库也是童鞋们必须掌握的技能!数据回来之后,肯定需要存放,实效高、数量少的可能大多存放在cvs
文件中,通常情况都是要存放到数据库的!
- 数据库
- 准备数据库链接实例
- 结果演示
一.数据库
本案例使用mysql
数据库,版本我这边测试了两个:v5.7
、v8.0.30
,不需要那么多,安装一个就行!下面介绍一下我这边的操作!
- 阿里云服务器1台;(新账号的话可以免费使用1个月。我这边之前就买了,在上面安装的
mysql5.7
的docker
镜像版,网上帖子比较多,这里就不一一介绍了,安装过程很容易找到,就不重复了),没有云服务器的,也可以本地安装一个,练习,无所谓。
2.安装mysql
(安装mysql
的时候很头疼,大家可能也会遇到账号问题,网上搜方案都能解决)
3.DBeaver
数据库的可视化工具,免费的。还一个好用的工具navicat
,这个是收费的,如果能找到破解版的也可以用这个,都挺好用。
二.准备数据库链接实例并实现
新建文件DBPool.py
import pymysql
from dbutils.pooled_db import PooledDBclass MySQL:# 你的数据库host,如何是云服务器,填写你的服务器地址,如果是本地填写localhosthost = 'XXX.XXX.XXX.XXX' # 数据库账号user = 'root'# 数据库端口号,一般默认3306port = 3306# 数据库账号pasword = 'XXXX'# 数据库db = 'XXX'charset = 'utf8'pool = Nonelimit_count = 3 # 最低预启动数据库连接数量def __init__(self):self.pool = PooledDB(pymysql,self.limit_count,host=self.host,user=self.user,passwd=self.pasword,db=self.db,port=self.port,charset=self.charset,use_unicode=True)def select(self, sql):conn = self.pool.connection()cursor = conn.cursor()cursor.execute(sql)result = cursor.fetchall()cursor.close()conn.close()return result# 单个插入def insert(self, sql):conn = self.pool.connection()cursor = conn.cursor()try:cursor.execute(sql)conn.commit()return {'result': True, 'id': int(cursor.lastrowid)}except Exception as err:conn.rollback()return {'result': False, 'err': err}finally:cursor.close()conn.close()# 批量插入def insertMany(self, sql, datas):conn = self.pool.connection()cursor = conn.cursor()try:cursor.executemany(sql, datas)conn.commit()return {'result': True, 'id': int(cursor.lastrowid)}except Exception as err:conn.rollback()return {'result': False, 'err': err}
在py文件中导入数据库连接实例,
from DBPool import MySQL
实例化数据库对象
mysql = MySQL()
爬取到的数据进行处理
def get_fetch(first, last):for page in range(first, last + 1):data.update({"page": page})params = json.dumps(data)# list是爬取到的列表数据,格式为:[{}、{}、{}],一个list有20条数据list = requests.post(url, headers=headers,data=params).json()['data']['item']sql = "INSERT INTO schools(address,admissions,answerurl,belong,central,city_id,city_name,code_enroll,colleges_level,county_id,county_name,department,doublehigh,dual_class,dual_class_name,f211,f985,id,is_logo,is_recruitment,is_top,level,level_name,name,nature,nature_name,province_id,province_name,rank) values(%s,%s,%s,%s,%s,%s,%s, %s,%s, %s,%s, %s,%s,%s,%s, %s,%s,%s, %s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"# datas用于存放将要插入数据库的数据datas = []# print(page, len(list))# 遍历list,for item in list:# 注意这的数据写法value = [item['address'],item['admissions'],item['answerurl'],item['belong'],item['central'],item['city_id'],item['city_name'],item['code_enroll'],item['colleges_level'],item['county_id'],item['county_name'],item['department'],item['doublehigh'],item['dual_class'],item['dual_class_name'],item['f211'],item['f985'],item['id'],item['is_logo'],item['is_recruitment'],item['is_top'],item['level'],item['level_name'],item['name'],item['nature'],item['nature_name'],item['province_id'],item['province_name'],item['rank'],]datas.append(value)# 使用批量插入的insertMany进行处理res = mysql.insertMany(sql, datas)# 注意需要根据返回的结果判断是否插入成功if (res['result']):print(page, "数据插入成功!")else:## 打印失败的页码和错误信息print(page, res)# 防止爬的太快被封,设置随机休眠时间sleepTime = random.random() * 10print('休眠:{}秒'.format(int(sleepTime)))time.sleep(sleepTime)if __name__ == '__main__':# 请求n页数据get_fetch(1, 1000)
三.结果演示
后期会持续分享爬虫案例-100例,不想自己造轮子的同学可加入我的知识星球,有更多技巧、案例注意事项、案例坑点终结、答疑提问特权等你哦!!!
欢迎加入「python、爬虫、逆向Club」知识星球