本文使用python中的pymysql库连接MySQL数据库,完成建表、写入数据和查询的过程。为了保证内容的完整性,我们将内容分为两个阶段。第一阶段简单介绍数据爬取过程。看过之前爬虫文章的同学请无视。第二阶段介绍将爬取的数据写入MySQL数据库的过程。1、使用python爬取数据。第一阶段介绍数据爬取过程。首先导入需要的库文件,主要有requests、re和pandas。具体作用在注释中有说明,这里不再赘述。#导入requests库(请求和页面爬取)importrequests#导入正则库(页面代码提取信息)importre#导入科学计算库(表格拼写和各种分析总结)importpandasaspd在爬取请求中设置头文件信息。#设置请求中头文件的信息headers={'User-Agent':'Mozilla/5.0(WindowsNT6.1)AppleWebKit/537.11(KHTML,likeGecko)Chrome/23.0.1271.64Safari/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'"returnfalse".*?title="(.*?)"',html)#使用正则化提取total字段信息total=re.findall(r'"total">(.*?)10,000<',html)#提取rate字段信息使用正则rate=re.findall(r'"rate">(.*?)<',html)#提取pnum字段使用正则信息pnum=re.findall(r'"pnum">(.*?)person<',html)#提取周期字段信息cycle=re.findall(r'"cycle">(.*?)month<',html)#使用正则提取plnum字段信息p1num=re.findall(r'"p1num">(.*?)person<',html)#使用正则提取fuload字段信息fuload=re.findall(r'"fuload">(.*?)Minutes<',html)#Extractalltotalfieldinformationusingregularalltotal=re.findall(r'"alltotal">(.*?)10,000<',html)#Extractcaptial字段信息使用正则capital=re.findall(r'"capital">(.*?)10,000<',html)查看其中一个字段的信息,这里我们查看平台名称标题的提取结果。#这里查看title字段信息title***第一阶段的数据爬取工作完成,现在我们有9个字段的数据,下一阶段我们将连接到MySQL数据库,写入这9个字段的数据到数据库里面。2、连接MySQL数据库写入和读取数据第二阶段,我们使用python的pymysql库连接MySQL数据库。如果是第一次使用这个库,需要先通过pipinstallpymysql安装,然后再导入pymysql库文件。#导入pymysql库importpymysql首先连接MySQL数据库,这里需要输入数据库的ip地址、用户名、密码、数据库名、端口号等信息。我只是在这里简单地保留了ip地址、用户名和数据库名称。请根据您数据库中的实际信息填写各个参数的内容。#打开数据库连接db=pymysql.connect("192.168.0.1","root","","shuju_test")使用cursor()创建游标对象#使用cursor()方法创建游标对象cursorcursor=db.cursor()在数据库中创建包含9个字段的数据表,用于写入数据。这里分为两步。第一步是编写创建数据表的SQL语句。第二步使用execute()执行SQL语句#Createatablesql1="CREATETABLEwdty7(titlevarchar(255),totalvarchar(255),ratevarchar(255),people_numvarchar(255),cyclevarchar(255),people_lend_numvarchar(255),full_loadvarchar(255),all_totalvarchar(255),capitalvarchar(255))"#使用execute()方法执行SQL语句cursor.execute(sql1)创建数据表后,开始写入数据,这里我们使用for循环到数据表中,将9个字段的数据一一写入。#在表中新建一条记录foriinrange(len(title)):sql="INSERTINTO`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*FROMwdty6wherecycle>0.6;"#使用execute()方法执行SQL查询cursor.execute(sql1)使用fetchall()获取刚刚写入的所有9个字段的数据,保存在data中。#使用fetchall()方法获取所有数据data=cursor.fetchall()将data中的数据转换为pandasDataFrame格式。#将获取数据(data),columns=columns)查看从数据库中提取的数据。这里有一个问题。平台名title字段的中文写入数据库后变成乱码,应该是编码转换的问题。目前还没有找到解决方案。如果有人知道解决方案,请赐教。#查看数据表df.head()***,所有操作完成后关闭与数据库的连接。#关闭数据库连接db.close()
