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

标签:#excel##Python##TXT##数据库# 时间:2019/03/27 21:14:29 作者:夏天的风

        在使用工具解析到网页上的数据后,要想办法把数据存储起来,这也是网络爬虫的最后一步。在最近一段时间学习网络爬虫的过程中,一直想写点东西介绍一下网络爬虫数据存储方面的内容,今天以博客的形式对这方面的内容进行总结,介绍网络爬虫中数据存储的三种常用方式及其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官方微信,接受最新的AI技术推送