• 数据存储之使用mysql数据库存储数据


     

    推荐安装mysql5.7环境:

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

    Navicat Premium 版本:

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

    1.官网下载:http://www.navicat.com.cn/download/navicat-premium

    推荐使用 (官网最新版的没有破解成功,推荐这个版本)Navicat Premium 12.0.27简体中文64位,密码: s9f8


    2.破解参考
    https://blog.csdn.net/pippa134679/article/details/81354131
    https://www.jianshu.com/p/5f693b4c9468

    安装驱动程序:

    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='pymysql_test',
            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='pymysql_test',
        port=3306
    )
    cursor = db.cursor()
    sql = """
    insert into user(
        id,username,gender,age,password
      )
      values(null,'abc',1,18,'111111');
    """
    cursor.execute(sql)
    db.commit()
    db.close()
    

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

    sql = """
    insert into user(
        id,username,gender,age,password
      )
      values(null,%s,%s,%s,%s);
    """
    
    cursor.execute(sql,('spider',1,20,'222222'))
    

    查找数据:

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

      1. fetchone():这个方法每次之获取一条数据。
      2. fetchall():这个方法接收全部的返回结果。      
      3. fetchmany(size):可以获取指定条数的数据。

      示例代码如下:

    cursor = db.cursor()
    
    sql = """
    select * from user
    """
    
    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()
    

    删除数据:

    cursor = db.cursor()
    
    sql = """
    delete from user where id=1
    """
    
    cursor.execute(sql)
    db.commit()
    db.close()
    

    更新数据:

    conn = pymysql.connect(host='localhost',user='root',password='root',database='pymysql_demo',port=3306)
    cursor = conn.cursor()
    
    sql = """
    update user set username='aaa' where id=1
    """
    cursor.execute(sql)
    conn.commit()
    
    conn.close()
    

    实战抓取安居客广西南宁全区的租房信息(正则表达式,MySQL数据库保存)

    import requests
    import re
    import pymysql
    
    # 实战抓取安居客广西南宁全区的租房信息(正则表达式,数据库保存)
    headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
    }
    
    
    def insert_house_detail(url):
        print(url)
        # 连接数据库和添加数据
        conn = pymysql.connect(host='localhost', user='root', password='password', database='zufang', port=3306)
        cursor = conn.cursor()
    
        # 添加数据
        sql = """
        insert into house(id,title,img,price,payType,leaseType,houseType,address,detail) values(null,%s,%s,%s,%s,%s,%s,%s,%s)
        """
    
        # 获取数据并添加到数据库
        response = requests.get(url, headers=headers)
        text = response.text
        title = re.findall(r'<h3sclass="house-title">(.*?)</h3>', text, re.DOTALL)[0]
        img = re.findall(r'<divsclass="img_wrap">.*?<imgsdata-src="(.*?)".*?>', text, re.DOTALL)[0]
        price = re.findall(r'<spansclass="price">.*?<em>(.*?)</em>', text, re.DOTALL)[0]
        payType = re.findall(r'<spansclass="type">(.*?)</span>', text, re.DOTALL)[0]
        leaseType = re.findall(r'<spansclass="info">(.*?)</span>', text, re.DOTALL)[1]
        houseType = re.findall(r'<spansclass="info">(.*?)</span>', text, re.DOTALL)[0]
        # houseType = re.findall(r'<ul.*?class="f14">.*?<spansclass="c_888 mr_15">.*?<span>(.*?)</span>.*?</li>', text, re.DOTALL)[0].replace('                                ', '').replace(' ', '').strip()
    
        address = re.findall(r'<lisclass="house-info-item l-width">.*?<a.*?>(.*?)</a>', text, re.DOTALL)
        detail_tag = re.findall(r'<divsclass="auto-general">(.*?)</div>', text, re.DOTALL)[0]
        # 去掉抓取到标签和空格
        detail = re.sub('<.+?>', "", detail_tag).replace('                                ', '').strip()
    
    
        cursor.execute(sql, (title, img, price, payType, leaseType, houseType, address, detail))
        conn.commit()
        conn.close()
    
    
    def parse_page(url):
    
        response = requests.get(url, headers=headers)
        text = response.text
        # 先获取url
        urls = re.findall(r'<divsclass="zu-info">.*?<a.*?href="(.*?)".*?>.*?</a>', text, re.DOTALL)[1:-2]
    
        for index,url_tag in enumerate(urls):
            insert_house_detail(url_tag)
    
    
    def main():
        for x in range(1,21):
            url = 'https://nn.zu.anjuke.com/fangyuan/p%s/' % x
            parse_page(url)
    
    
    if __name__ == '__main__':
        main()
    

      

  • 相关阅读:
    牛客IOI周赛17-提高组 卷积 生成函数 多项式求逆 数列通项公式
    6.3 省选模拟赛 Decompose 动态dp 树链剖分 set
    AtCoder Grand Contest 044 A Pay to Win 贪心
    5.29 省选模拟赛 树的染色 dp 最优性优化
    luogu P6097 子集卷积 FST FWT
    CF724C Ray Tracing 扩展欧几里得 平面展开
    5.30 省选模拟赛 方格操作 扫描线 特殊性质
    5.29 省选模拟赛 波波老师 SAM 线段树 单调队列 并查集
    Spring main方法中怎么调用Dao层和Service层的方法
    Bug -- WebService报错(两个类具有相同的 XML 类型名称 "{http://webService.com/}getPriceResponse"。请使用 @XmlType.name 和 @XmlType.namespace 为类分配不同的名称。)
  • 原文地址:https://www.cnblogs.com/chen0307/p/9956258.html
Copyright © 2020-2023  润新知