在使用工具解析到网页上的数据后,要想办法把数据存储起来,这也是网络爬虫的最后一步。在最近一段时间学习网络爬虫的过程中,一直想写点东西介绍一下网络爬虫数据存储方面的内容,今天以博客的形式对这方面的内容进行总结,介绍网络爬虫中数据存储的三种常用方式及其python实现,三种常见方式分别是:txt文件、MySQL数据库、excel文件,实现中使用的数据是前几篇博客中提到的中彩网福彩3D的开奖数据。
1 将数据存储到txt文件
将数据写入到txt文件或csv文件中的方法有很多,这里介绍两种比较常用的方法:
1.1 以数组的方式将数据存储到txt文件
以数组的方式将爬取到的数据写入到txt文件,是将数据存放在一维或二维数组中,然后使用numpy.savetxt()方法将数据写入到txt文件,np.savetxt()方法【点击打开网页】的介绍如下图:
将数据以数组的形式存储到txt文件中的具体代码如下:
#-*-coding:utf-8-*-
"""
@author:taoshouzheng
@time:2018/7/17 9:07
"""
from bs4 import BeautifulSoup
from urllib import request
import numpy as np
"""
使用BeautifulSoup模块和CSS选择器获取中彩网福彩3D的开奖数据
"""
# 定义获取所有页面对应的url的函数
def get_all_urls():
"""
:return: url列表
"""
# 创建url列表
url_list = []
# 第一页的真实请求地址
ori_url = 'http://kaijiang.zhcw.com/zhcw/html/3d/list.html'
# 加入列表
url_list.append(ori_url)
# 生成并遍历列表
for i in list(range(2, 247)):
url = 'http://kaijiang.zhcw.com/zhcw/html/3d/list_' + str(i) + '.html'
# 加入列表
url_list.append(url)
# 打印消息
print('成功获取url!')
# 返回列表
return url_list
# 定义使用BeautifulSoup和CSS选择器解析页面的函数
def parse_per_page(url):
"""
:param url:页面对应的url
:return: 页面中包含的数据列表
"""
# 创建Request对象
req = request.Request(url=url)
# 传入用户代理
req.add_header('User-Agent', 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19')
# 发送请求,读取打开网页
response = request.urlopen(req)
# 读取网页内容,重新编码
html = response.read().decode('utf-8')
# 创建BeautifulSoup对象用于解析网页内容
html_soup = BeautifulSoup(html, 'lxml')
# 创建存放每个页面数据的列表
per_page_data = []
# 遍历tr标签列表
for item in html_soup.select('tr')[2:-1]:
# 创建存放每天数据的列表
per_day_data = []
# 开奖时间
time = item.select('td')[0].text
per_day_data.append(time)
# 期号
issue = item.select('td')[1].text
per_day_data.append(issue)
# 中奖号码
digits = int(str(item.select('td > em')[0].text) + str(item.select('td > em')[1].text) + str(item.select('td > em')[2].text))
per_day_data.append(digits)
# 单选
single_selection = item.select('td')[3].text
per_day_data.append(single_selection)
# 组选3
group_selection_3 = item.select('td')[4].text
per_day_data.append(group_selection_3)
# 组选6
group_selection_6 = item.select('td')[5].text
per_day_data.append(group_selection_6)
# 销售额
sales = item.select('td > strong')[0].text
per_day_data.append(sales)
# 返奖比例
return_rates = item.select('td')[7].text
per_day_data.append(return_rates)
# 将每天的数据加入每页的数据中
per_page_data.append(per_day_data)
# 打印消息
print('解析页面成功!')
# 返回一维列表
return per_page_data
# 主模块
if __name__ == "__main__":
# 创建用于存放所有数据的列表
all_data = []
# 调用函数获取所有的url
url_list = get_all_urls()
# 遍历列表中的每一个url
for url in url_list:
# 调用函数解析每一个网页
page_data = parse_per_page(url=url)
# 将每页的数据加入总的二维列表中
all_data.extend(page_data)
# 将存放所有数据的二维列表转化为数组
all_data_array = np.array(all_data)
# 表头信息
header = '开奖日期' + '\t' + '期号' + '\t' + '中奖号码' + '\t' + '单选' + '\t' + '组选3' + '\t' + '组选6' + '\t' + '销售额(元)' + '\t' + '返奖比例'
# 将数组中元素写入txt文件中
np.savetxt('结果1.txt', all_data_array, fmt='%s', delimiter='\t', header=header, comments='', encoding='utf-8')
# 打印消息
print('数据写入到结果1.txt成功!')
效果截图如下:
1.2 以列表的形式将数据存储到txt文件
以列表的方式将爬取到的数据存储到.txt文件中,在本例中,是通过两层for循环遍历列表元素实现的。将数据以列表的形式存储到txt文件中的具体代码如下:
#-*-coding:utf-8-*-
"""
@author:taoshouzheng
@time:2018/7/17 9:07
"""
from bs4 import BeautifulSoup
from urllib import request
"""
使用BeautifulSoup模块和CSS选择器获取中彩网福彩3D的开奖数据
"""
# 定义获取所有页面对应的url的函数
def get_all_urls():
"""
:return: url列表
"""
# 创建url列表
url_list = []
# 第一页的真实请求地址
ori_url = 'http://kaijiang.zhcw.com/zhcw/html/3d/list.html'
# 加入列表
url_list.append(ori_url)
# 生成并遍历列表
for i in list(range(2, 247)):
url = 'http://kaijiang.zhcw.com/zhcw/html/3d/list_' + str(i) + '.html'
# 加入列表
url_list.append(url)
# 打印消息
print('成功获取url!')
# 返回列表
return url_list
# 定义使用BeautifulSoup和CSS选择器解析页面的函数
def parse_per_page(url):
"""
:param url:页面对应的url
:return: 页面中包含的数据列表
"""
# 创建Request对象
req = request.Request(url=url)
# 传入用户代理
req.add_header('User-Agent', 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19')
# 发送请求,读取打开网页
response = request.urlopen(req)
# 读取网页内容,重新编码
html = response.read().decode('utf-8')
# 创建BeautifulSoup对象用于解析网页内容
html_soup = BeautifulSoup(html, 'lxml')
# 创建存放每个页面数据的列表
per_page_data = []
# 遍历tr标签列表
for item in html_soup.select('tr')[2:-1]:
# 创建存放每天数据的列表
per_day_data = []
# 开奖时间
time = item.select('td')[0].text
per_day_data.append(time)
# 期号
issue = item.select('td')[1].text
per_day_data.append(issue)
# 中奖号码
digits = int(str(item.select('td > em')[0].text) + str(item.select('td > em')[1].text) + str(item.select('td > em')[2].text))
per_day_data.append(digits)
# 单选
single_selection = item.select('td')[3].text
per_day_data.append(single_selection)
# 组选3
group_selection_3 = item.select('td')[4].text
per_day_data.append(group_selection_3)
# 组选6
group_selection_6 = item.select('td')[5].text
per_day_data.append(group_selection_6)
# 销售额
sales = item.select('td > strong')[0].text
per_day_data.append(sales)
# 返奖比例
return_rates = item.select('td')[7].text
per_day_data.append(return_rates)
# 将每天的数据加入每页的数据中
per_page_data.append(per_day_data)
# 打印消息
print('解析页面成功!')
# 返回二维列表
return per_page_data
# 主模块
if __name__ == "__main__":
# 以遍历二维列表元素的形式将数据写入到txt文件中
with open('结果1_1.txt', 'a', encoding='utf-8') as f_obj:
# 写入表头
f_obj.write('开奖日期' + '\t' + '期号' + '\t' + '中奖号码' + '\t' + '单选' + '\t' + '组选3' + '\t'
+ '组选6' + '\t' + '销售额(元)' + '\t' + '返奖比例' + '\n')
# 调用函数获取所有的url
url_list = get_all_urls()
# 遍历列表中的每一个url
for url in url_list:
# 调用函数解析每一个网页,返回二维列表
page_data = parse_per_page(url=url)
# 遍历二维列表中的一维列表元素
for day_data in page_data:
# 写入数据到txt文件
f_obj.write(str(day_data[0]) + '\t' + str(day_data[1]) + '\t' + str(day_data[2]) + '\t' + str(day_data[3])
+ '\t' + str(day_data[4]) + '\t' + str(day_data[5]) + '\t' + str(day_data[6])
+ '\t' + str(day_data[7]) + '\n')
# 打印消息
print('数据写入到结果1_1.txt成功!')
效果截图如下:
2 将数据存储到MySQL数据库中
关于如何使用python操作MySQL数据库,这篇博客给出了详细介绍:点击打开网页
将爬取到的数据存储到数据库中,关键在于数据库中数据表的正确创建以及python程序中SQL语句的正确书写。在数据库中创建数据表,可以使用以下两种方式:设计表、新建查询,效果截图如下:
具体代码如下:
#-*-coding:utf-8-*-
"""
@author:taoshouzheng
@time:2018/7/17 9:07
"""
from bs4 import BeautifulSoup
from urllib import request
import pymysql
"""
使用BeautifulSoup模块和CSS选择器获取中彩网福彩3D的开奖数据
"""
# 定义获取所有页面对应的url的函数
def get_all_urls():
"""
:return: url列表
"""
# 创建url列表
url_list = []
# 第一页的真实请求地址
ori_url = 'http://kaijiang.zhcw.com/zhcw/html/3d/list.html'
# 加入列表
url_list.append(ori_url)
# 生成并遍历列表
for i in list(range(2, 247)):
url = 'http://kaijiang.zhcw.com/zhcw/html/3d/list_' + str(i) + '.html'
# 加入列表
url_list.append(url)
# 打印消息
print('成功获取url!')
# 返回列表
return url_list
# 定义使用BeautifulSoup和CSS选择器解析页面的函数
def parse_per_page(url):
"""
:param url:页面对应的url
:return: 页面中包含的数据列表
"""
# 创建Request对象
req = request.Request(url=url)
# 传入用户代理
req.add_header('User-Agent', 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19')
# 发送请求,读取打开网页
response = request.urlopen(req)
# 读取网页内容,重新编码
html = response.read().decode('utf-8')
# 创建BeautifulSoup对象用于解析网页内容
html_soup = BeautifulSoup(html, 'lxml')
# 创建存放每个页面数据的列表
per_page_data = []
# 遍历tr标签列表
for item in html_soup.select('tr')[2:-1]:
# 创建存放每天数据的列表
per_day_data = []
# 开奖时间
time = item.select('td')[0].text
per_day_data.append(time)
# 期号
issue = item.select('td')[1].text
per_day_data.append(issue)
# 中奖号码
digits = int(str(item.select('td > em')[0].text) + str(item.select('td > em')[1].text) + str(item.select('td > em')[2].text))
per_day_data.append(digits)
# 单选
single_selection = item.select('td')[3].text
per_day_data.append(single_selection)
# 组选3
group_selection_3 = item.select('td')[4].text
per_day_data.append(group_selection_3)
# 组选6
group_selection_6 = item.select('td')[5].text
per_day_data.append(group_selection_6)
# 销售额
sales = item.select('td > strong')[0].text
per_day_data.append(sales)
# 返奖比例
return_rates = item.select('td')[7].text
per_day_data.append(return_rates)
# 将每天的数据加入每页的数据中
per_page_data.append(per_day_data)
# 打印消息
print('解析页面成功!')
# 返回二维列表
return per_page_data
# 主模块
if __name__ == "__main__":
# 打开数据库连接
conn = pymysql.connect('localhost', 'root', 'root', '网络爬虫')
# 使用cursor()方法获取操作游标
cursor = conn.cursor()
# 以遍历二维列表元素的形式将数据写入到数据库表中
with open('结果1_1.txt', 'a', encoding='utf-8') as f_obj:
# 调用函数获取所有的url
url_list = get_all_urls()
# 遍历列表中的每一个url
for url in url_list:
# 调用函数解析每一个网页,返回二维列表
page_data = parse_per_page(url=url)
# 遍历二维列表中的一维列表元素
for day_data in page_data:
# SQL语句
sql = "INSERT INTO 结果2(开奖日期, 期号, 中奖号码, 单选, 组选3, 组选6, 销售额(元), 返奖比例) \
VALUES('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')" \
% (str(day_data[0]), str(day_data[1]), str(day_data[2]), str(day_data[3]), str(day_data[4]), \
str(day_data[5]), str(day_data[6]), str(day_data[7]))
# 执行SQL语句
cursor.execute(sql)
# 异常处理
try:
# 批量提交事务到数据库执行
conn.commit()
except:
# 打印消息
print('发生异常!')
# 如果发生错误则执行回滚操作
conn.rollback()
# 关闭数据库连接
conn.close()
# 打印消息
print('数据写入到数据库中的结果2表成功!')
效果截图如下:
3 将数据存储到excel文件中
将爬取到的数据存储到excel文件中的做法和将数据存储到txt文件中类似,也是通过两层for循环实现,具体代码如下:
#-*-coding:utf-8-*-
"""
@author:taoshouzheng
@time:2018/7/17 9:07
"""
from bs4 import BeautifulSoup
from urllib import request
import xlwt
"""
使用BeautifulSoup模块和CSS选择器获取中彩网福彩3D的开奖数据
"""
# 定义获取所有页面对应的url的函数
def get_all_urls():
"""
:return: url列表
"""
# 创建url列表
url_list = []
# 第一页的真实请求地址
ori_url = 'http://kaijiang.zhcw.com/zhcw/html/3d/list.html'
# 加入列表
url_list.append(ori_url)
# 生成并遍历列表
for i in list(range(2, 247)):
url = 'http://kaijiang.zhcw.com/zhcw/html/3d/list_' + str(i) + '.html'
# 加入列表
url_list.append(url)
# 打印消息
print('成功获取url!')
# 返回列表
return url_list
# 定义使用BeautifulSoup和CSS选择器解析页面的函数
def parse_per_page(url):
"""
:param url:页面对应的url
:return: 页面中包含的数据列表
"""
# 创建Request对象
req = request.Request(url=url)
# 传入用户代理
req.add_header('User-Agent', 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19')
# 发送请求,读取打开网页
response = request.urlopen(req)
# 读取网页内容,重新编码
html = response.read().decode('utf-8')
# 创建BeautifulSoup对象用于解析网页内容
html_soup = BeautifulSoup(html, 'lxml')
# 创建存放每个页面数据的列表
per_page_data = []
# 遍历tr标签列表
for item in html_soup.select('tr')[2:-1]:
# 创建存放每天数据的列表
per_day_data = []
# 开奖时间
time = item.select('td')[0].text
per_day_data.append(time)
# 期号
issue = item.select('td')[1].text
per_day_data.append(issue)
# 中奖号码
digits = int(str(item.select('td > em')[0].text) + str(item.select('td > em')[1].text) + str(item.select('td > em')[2].text))
per_day_data.append(digits)
# 单选
single_selection = item.select('td')[3].text
per_day_data.append(single_selection)
# 组选3
group_selection_3 = item.select('td')[4].text
per_day_data.append(group_selection_3)
# 组选6
group_selection_6 = item.select('td')[5].text
per_day_data.append(group_selection_6)
# 销售额
sales = item.select('td > strong')[0].text
per_day_data.append(sales)
# 返奖比例
return_rates = item.select('td')[7].text
per_day_data.append(return_rates)
# 将每天的数据加入每页的数据中
per_page_data.append(per_day_data)
# 打印消息
print('解析页面成功!')
# 返回二维列表
return per_page_data
# 主模块
if __name__ == "__main__":
# 创建workbook
workbook = xlwt.Workbook(encoding='utf-8')
# 创建工作表
mysheet = workbook.add_sheet('中彩网福彩3D开奖数据', cell_overwrite_ok=True)
# 表头
header = ['开奖日期', '期号', '中奖号码', '单选', '组选3', '组选6', '销售额(元)', '返奖比例']
# 写入表头
for i in range(0, 8):
mysheet.write(0, i, header[i])
# 调用函数获取所有的url
url_list = get_all_urls()
# 设置数据初始写入行的行序
j = 1
# 遍历列表中的每一个url
for url in url_list:
# 调用函数解析每一个网页,返回二维列表
page_data = parse_per_page(url=url)
# 遍历二维列表中的一维列表元素,写入数据到excel文件
for day_data in page_data:
# 写入开奖日期
mysheet.write(j, 0, day_data[0])
# 写入期号
mysheet.write(j, 1, day_data[1])
# 写入中奖号码
mysheet.write(j, 2, day_data[2])
# 写入单选
mysheet.write(j, 3, day_data[3])
# 写入组选3
mysheet.write(j, 4, day_data[4])
# 写入组选6
mysheet.write(j, 5, day_data[5])
# 写入销售额(元)
mysheet.write(j, 6, day_data[6])
# 写入返奖比例
mysheet.write(j, 7, day_data[7])
# 行序递增
j += 1
# 保存工作表
workbook.save('结果3.xls')
# 打印消息
print('数据写入到excel表结果3中成功!')
效果截图如下: