使用python连接MySQL数据库
作者: 蓝鲸
本篇文章使用python中的pymysql库连接MySQL数据库,并完成建表,数据写入和查询的过程。为了保证内容的完整性,我们将内容分为两个 阶段,第一阶段简单介绍数据的爬取过程。看过之前爬虫文章的同学请直接忽略。第二阶段介绍将爬去的数据写入MySQL数据库的过程。
1,使用python抓取并提取数据
第一阶段介绍数据爬取过程,首先导入所需的库文件,主要包括requests,re和pandas三个库。具体作用在注释中进行了说明,这里不再赘述。
#导入requests库(请求和页面抓取) import requests #导入正则库(从页面代码中提取信息) import re #导入科学计算库(拼表及各种分析汇总) import pandas as pd
设置爬取请求中的头文件信息。
#设置请求中头文件的信息 headers = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11' , 'Accept' : 'text/html;q=0.9,*/*;q=0.8' , 'Accept-Charset' : 'ISO-8859-1,utf-8;q=0.7,*;q=0.3' , 'Connection' : 'close' , 'Referer' : 'https://www.baidu.com/' }
开始抓取数据,并查看抓取到的网页内容。这里我们所需要的数据还在页面源码中,需要使用正则表达式进行提取。
#抓取并保存页面信息 r=requests. get ( 'http://www.p2peye.com/shuju/ptsj/' ,headers=headers ) html=r. content #对抓取的页面进行编码 html= str ( html, encoding = "GBK" ) #查看抓取的页面源码 html
使正则表达式从抓取到的网页源码中提取所需数据。这里我们一共提取9个字段。
#使用正则提取title字段信息 title= re . findall ( r '"return false".*?title="(.*?)"' ,html ) #使用正则提取total字段信息 total= re . findall ( r '"total">(.*?)万<' ,html ) #使用正则提取rate字段信息 rate= re . findall ( r '"rate">(.*?)<' ,html ) #使用正则提取pnum字段信息 pnum= re . findall ( r '"pnum">(.*?)人<' ,html ) #使用正则提取cycle字段信息 cycle= re . findall ( r '"cycle">(.*?)月<' ,html ) #使用正则提取plnum字段信息 p1num= re . findall ( r '"p1num">(.*?)人<' ,html ) #使用正则提取fuload字段信息 fuload= re . findall ( r '"fuload">(.*?)分钟<' ,html ) #使用正则提取alltotal字段信息 alltotal= re . findall ( r '"alltotal">(.*?)万<' ,html ) #使用正则提取captial字段信息 capital= re . findall ( r '"capital">(.*?)万<' ,html )
查看其中一个字段的信息,这里我们查看平台名称title的提取结果。
#查看title字段信息
title
到这里第一阶段的数据爬取工作完成了,现在我们有9个字段的数据,在下一阶段中我们将连接MySQL数据库,并将这9个字段的数据写到数据库里。
2,连接MySQL数据库写入并读取数据
在第二阶段,我们使用python的pymysql库连接MySQL数据库。如果你是第一次使用这个库需要先通过pip install pymysql进行安装,然后导入pymysql库文件。
#导入pymysql库 import pymysql
首先连接MySQL数据库,这里需要输入数据库的ip地址,用户名,密码,数据库名称,端口号等信息。我在这里只简单些了ip地址,用户名和数据库名称。每个参数的内容请按你数据库的实际信息进行填写。
#打开数据库连接 db = pymysql. connect ( "192.168.0.1" , "root" , "" , "shuju_test" )
使用 cursor()创建一个游标对象
# 使用 cursor() 方法创建一个游标对象 cursor cursor = db. cursor ( )
在数据库中创建一个包含9个字段的数据表,用于写入数据。这里具体分为两步,第一步写出创建数据表的SQL语句。第二步使用execute()执行SQL语句
#创建一个表 sql1 = "CREATE TABLE wdty7( title varchar(255), total varchar(255), rate varchar(255), people_num varchar(255), cycle varchar(255), people_lend_num varchar(255), full_load varchar(255), all_total varchar(255), capital varchar(255)) " # 使用 execute() 方法执行 SQL 语句 cursor. execute ( sql1 )
创建完数据表后,开始写入数据,这里我们使用for循环向数据表中逐条写入9个字段的数据。
#向表中创建新的记录 for i in range ( len ( title ) ) : sql= "INSERT INTO `wdty6`(`title`, `total`, `rate`, `people_num`, `cycle`, `people_lend_num`, `full_load`, `all_total`, `capital`)VALUES ( %s, %s, %s, %s, %s, %s, %s, %s, %s);" values= ( title [ i ] . encode ( "utf-7" ) . decode ( "latin1" ) ,total [ i ] ,rate [ i ] ,pnum [ i ] ,cycle [ i ] ,p1num [ i ] ,fuload [ i ] ,alltotal [ i ] ,capital [ i ] ) cursor. execute ( sql,values ) db. commit ( )
创建一个查询语句并使用execute()方法执行查询。
#设置查询语句 sql1= "SELECT * FROM wdty6 where cycle>0.6;" # 使用 execute() 方法执行 SQL 查询 cursor. execute ( sql1 )
使用fetchall()获取刚才写入的所有9个字段的数据,并保存在data中。
#使用fetchall()方法获取所有数据 data = cursor. fetchall ( )
将data中的数据转为pandas的DataFrame格式。
#将获取数据 import pandas as pd columns= [ "title" , "total" , "rate" , "people_num" , "cycle" , "people_lend_num" , "full_load" , "all_total" , "capital" ] df = pd. DataFrame ( list ( data ) ,columns=columns )
查看从数据库中提取的数据,这里有个问题,平台名称title字段中的中文在写入数据库后变成了乱码,应该是编码转换的问题。目前还没有找到解决办法。如有知道解决办法的朋友请赐教。
#查看数据表 df. head ( )
最后,完成所有操作后关闭数据库的连接。
# 关闭数据库连接 db. close ( )
End.
转载请注明来自36大数据(36dsj.com): 36大数据 » 使用python连接MySQL数据库