网络爬虫存储数据的三种常见方式及其python实现

3,475 阅读

        在使用工具解析到网页上的数据后,要想办法把数据存储起来,这也是网络爬虫的最后一步。在最近一段时间学习网络爬虫的过程中,一直想写点东西介绍一下网络爬虫数据存储方面的内容,今天以博客的形式对这方面的内容进行总结,介绍网络爬虫中数据存储的三种常用方式及其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
@email:tsz1216@sina.com
"""
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
@email:tsz1216@sina.com
"""
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
@email:tsz1216@sina.com
"""
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
@email:tsz1216@sina.com
"""
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中成功!')

        效果截图如下:

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

DataLearner 官方微信

欢迎关注 DataLearner 官方微信,获得最新 AI 技术推送

DataLearner 官方微信二维码