创建》连接》保存》关闭 —— 需要注意保存后即时关闭!!
数据库保存:
MySQL数据库》
导入:
import pymysql
创建数据库:
进入MySQL数据库,自行的创建数据库(设置字段和主键)。
注意:可以用自己获取的数据来作为主键(主要是为了关联两个或多个表格,比如书籍章节表与书籍内容表格等)
连接数据库:
db = None
cursor = None
def connect_db(self):
#user 、password、db、port都是自己设置MySQL数据库时自己设定的值
self.db = pymysql.connect(host='localhost', user='root', passwd='123456', db='自己设置的数据库名字', port=3306, charset='utf8')
self.cursor = self.db.cursor()
存入数据:
def save_list_data(self, list_data):
# 遍历list_data,执行insert操作,d1.....d6为数据
for d1, d2, d3, d4, d5, d6 in list_data:
#qsbk为数据库名字,以下为插入数据
insert_sql = "INSERT INTO qsbk (d1, d2, d3, d4, d5, d6) VALUES (%s,%s,%s,%s,%s,%s,%s)"
try:
self.cursor.execute(insert_sql, (d1, d2, d3, d4, d5, d6))
self.db.commit()
except Exception as e:
print('问题数据,跳过...')
self.db.rollback()
关闭数据库:
def connect_close(self):
self.cursor.close()
self.db.close()
注意:由于都是封装函数,需要正确的调用
Mongodb数据库》
注意:NoSQL中的数据库和表不需要提前创建,只需要配置会自动创建
导入:
import pymongo
创建连接数据库:
方法一:此方法建立在之前已将创建过的数据库连接,在该连接下创建数据库
client = pymongo.MongoClient('localhost')
db = client['数据库名']
方法二:之前还没有创建过的数据库连接(此方法重新创建数据库连接和数据库)
MONGO_HOST = 'localhost'
MONGO_DB = '数据库名'
MONGO_TABLE = '可以同上'
#初始化函数中创建和连接
def __init__(self):
# 创建数据库的连接客户端
self.client = pymongo.MongoClient(MONGO_HOST)
# 根据客户端对象,连接数据库
self.db = self.client[MONGO_DB]
保存数据库:两种存储的方式(覆盖式和更新式——选择自己需要的方式)
def save_to_mongodb(data):
# insert_one: 覆盖式的
db['数据表的名字'].insert_one(data)
# 更新的方法:
# 参数1:指定根据什么字段去数据库中进行查询,字段的值。
# 参数2:如果经过参数1的查询,查询到这条数据,执行更新的操作;反之,执行插入的操作;$set是一个固定的写法。
# 参数3:是否允许更新
db['article'].update_one({'info': data['info']}, {'$set': data}, True)
Excel保存数据:
Excel表格 》
导入:
import xlwt
创建表格:
def open_file(self):
# 1.创建workbook对象
book = xlwt.Workbook(encoding='utf-8')
# 2.创建选项卡
#此处选项卡名字为:职位简介
sheet = book.add_sheet('职位简介')
# 3.添加头
# 第一个参数是行,第二个参数是列,第三个参数是列的字段名
sheet.write(0, 0, '职位名称')
sheet.write(0, 1, '职位详情')
sheet.write(0, 2, '公司名称')
sheet.write(0, 3, '职位月薪')
sheet.write(0, 4, '工作地点')
sheet.write(0, 5, '职位要求')
return book, sheet
保存数据:
#主函数:注意:调用顺序和参数
if __name__=="__main__":
book, sheet = obj.open_file()
obj.parse_page_list(sheet, html)
obj.close_file(book)
#初始化:初始化row
def __init__(self):
self.row = 1
#获取数据
def parse_page_detail(self, html, sheet, row):
#获取data
sheet.write(row, 5, data)
def write_data(self,sheet,data):
# [(), ()]:data的数据类型
#row:初始值为1,原因:第一行是字段名,数据是从第二段开始的
#href,zwmc,gsmc,zwyx,gzdd 为数据
for href,zwmc,gsmc,zwyx,gzdd in data:
#可以在存入前进行数据处理
#zwmc = re.sub('<b>|</b>', '', zwmc)
sheet.write(self.row, 0, zwmc)
sheet.write(self.row, 1, href)
sheet.write(self.row, 2, gsmc)
sheet.write(self.row, 3, zwyx)
sheet.write(self.row, 4, gzdd)
#保存完后回调下一条数据的
#保存完一条数据,row加1,为下一条数据存储的行数
self.row += 1
关闭文件:
def close_file(self, book):
book.save('表名.xls')
简写版:(以:奇书网数据为例,获得数据直接存储)
def open_file(self):
QiShu.workbook = xlwt.Workbook(encoding='utf-8')
QiShu.sheet = QiShu.workbook.add_sheet('奇书')
QiShu.sheet.write(0, 0, '标题')
QiShu.sheet.write(0, 1, '点击数')
QiShu.sheet.write(0, 2, '文件大小')
QiShu.sheet.write(0, 3, '小说类型')
QiShu.sheet.write(0, 4, '更新时间')
QiShu.sheet.write(0, 5, '连载状态')
QiShu.sheet.write(0, 6, '作者')
QiShu.sheet.write(0, 7, '运行环境')
QiShu.sheet.write(0, 8, '最新章节')
QiShu.sheet.write(0, 9, '小说简介')
QiShu.sheet.write(0, 10, '下载地址')
def close_file(self):
QiShu.workbook.save('奇书.xls')
#获取数据直接保存
print(title, click_num, file_size, novel_type, date_time, status, author, env, news_article, info, url)
QiShu.sheet.write(QiShu.row, 0, title)
QiShu.sheet.write(QiShu.row, 1, click_num)
QiShu.sheet.write(QiShu.row, 2, file_size)
QiShu.sheet.write(QiShu.row, 3, novel_type)
QiShu.sheet.write(QiShu.row, 4, date_time)
QiShu.sheet.write(QiShu.row, 5, status)
QiShu.sheet.write(QiShu.row, 6, author)
QiShu.sheet.write(QiShu.row, 7, env)
QiShu.sheet.write(QiShu.row, 8, news_article)
QiShu.sheet.write(QiShu.row, 9, info)
QiShu.sheet.write(QiShu.row, 10, url)
QiShu.row += 1
#主函数
if __name__ == '__main__':
qishu = QiShu()
QiShu.open_file()
qishu.get_index_page()
QiShu.close_file()
保存到本地文件夹:
注意:
w:以写方式打开,
a:以追加模式打开 (从 EOF 开始, 必要时创建新文件)
r+:以读写模式打开
w+:以读写模式打开 (参见 w )
a+:以读写模式打开 (参见 a )
rb:以二进制读模式打开
wb:以二进制写模式打开 (参见 w )
ab:以二进制追加模式打开 (参见 a )
rb+:以二进制读写模式打开 (参见 r+ )
wb+:以二进制读写模式打开 (参见 w+ )
ab+:以二进制读写模式打开 (参见 a+ )
保存文本 》
第一种保存方法:
def save_data_to_db(self, data):
#创建方法一:创建文件(注意:a,w,wb)参数1:文件名,参数2:存入数据的是否对原数据操作,参数3:编码格式
f = open('csdn.txt', 'w', encoding='utf-8')
#创建方法二:用with as语句
#with open('csdn.txt', 'w') as f:
#数据写入
for d1, d2, d3, d4, d5, d6 in data:
f.write(d1)
f.write('\n')
f.write(d2)
f.write('\n')
f.write(d3)
f.write('\n')
f.write(d4)
f.write('\n')
f.write(d5)
f.write('\n')
f.write(d6)
f.write('\n')
#关闭文件
f.close()
保存图片 》
获取图片src属性,然后下载保存(例二(例一,例四),例三推荐)
例一:
import requests, os, shutil, re
# shutil:删除多层文件夹
from bs4 import BeautifulSoup
def parse_page_detail(self, detail_html):
if detail_html:
bs = BeautifulSoup(detail_html, "lxml")
images = bs.select('.pli img')
for image in images:
src = image.get('src')
img_name = src.split('/')[-1]
#请求img的src,下载并保存
response = requests.get(src, headers=self.headers)
if response.status_code == 200:
#注意:wb
with open(img_name, 'wb') as f:
f.write(response.content)
# 回到父级目录
os.chdir(os.path.pardir)
例二:
res = requests.get('此处是src地址').content
with open('图片名.png', 'wb') as f:
#写入
f.write(res)
例三:
参数1:图片src 参数2:存储位置( 存储位置:‘c:/..../tupian/’注意存储位置可以自己创建将位置复制过来也可以在合适的位置用os.mkdir('要创建新的文件名') 图片存储的名字:%s'%name)
urlretrieve(src, 'C:/Users/Administrator/Desktop/practice/untitled1/tupian/%s' % name)
例四:(写法不同,逻辑是一样的 同上:例一,例二)
def download_image(self, url):
try:
response = requests.get(url, headers=self.headers)
if response.status_code == 200:
return response.content
return None
except Exception as e:
print('请求图片失败:', e, url)
return None
def save_image(self, url):
content = self.download_image(url)
if content:
with open('{}/{}.jpg'.format(os.getcwd(), md5(url.encode('utf-8')).hexdigest()), 'wb') as f:
f.write(content)
else:
print('图片内容为空!')
例五:
获取img对象直接保存(注意:img是图片并且已经获得这样才可以直接保存,比如:获取验证码截图直接保存本地)
img.save('captcha.png')