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

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

        效果截图如下:


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

        欢迎交流! QQ:3408649893

©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页