[CP_16] Python爬虫数据的存储(Excel表格 |
2019-04-22 本文已影响172人
Fighting_001
目录结构
1. 创建Excel表格,向其内写入数据
2. 将爬虫获取的数据写入到Excel中
3. 将爬虫获取的数据写入到MySQL数据库中
1)准备工作:创建数据库表
2)写入数据到MySQL数据库表中
1. 创建Excel表格,向其内写入数据
下载xlsxwriter模块:
pip install xlsxwriter
代码实现:
create-xlsx.py
import xlsxwriter
# 创建文件
wb=xlsxwriter.Workbook("demo.xlsx")
# 添加工作表
ws=wb.add_worksheet()
# 在指定位置写入数据
ws.write("A1","111")
ws.write("A2","222")
ws.write("B1","333")
# 关闭表格文件
wb.close()
执行结果:
2. 将爬虫获取的数据写入到Excel中
<关联> Python数据清洗之正则表达式、实践案例(网站电话号码|电影排行列表)
代码实现:
publicPhone.py
import requests
import re
import xlsxwriter
header={
"user-agent":"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
}
# 发送GET请求,获取响应数据
# 若获取不到响应数据,根据需要关闭SSL验证
url="https://changyongdianhuahaoma.51240.com/"
resp=requests.get(url,headers=header,verify=False).text
# 正则规则
pat1=r'<tr bgcolor="#EFF7F0">[\s\S]*?<td>(.*?)</td>[\s\S]*?<td>[\s\S]*?</td>[\s\S]*?</tr>' # 匹配电话名称
pat2=r'<tr bgcolor="#EFF7F0">[\s\S]*?<td>[\s\S]*?</td>[\s\S]*?<td>(.*?)</td>[\s\S]*?</tr>' # 匹配电话号码
# 转换正则为内部格式
pattern1=re.compile(pat1)
pattern2=re.compile(pat2)
# 从响应数据中匹配数据(匹配结果为列表类型)
data1=pattern1.findall(resp)
data2=pattern2.findall(resp)
# 创建列表,存储"电话名称:电话号码"
result=[]
# 创建表格
wb=xlsxwriter.Workbook("demo2.xlsx")
ws=wb.add_worksheet()
# 遍历每个电话,并写入表格中保存
for i in range(0,len(data1)):
result.append(data1[i]+": "+data2[i]) # 构造每一个电话号码
# 写入数据到Excel表格
ws.write("A"+str(i+1),data1[i])
ws.write("B"+str(i+1),data2[i])
# 关闭表格文件
wb.close()
执行结果:
3. 将爬虫获取的数据写入到MySQL数据库中
<关联> Python访问MySQL数据库、字符格式处理(日期格式| json与字典|字符编码)
1)准备工作:创建数据库表
连接MySQL数据库后,执行命令创建数据库spider,如下:
create database spider
执行以下代码,实现在spider数据库中创建数据表publicPhone,如下:
create-table.py
import pymysql
# 连接数据库:主机地址、端口号;用户名&密码;数据库名
db=pymysql.Connect(host="localhost",port=3306,user="root",passwd="root",db="spider",charset="utf8")
cursor=db.cursor() # 创建游标对象
# 创建表
sql="""
CREATE TABLE publicPhone(
id int NOT NULL AUTO_INCREMENT primary key,
name varchar(20),
phone varchar(32))
"""
cursor.execute(sql) # 执行以上sql语句
db.commit() # 提交事务
db.close() # 关闭数据库连接
2)写入数据到MySQL数据库表中
insert-data.py
import requests
import re
import pymysql
# 建立数据库连接
# 主机地址、端口号;用户名&密码;数据库名
db=pymysql.Connect(host="localhost",port=3306,user="root",passwd="root",db="spider",charset="utf8")
cursor=db.cursor() # 创建游标对象
# 爬取数据
header={
"user-agent":"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
}
# 发送GET请求,获取响应数据
# 若获取不到响应数据,根据需要关闭SSL验证
url="https://changyongdianhuahaoma.51240.com/"
resp=requests.get(url,headers=header,verify=False).text
# 处理数据
# 正则规则设置
pat1=r'<tr bgcolor="#EFF7F0">[\s\S]*?<td>(.*?)</td>[\s\S]*?<td>[\s\S]*?</td>[\s\S]*?</tr>' # 匹配电话名称
pat2=r'<tr bgcolor="#EFF7F0">[\s\S]*?<td>[\s\S]*?</td>[\s\S]*?<td>(.*?)</td>[\s\S]*?</tr>' # 匹配电话号码
# 转换正则为内部格式
pattern1=re.compile(pat1)
pattern2=re.compile(pat2)
# 从响应数据中匹配数据(匹配结果为列表类型)
data1=pattern1.findall(resp)
data2=pattern2.findall(resp)
# 创建列表,存储"电话名称:电话号码"
result=[]
# 清空数据库中原有的数据
sql_1="DELETE FROM publicPhone"
cursor.execute(sql_1)
db.commit()
# 遍历每个电话,并写入数据表中保存
for i in range(0,len(data1)):
result.append(data1[i]+": "+data2[i]) # 构造每一个电话号码
# 向数据表中增加数据
sql_2="INSERT INTO publicPhone(name,phone) VALUES('"+data1[i]+"','"+data2[i]+"');"
cursor.execute(sql_2) # 执行以上sql语句
db.commit() # 提交事务
db.close() # 关闭数据库连接
执行结果: