数据保存的方法(数据库《MySQL,Mongodb等》、Excel表格、文本和图片保存到本地文件夹)

创建》连接》保存》关闭 ——     需要注意保存后即时关闭!!

数据库保存:

 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')












猜你喜欢

转载自blog.csdn.net/qq_33472765/article/details/80820974