精华内容
下载资源
问答
  • (2)核心问题讲解MySQL属于关系型数据库,它具有以下特点:在不同的引擎上有不同的存储方式。查询语句是使用传统的sql语句,拥有较为成熟的体系,成熟度很高。开源数据库的份额在不断增加,MySQL的份额也在持续增长。...

    1bab94a035328853b68d064028b11baa.gif

    (1)问题分析

    面试官主要考核Mongodb和MySQL数据库的特点,以及关系型与非关系型数据库。

    (2)核心问题讲解

    MySQL属于关系型数据库,它具有以下特点:

    在不同的引擎上有不同的存储方式。

    查询语句是使用传统的sql语句,拥有较为成熟的体系,成熟度很高。

    开源数据库的份额在不断增加,MySQL的份额也在持续增长。

    处理海量数据的效率会显著变慢。

    Mongodb属于非关系型数据库,它具有以下特点:

    数据结构由键值对组成。

    存储方式:虚拟内存+持久化。

    查询语句是独特的Mongodb的查询方式。

    可以通过副本集、分片来实现高可用。

    数据是存储在硬盘上的,只不过需要经常读取的数据会被加载到内存中,将数据存储在物理内存中,从而达到高速读写。

    新兴数据库,成熟度较低。

    (3)问题扩展

    关系型数据库可以理解为依赖一个模型来创建的数据库,比如我们使用的MySQL中的表是由横列和纵列组成的一个二维表格。关系型数据库可以通过关系模型使多个表的数据关联起来,比如我们平时说的 一对一、一对多、多对一。由于是建立在数据模型的基础上,所以我们可以通过SQL语句很方便的在多个表之间做复杂的查询操作。关系型数据库相对安全,因为直接存储在硬盘中所以突然的宕机、停电等意外不会导致数据丢失。MySQL的存储方式是由自身的引擎决定的,常用的引擎有Innodb和MyISAM。他们主要的区别就是MyISAM 不支持事务,强调的是性能,执行速度比Innodb要快,Innodb提供支持事务等高级数据库功能。

    非关系型数据库即我们常说的NoSQL数据库,部署起来都比较简单,没有关系型数据库那么复杂。Mongo的存储方式为虚拟内存+持久化存储,Mongo将数据写入内存中,再由虚拟内存管理器将其持久化到硬盘中,因此写操作会比关系型数据库快很多。NOSQL的存储格式是key-value形式,可以像关系型数据库那样存储基础数据类型的数据,也可以存储集合、对象等等。NoSQL虽然性能比较高,但是并不支持事物,也不能进行联表查询,一般用于较大规模数据的存储。

    (4)结合项目中使用

    猜你喜欢:

    展开全文
  • 爬虫的数据存储方式: 1.存储到本地 2.存储到数据库(常见的数据库:MySQL和MangoDB) 2.MangDB数据库概述 MangDB数据库功能: 1.模式自由:可将不同结构的文档存储在同一个数据库中 2. 面向集合的存储:适合JSON...

    1.数据库存储概述

    爬虫的数据存储方式:
    1.存储到本地
    2.存储到数据库(常见的数据库:MySQL和MangoDB)

    2.MangDB数据库概述

    MangDB数据库功能:

    1.模式自由:可将不同结构的文档存储在同一个数据库中
    2. 面向集合的存储:适合JSON文件风格的形式
    3.完整的索引支持
    4.复制和高可用性
    5.自动分片
    6.丰富的查询
    7.快速就地更新
    8.高效的传统存储方式

    2.1MangDB数据在Wins系统下的安装

    1. 下载官网:https://www.mongodb.com/download-center#community

    2. 安装:使用下图【修改安装路径】
      在这里插入图片描述
      在这里插入图片描述
      3.添加路径: Path【F:\MangDB4.4.8\bin】

    4.创建数据库文件的存放位置
    在安装路径MangDB4.4.8\data文件夹中新建子文件夹db【F:\MangDB4.4.8\data\db】

    5.配置本地Windows mongodb服务【实现开机自启动】

    在MangDB4.4.8安装根目录下新建配置文件【mongo.config】,其中该文件位置同bin目录同级
    	# 数据库路径
    mongodb.config配置内容如下:
    dbpath=F:\MangDB4.4.8\data\db
    # 日志输出文件
    logpath=F:\MangDB4.4.8\log\mongod.log
    # 错误日志是否追加
    #logappend=true
    # 启用日志文件
    journal=true
    # 过滤无用日志
    quiet=true
    port=27017
    
    

    6.运行代码:【管理员方式运行cmd】
    在这里插入图片描述

    Win+R—>cmd—>:

    mongod --dbpath F:\MangDB4.4.8\data\db
    

    同时在浏览器中输入:http://localhost:27017

    7.安装MongoDB服务:
    以管理员身份打开cmd,输入:

    mongod --dbpath "F:\MangDB4.4.8\data\db" --logpath "F:\MangDB4.4.8\log\mongod.log" --install --serviceName "MongoDB"
    
    1.若中间出现问题,则必须先删除服务:sc delete MongoDB,之后再输入上述命令
    2.Win+R 输入:services.msc查看MongoDB服务是否开启
    

    常用命令:
    启动MongoDB服务器:net start MongoDB
    若想关闭:net stop MongoDB

    如果下次使用:

    1.使用管理员方式打开cmd
    2.输入net start MongoDB
    3.使用。如:show dbs
    

    3.实例

    安装: pip install pymongo

    import requests
    from time import sleep
    from pymongo import *
    from lxml import etree
    from pymongo import MongoClient
    
    header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36'
    }
    
    client = MongoClient()   #创建连接
    db = client.spider   #访问数据库spider  #如果没有spider数据库,则会自动创建该数据库
    collection = db.moive250    #创建集合   集合在MySQL中对应的是table
    
    def douban(url):
        page_text = requests.get(url=url,headers=header).text
    
        #解析具体网页
        tree = etree.HTML(page_text)
        li_list = tree.xpath('//*[@id="content"]/div/div[1]/ol/li')
        # print(li_list)
    
        for li in li_list:
    
            page_url = li.xpath('./div/div[2]/div[1]/a/@href')[0]
    
            #详情页面处理
            page_text = requests.get(url=page_url,headers=header).text
    
            trees = etree.HTML(page_text)
    
            #电影名称
            movie_name = trees.xpath('//*[@id="content"]/h1/span[1]/text()')[0]
    
            #豆瓣评分:
            movie_score = trees.xpath('//*[@id="interest_sectl"]/div[1]/div[2]/strong/text()')[0]
    
            dic = {
                'movie_name':movie_name,
                'movie_score':movie_score,
                'movie_url':page_url,
            }
            collection.insert_one(dic)
            print(dic)
    
    
    def main():
    
        for i in range(0,2):
            full_url = 'https://movie.douban.com/top250?start=' + str(i*25)
            print('完整的url:',full_url)
            douban(full_url)
            # 根据条件查找数据库MongoDB
            cursor = collection.find({'movie_score':'9.3'})
            for doc in cursor:
                print(doc)
    
    if __name__ == '__main__':
        main()
        print('完成!!!')
    

    MongoDB使用步骤:

    1.导包:from pymongo import MongoClient
    2.创建对象:client = MongoClient() #client = MongoClient(‘localhost’,27017)
    3.创建数据库:db = client.spyder #spyder为数据库名称
    4.创建集合:collection = db.insert_one(data_dict)

    展开全文
  • 配置MySql关于MySQL在Ubuntu的Pycharm上的配置,可以参考这篇文章中的第三部分如果上面的步骤处理完毕后找不到你新建的数据库, 可以参照下图配置勾选要显示的Schemas(数据库集合)数据存储需要用到pymysql模块, 在File...

    配置MySql

    关于MySQL在Ubuntu的Pycharm上的配置,可以参考这篇文章中的第三部分

    如果上面的步骤处理完毕后找不到你新建的数据库, 可以参照下图配置

    17c9241acc71?from=groupmessage

    勾选要显示的Schemas(数据库集合)

    数据存储需要用到pymysql模块, 在File->Settings中找到如图的设置页面,点击加号搜索pymysql并安装

    17c9241acc71?from=groupmessage

    如何存储

    在开始考虑如何存储之前, 我们需要考虑一个问题, 数据存储应该是什么时候要做的事.

    假设你已经了解过Scrapy框架, 下面是来自官网对item pipeline的典型应用

    清理数据

    验证爬取的数据(检查item包含某些字段)

    查重(并丢弃)

    将爬取结果保存到数据库中

    我们要实现的数据存储, 先来试一试能否成功吧

    # 你可以参考以下代码编写自己的pipeline

    import pymysql

    class jobCrawlerPipeline(object):

    def process_item(self, item, spider):

    '''

    将爬取的信息保存到mysql

    :param item:

    :param spider:

    :return: item

    '''

    # Get data from item

    job_name = item['job_name']

    company = item['company']

    address = item['address']

    salary = item['salary']

    time = item['time']

    # Connecting with local database, change the value if not the same

    db = pymysql.connect(

    host='localhost',

    user='root',

    passwd='1320',

    db='scrapyDB',

    charset='utf8',

    cursorclass=pymysql.cursors.DictCursor)

    try:

    # open the cursor

    cursor = db.cursor()

    sql = 'INSERT INTO tb_job(job_name,company,address,salary,time)' \

    'VALUES ("%s", "%s", "%s", "%s", "%s")' % (job_name,company,address,salary,time)

    # execute the sql

    cursor.execute(sql)

    db.commit()

    finally:

    # close the connection

    db.close()

    return item

    爬虫尚未结束, 但是通过终端, 我们知道该停下爬虫了.

    17c9241acc71?from=groupmessage

    爬取中...

    17c9241acc71?from=groupmessage

    存储在MySQL的信息

    重新回到爬虫项目的思路

    思考整个爬虫项目的流程, 应该是这样

    抓取信息->清理信息->整理信息->存储信息->分析信息

    数据整理

    而上面的存储信息虽然已经成功了一部分,但是薪资信息仍需要整理,更重要的是爬取的信息中没有明确的id, 如何在后续中加入topSalary, bottomSalary 等整理后才有的信息与之对应呢?

    重新审视Item Pipeline的典型应用, 我们能不能在Pipeline上实现整理,清理, 验证或是丢弃呢?

    分析item中的项目, 整理和验证可能是最容易实现的部分

    我们先把整理功能实现并验证是否成功, 在class jobCrawlerPipeline(object):中添加下面这个方法.用于把爬取下来的工资数据进行整理,关于这个方法的实现,请参考前一篇爬虫练习之数据整理——基于Pandas

    class jobCrawlerPipeline(object):

    def cut_word(self, word, method):

    if method == 'bottom':

    length = len(word)

    if (word.find('万') == -1):

    if (word.find('以下') != -1):

    # XX千以下

    postion = word.find('以下')

    bottomSalary = str(word[:(postion - 5)])

    elif (word.find('以上') != -1):

    postion = word.find('以上')

    bottomSalary = str(float(word[:postion - 5]))

    else:

    # XX千/月

    postion = word.find('-')

    bottomSalary = str(float(word[:(postion)]))

    else:

    if (word.find('年') == -1):

    if (word.find('以下') != -1):

    # XX万以下

    postion = word.find('以下')

    bottomSalary = str(float(word[:(postion - 5)]) * 10)

    elif (word.find('以上') != -1):

    # XX万以上

    postion = word.find('以上')

    bottomSalary = str(float(word[:postion - 5]) * 10)

    elif (word.find('+') != -1):

    # XX万+

    postion = word.find('+')

    bottomSalary = str(float(word[:(postion)]) * 10)

    else:

    # XX万/月

    postion = word.find('-')

    bottomSalary = str(float(word[:(postion)]) * 10)

    else:

    if (word.find('以下') != -1):

    # XX万以下/年

    postion = word.find('以下')

    bottomSalary = str(float(word[:(postion - 5)]) / 1.2)

    elif (word.find('以上') != -1):

    postion = word.find('以上')

    bottomSalary = str(float(word[:postion - 5]) / 1.2)

    elif (word.find('+') != -1):

    # XX万+

    postion = word.find('+')

    bottomSalary = str(float(word[:(postion)]) / 1.2)

    else:

    # XX万/年

    postion = word.find('-')

    bottomSalary = word[:(postion)]

    bottomSalary = str(float(bottomSalary) / 1.2)

    return bottomSalary

    if method == 'top':

    length = len(word)

    if (word.find('万') == -1):

    if (word.find('以下') != -1):

    # XX千以下

    postion = word.find('以下')

    topSalary = str(float(word[:(postion - 5)]))

    elif (word.find('以上') != -1):

    postion = word.find('以上')

    topSalary = str(float(word[:postion - 5]))

    else:

    # XX千/月

    postion = word.find('-')

    topSalary = str(float(word[(postion + 1):(length - 11)]))

    else:

    if (word.find('年') == -1):

    if (word.find('以下') != -1):

    # XX万以下

    postion = word.find('以下')

    topSalary = str(float(word[:(postion - 5)]) * 10)

    elif (word.find('以上') != -1):

    # XX万以上

    postion = word.find('以上')

    topSalary = str(float(word[:postion - 5]) * 10)

    else:

    # XX万/月

    postion = word.find('-')

    topSalary = str(float(word[(postion + 1):(length - 11)]) * 10)

    else:

    if (word.find('以下') != -1):

    # XX万以下/年

    postion = word.find('以下')

    topSalary = str(float(word[:(postion - 5)]) / 1.2)

    elif (word.find('以上') != -1):

    # XX万以上一年

    postion = word.find('以上')

    topSalary = str(float(word[:postion - 5]) / 1.2)

    elif (word.find('+') != -1):

    # XX万+

    postion = word.find('+')

    topSalary = str(float(word[:(postion)]) / 1.2)

    else:

    # XX万/年

    postion = word.find('-')

    topSalary = word[(postion + 1):(length - 11)]

    topSalary = str(int(topSalary) / 1.2)

    return topSalary

    如果你看了上面的代码, 你可能发现与前一篇有些许不同, 最主要的差别就是字符串数组切片的位置发生了改变.

    为什么要改呢?

    因为这是Python的编码坑啊

    通过观察终端的输出,可以看到爬下来尚未存储的数据是以unicode的形式存在,这个时候是5个字节一个中文

    因此看到下面截图中的salary,可以判断要得到薪资的底薪和顶薪,需要剔除掉11个字节

    17c9241acc71?from=groupmessage

    爬取数据中

    数据清洗

    至此,数据的基本处理已经合并到Pipeline中,鉴于可能还有脏数据在item中,我们在Pipeline的process_item方法中加入相应的代码

    这段代码应当加在处理数据之前,减少一些系统开销

    # Get data from item

    job_name = item['job_name']

    salary = item['salary']

    dirty_job_name = re.compile(r'(\*|在家|试用|体验|无需|无须|试玩|红包)+')

    dirty_salary = re.compile(r'(小时|天)+')

    # clean dirty data

    if(dirty_job_name.search(str(job_name))):

    raise DropItem("Dirty data %s" % item)

    if(dirty_salary.search(str(salary))):

    raise DropItem("Dirty data %s" % item)

    if(salary == None):

    raise DropItem("Dirty data %s" % item)

    数据存储

    把清洗并整理完毕的数据进行数据存储

    建立数据库的相关MySql语句是

    CREATE DATABASE IF NOT EXISTS scrapyDB DEFAULT CHARACTER SET utf8;

    CREATE TABLE IF NOT EXISTS `tb_job`(

    `job_id` bigint NOT NULL AUTO_INCREMENT,

    `job_name` varchar(50) NOT NULL,

    `company` varchar(50) NOT NULL,

    `address` varchar(50) NOT NULL,

    `bottom_salary` varchar(10) NOT NULL,

    `top_salary` varchar(10) NOT NULL,

    `salary` varchar(15) NOT NULL,

    `time` varchar(10) NOT NULL,

    PRIMARY KEY (`job_id`),

    UNIQUE KEY `unique_info`(`job_name`, `company`, `address`)

    );

    这里实现的思路不止一种

    Solution 1 在process_item中直接将处理完的item保存到数据库中

    实际测试的时候发现保存下来的数据除了job_name字段外, 其他中文字段全部变成Unicode码, 原因不明. 大家如果成功用这种方法实现了, 不妨在留言区告知一下, 毕竟第二种方法多了文件IO的开销, 耗时会比较大

    Solution 2 在爬取结束之后再进行数据库写入操作

    爬取结束后, 用pandas模块的csv读取函数打开爬取完毕的csv文件, 写入数据库

    Attention!

    以上两种方法的commit()建议在全部插入后一次commit完成

    必须在close_spider方法中关闭数据库

    若使用第一种方法, 建议在open_spider中实现数据库初始化工作, 而不是每执行一次process_item进行一次打开关闭数据库

    17c9241acc71?from=groupmessage

    写入数据库

    参考代码

    # Function1

    def open_spider(self, spider):

    self.conn = pymysql.connect(

    host='localhost',

    user='root',

    passwd='mysql',

    db='scrapyDB',

    charset='utf8',

    cursorclass=pymysql.cursors.DictCursor)

    def close_spider(self, spider):

    try:

    # open the cursor

    self.cursor = self.conn.cursor()

    # get data from csv file

    # reload data

    f = open(r'job.csv', 'r')

    f.close()

    job_info = pandas.read_csv(r'job.csv', iterator=True,chunksize=1,

    header=None,names=

    ['job_name','company','address','bottom_salary','top_salary','salary','time'])

    # store data

    for i, job in enumerate (job_info):

    # use -1 or ' ' to fill NAN

    job = job.fillna({'job_name':'','company':'','address':'','time':''})

    job = job.fillna(-1)

    # transform series to list type

    job = job.values[0]

    sql = 'INSERT INTO tb_job(job_name,company,address,bottom_salary,top_salary,salary,time)' \

    'VALUES ("%s", "%s", "%s", "%s", "%s", "%s", "%s")' % (

    job[6], job[2], job[3], job[1], job[5], job[0], job[6])

    self.cursor.execute(sql)

    self.conn.commit()

    finally:

    # close the connection

    self.conn.close()

    # Function2

    # 未将打开关闭数据库拆分出来, 请自行修改

    db = pymysql.connect(

    host='localhost',

    user='root',

    passwd='mysql',

    db='scrapyDB',

    charset='utf8',

    cursorclass=pymysql.cursors.DictCursor)

    try:

    # open the cursor

    cursor = db.cursor()

    sql = 'INSERT INTO tb_job(job_name,company,address,bottom_salary,top_salary,salary,time)' \

    'VALUES ("%s", "%s", "%s", "%s", "%s", "%s", "%s")' % (job_name,item['company'],item['address'],item['bottomSalary'],item['topSalary'],item['salary'],item['time'])

    # execute the sql

    cursor.execute(sql)

    db.commit()

    finally:

    # close the connection

    db.close()

    最终的数据库代码中, 暂时删除了unique_info索引, 原因是当前只需要尚不需要进行增量爬取. 使用unique_info索引后, 如果遇到重复的数据将直接RollBack, 而我们是在最后才一次性commit的, 这样肯定不行

    就需要增加开销去每插入一条数据提交一次

    后续将对这个问题进行处理, 敬请期待

    展开全文
  • JSON支持数据格式: 对象(字典)。使用花括号。 数组(列表)。使用方括号。 整形、浮点型、布尔类型还有null类型。 字符串类型(字符串必须要用双引号,不能用单引号)。...多个数据之间使用逗号分开。...

    JSON支持数据格式:

    1. 对象(字典)。使用花括号。
    2. 数组(列表)。使用方括号。
    3. 整形、浮点型、布尔类型还有null类型。
    4. 字符串类型(字符串必须要用双引号,不能用单引号)。

      Python 编码为 JSON 类型转换对应表:

      PythonJSON
      dictobject
      list, tuplearray
      strstring
      int, float, int- & float-derived Enumsnumber
      Truetrue
      Falsefalse
      Nonenull

    多个数据之间使用逗号分开。
    注意:json本质上就是一个字符串。

    Python3 中可以使用 json 模块来对 JSON 数据进行编解码,它包含了两个函数:

    • json.dumps(): 对数据进行编码。
    • json.loads(): 对数据进行解码。

    字典和列表转JSON:

    import json
    
    books = [
        {
            'title': '钢铁是怎样练成的',
            'price': 9.8
        },
        {
            'title': '红楼梦',
            'price': 9.9
        }
    ]
    
    json_str = json.dumps(books,ensure_ascii=False)
    print(json_str)
    

    因为jsondump的时候,只能存放ascii的字符,因此会将中文进行转义,这时候我们可以使用ensure_ascii=False关闭这个特性。
    Python中。只有基本数据类型才能转换成JSON格式的字符串。也即:intfloatstrlistdicttuple

    将json数据直接dump到文件中:

    json模块中除了dumps函数,还有一个dump函数,这个函数可以传入一个文件指针,直接将字符串dump到文件中。示例代码如下:

    books = [
        {
            'title': '钢铁是怎样练成的',
            'price': 9.8
        },
        {
            'title': '红楼梦',
            'price': 9.9
        }
    ]
    with open('a.json','w') as fp:
        json.dump(books,fp)
    

    将一个json字符串load成Python对象:

    json_str = '[{"title": "钢铁是怎样练成的", "price": 9.8}, {"title": "红楼梦", "price": 9.9}]'
    books = json.loads(json_str,encoding='utf-8')
    print(type(books))
    print(books)
    

    直接从文件中读取json:

    import json
    with open('a.json','r',encoding='utf-8') as fp:
        json_str = json.load(fp)
        print(json_str)

    csv文件处理

    读取csv文件:

    import csv
    
    with open('stock.csv','r') as fp:
        reader = csv.reader(fp)
        titles = next(reader)
        for x in reader:
            print(x)
    

    这样操作,以后获取数据的时候,就要通过下表来获取数据。如果想要在获取数据的时候通过标题来获取。那么可以使用DictReader。示例代码如下:

    import csv
    
    with open('stock.csv','r') as fp:
        reader = csv.DictReader(fp)
        for x in reader:
            print(x['turnoverVol'])
    

    写入数据到csv文件:

    写入数据到csv文件,需要创建一个writer对象,主要用到两个方法。一个是writerow,这个是写入一行。一个是writerows,这个是写入多行。示例代码如下:

    import csv
    
    headers = ['name','age','classroom']
    values = [
        ('zhiliao',18,'111'),
        ('wena',20,'222'),
        ('bbc',21,'111')
    ]
    with open('test.csv','w',newline='') as fp:
        writer = csv.writer(fp)
        writer.writerow(headers)
        writer.writerows(values)
    

    也可以使用字典的方式把数据写入进去。这时候就需要使用DictWriter了。示例代码如下:

    import csv
    
    headers = ['name','age','classroom']
    values = [
        {"name":'wenn',"age":20,"classroom":'222'},
        {"name":'abc',"age":30,"classroom":'333'}
    ]
    with open('test.csv','w',newline='') as fp:
        writer = csv.DictWriter(fp,headers)
        writer = csv.writeheader()
        writer.writerow({'name':'zhiliao',"age":18,"classroom":'111'})
        writer.writerows(values)

     

    MySQL数据库操作

    安装mysql:

    1. 在官网:https://dev.mysql.com/downloads/windows/installer/5.7.html
    2. 如果提示没有.NET Framework框架。那么就在提示框中找到下载链接,下载一个就可以了。
    3. 如果提示没有Microsoft Virtual C++ x64(x86),那么百度或者谷歌这个软件安装即可。
    4. 如果没有找到。那么私聊我。

    navicat是一个操作mysql数据库非常方便的软件。使用他操作数据库,就跟使用excel操作数据是一样的。

    安装驱动程序:

    Python要想操作MySQL。必须要有一个中间件,或者叫做驱动程序。驱动程序有很多。比如有mysqldbmysqlclientpymysql等。在这里,我们选择用pymysql。安装方式也是非常简单,通过命令pip install pymysql即可安装。

    数据库连接:

    数据库连接之前。首先先确认以下工作完成,这里我们以一个pymysql_test数据库.以下将介绍连接mysql的示例代码:

        import pymysql
    
        db = pymysql.connect(
            host="127.0.0.1",
            user='root',
            password='root',
            database='student',
            port=3306
        )
        cursor = db.cursor()
        cursor.execute("select 1")
        data = cursor.fetchone()
        print(data)
        db.close()
    

    插入数据:

    import pymysql
    
    db = pymysql.connect(
        host="127.0.0.1",
        user='root',
        password='root',
        database='student',
        port=3306
    )
    cursor = db.cursor()
    sql = """
    insert into student(
        stuno,stuname,stusex
      ) 
      values(18,'abc','女');
    """
    
    cursor.execute(sql)
    db.commit()
    db.close()
    
    

    如果在数据还不能保证的情况下,可以使用以下方式来插入数据:

    sql = """
    insert into student(
        stuno,stuname,stusex
      ) 
      values(%s,%s,%s);
    """
    
    cursor.execute(sql,(20,'spider','男'))
    

    查找数据:

    使用pymysql查询数据。可以使用fetch*方法。

    1. fetchone():这个方法每次之获取一条数据。
    2. fetchall():这个方法接收全部的返回结果。
    3. fetchmany(size):可以获取指定条数的数据。
      示例代码如下:
    import pymysql
    
    db = pymysql.connect(
        host="127.0.0.1",
        user='root',
        password='root',
        database='student',
        port=3306
    )
    cursor = db.cursor()
    
    sql = """
    select * from student
    """
    
    cursor.execute(sql)
    while True:
        result = cursor.fetchone()
        if not result:
            break
        print(result)
    db.close()
    

    或者是直接使用fetchall,一次性可以把所有满足条件的数据都取出来:

    cursor = db.cursor()
    
    sql = """
    select * from user
    """
    
    cursor.execute(sql)
    results = cursor.fetchall()
    for result in results:
        print(result)
    db.close()
    

    或者是使用fetchmany,指定获取多少条数据:

    cursor = db.cursor()
    
    sql = """
    select * from user
    """
    
    cursor.execute(sql)
    results = cursor.fetchmany(1)
    for result in results:
        print(result)
    db.close()
    

    删除数据:

    sql = """
    delete from student where stuno=99
    """
    
    cursor.execute(sql)
    db.commit()
    db.close()
    

    更新数据:

    sql = """
    update student set stuname='花花' where stuno=18
    """
    
    cursor.execute(sql)
    db.commit()
    db.close()

    展开全文
  • 爬虫抓取数据后,怎样存储才是最好的方式呢?先来盘点一下可以使用的存储方式 以json格式存储到文本文件 存储到excel 存储到sqlite 存储到mysql数据库 存储到mongodb 1、以json格式存储到文本文件 这是最简单,最...
  • 以爬取我自己的博客源码为例子: import requests from pyquery import PyQuery as pq header={ 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/...
  • 文件储存的形式多种多样,比如说保存成TXT纯文本形式,也可以保存为JSON格式、CSV格式等等。 TXT文本存储 将数据保存到TXT文件的操作是非常简单的,而且TXT文本几乎兼容任何平台,但是也是存在缺点的,那就是不...
  • 爬虫持久化存储

    2021-10-26 19:57:28
    支持将数据储存于任何类型的文件 存储代码举例: fileName = word + '.josn' #添加相应的后缀 f = open(fileName,'w',encoding='utf-8') json.dump(dict_obj,fp=f,ensure_ascii=False) 使用数据库持久化存储。...
  • 另外对于爬虫这样的应用,爬取的通常都是非结构化数据,这在关系模型的存储和查询上面都有很大的局限性。但也有一个可能性是你感兴趣的网站都是同样类型的网站,你只对网页上的特定内容有兴趣,这样可以把它们组织成...
  • Python爬虫之数据存储

    千次阅读 2021-01-05 11:55:46
    Python数据存储 数据爬取后,如何存储呢,本文将讲解数据存储到excel、txt、数据库的常用操作 结果展示 这里的结果是直接print出来,如何持久化存储呢 for title,actor,time,score,count,comment in zip(titles,...
  • 爬虫请求解析后的数据,需要保存下来,才能进行下一步的处理,一般保存数据的方式有如下几种: 文件:txt、csv、excel、json等,保存数据量小。 关系型数据库:mysql、oracle等,保存数据量大。 非关系型数据库:...
  • 分布式爬虫

    2020-12-21 12:07:56
    爬虫学习使用指南Auth: 王海飞Data:2018-07-05Email:779598160@qq.comgithub:https://github.com/coco369/knowledge前言说到分布式系统的时候,要和集中式系统进行对比的学习,下面就先介绍下集中式系统,对比...
  • 在最近对网络爬虫的研究中,我一直想写一些关于网络爬虫数据存储的东西。今天,我将介绍网络爬虫中三种常见的数据存储方式及其python实现。常见的三种方式是txt文件、MySQL数据库和excel文件。 1将数据存储到txt文件...
  • python网络爬虫 python爬虫环境与爬虫简介 认识爬虫 浏览网页基本流程 网络爬虫模拟了浏览器去发送请求并且返回响应结果的一个过程。 爬虫概念 网络爬虫也被称为网络蜘蛛、网络机器人,是一个自动下载网页的...
  • 爬虫的四个水平,你在哪一个层次?巅峰爬虫是什么样子?
  • 图片来自于网络Python与数据库-网络爬虫存储@(数据科学)[小树枝来了, 帮助, Markdown, 网络爬虫, 数据存储]关系数据库存储-MySQL为例爬虫配合MySQL存储瑞士军刀-SQLite分布式数据存储-NoSQL数据库爬虫配合mongoDB...
  • python爬虫之通用爬虫和聚焦爬虫1. 通用爬虫1.1 定义1.2 抓取流程:1.3 搜索引擎如何获取一个新网站的url:1.4 Robots协议1.5 通用爬虫工作流程2 聚焦爬虫2.1 出现的必然2.2 定义 爬虫根据使用场景分为通用爬虫和聚焦...
  • 才接触爬虫,看了网上一个中国大学排名的案列。案列只爬了一个网页,我就想做个修改。在链接页把所有链接爬下来,再把大学的各种排名列出来。写完代码发现,列表一直重复打印第一个链接里面的内容。求大佬告知如何...
  • python爬虫-存储模块

    2021-11-12 15:56:15
    python爬虫-存储模块1.前述2.txt文件存储存储在表格中存储在文档中存储二进制文件 1.前述 在我们爬取数据中需要存储一些数据,这里写了几种存储的方式。 2.txt文件存储 这是一种普通的存储方式,也是一种简单的存储...
  • 之前学习的JSON和CSV两种数据存储方式,都是基于文件的存储,有时候运用起来或许不是那么方便,为此本节来介绍基于数据库管理的存储方式。在日常工作中,常用的数据库分为关系型数据库和非关系型数据库。关系型...
  • 爬虫入门

    2021-05-11 19:55:33
    从功能上来讲,爬虫一般分为数据采集,处理,储存三个部分。一.什么是爬虫爬虫就像是一直蜘蛛一样 ,而互联网是就像是一张大大的蜘蛛网一样。简单的说爬虫就是请求网站并提取数据的自动化程序...
  • 使用Python爬虫我们可以轻松的从互联网中抓取我们想要的数据,本文将基于爬取B站视频热搜榜单数据并存储为例,四个步骤详细介绍Python爬虫的基本流程。Step 1请求尝试首先进入b站首页,点击排行榜并复制链接。...
  • 逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号)是存储表格数据常用文件格式。Microsoft Excel 和很多应用都支持 CSV 格式,因为它很简洁。下面是一个 CSV 文件的...
  • spider方法,存储数据 def open_spider(self, spider): self.fp = open('./qiubai.txt', 'w', encoding='utf-8') print('开始爬虫') # 专门用来处理item类型对象 def process_item(self, item, spider): author = ...
  • 数据的扩展能力将多进程爬虫部署到多台主机上将数据库地址配置到统一的服务器上将数据库设置仅允许特定IP来源的访问请求设置防护墙,允许端口远程连接分布式爬虫系统-爬虫分布式存储爬虫原数据存储特点1.文件小,...
  • 爬虫分类 通用爬虫 聚焦爬虫 增量式爬虫 通用爬虫 和 聚焦爬虫 之前的博客有讲解过了,本篇主要讲解增量式爬虫 增量式爬虫 概念:检测网站数据更新的情况,只会爬取最新更新的数据 适用于持续跟踪网站的数据爬取。...
  • 编写脚本 参考: github无法访问,链接超时解决办法 详解Python requests 超时和重试的方法-转载 python 爬虫随机获取User-Agent 使用 Python 爬虫访问 Github,经常出现连接超时、或读取超时的错误。 访问 Github ...
  • BXG-2018-5 8.95GB 高清视频第 一 章:解析python网络爬虫:核心技术、Scrapy框架、分布式爬虫1-1 初识爬虫1-1-1 1.1-爬虫产生背景1-1-2 1.2-什么是网络爬虫1-1-3 1.3-爬虫的用途1-1-4 1.4-爬虫分类1-2 爬虫的实现...
  • java爬虫和python爬虫哪个好

    千次阅读 2021-03-01 09:34:25
    python优点:1.各种爬虫框架,方便高效的下载网页;...3.gae 的支持,当初写爬虫的时候刚刚有 gae,而且只支持 python ,利用 gae 创建的爬虫几乎免费,最多的时候我有近千个应用实例在工作。java 和 c++ :相...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 100,089
精华内容 40,035
关键字:

存储爬虫

爬虫 订阅