基于爬虫和Kettle的书籍信息采集与预处理

这篇具有很好参考价值的文章主要介绍了基于爬虫和Kettle的书籍信息采集与预处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一:爬虫

1、爬取的目标

将读书网上的书籍的基本信息,比如:封面、书名、作者、出版社、价格、出版时间、内容简介、作者简介、书籍目录、ISBN和标签爬取出来,并将爬取的结果放入数据库中,方便存储。

2、网站结构

   

基于爬虫和Kettle的书籍信息采集与预处理,python,爬虫,python

图1读书网书籍类别详情

此次实验爬取读书网页面中文学、小说、传记、青春文学、艺术、散文随笔、励志、人文社科、经济管理、励志十大类书籍。

每一类书籍包括书名、价格、作者、出版社、ISDN、出版时间、封面以及书籍简介、作者简介、书目录和书籍所属类别。页面具体情况如图2所示。

基于爬虫和Kettle的书籍信息采集与预处理,python,爬虫,python

图2读书网书籍属性设计详情

3、爬虫技术方案

1)、所用技术:

         网站解析的使用的是Xpath、数据库存储使用的是pymysql。

2)、爬取步骤:

    (1)、分析目标网站:了解页面结构;

(2)、获取页面内容:使用python中的requests库来获取页面内容;

(3)、定位页面:使用Xpath定位我们所需要的数据的位置;

(4)、连接数据库:创建数据连接,放入自己数据库的端口、用户和密码等数据,使得连接上自己的数据库,将爬取好的数据返给数据库中,方便存储;

(5)、关闭连接:关闭数据库连接。

4、爬取过程:

   

1)、常量定义

    基于爬虫和Kettle的书籍信息采集与预处理,python,爬虫,python

此处定义了网页后缀END=‘.html’用于进行网页拼接。

Start_Page = 1 定义爬取起始页码,end_Page = 10 定义爬取结束页码。

Base_url 用于设置爬取网页的基础网站,进行后续网页拼接。

Book_type={},该字典设置爬取书籍类别。

Header={},该字典进行请求头设置。

2)、设置游标,连接数据库,再使用for循环,确保书籍能够循环爬取,最后将爬取完毕的数据放入数据库中,最后关闭数据库的连接。

基于爬虫和Kettle的书籍信息采集与预处理,python,爬虫,python

  

   3)、一级链接爬取,接收参数基本网页地址、书籍类型、网页页数后,再使用requests库中r.get(url=url,headers=header)发送请求,使用response接收请求数据。

   基于爬虫和Kettle的书籍信息采集与预处理,python,爬虫,python

4)、二级链接爬取,在数据获取步骤,进行更细致的xpath语句书写。

使用try-except语句提高程序健壮性,返回一个书籍信息字典。

      基于爬虫和Kettle的书籍信息采集与预处理,python,爬虫,python

      5)、保存数据,创建游标,编写sql语言,之后执行sql语言,执行成功就插入所给的表,如果执行失败则输出插入失败。

      基于爬虫和Kettle的书籍信息采集与预处理,python,爬虫,python

5、爬虫结果

基于爬虫和Kettle的书籍信息采集与预处理,python,爬虫,python

基于爬虫和Kettle的书籍信息采集与预处理,python,爬虫,python

二:预处理

  1. 删除列

1)、新建转换,之后使用表输入,将MySQL文件中的表输入kettle。需要连接数据库的类型是MySQL,主机名称是localhost、用户是root、密码是root、端口号是3306。

    基于爬虫和Kettle的书籍信息采集与预处理,python,爬虫,python

之后进行字段获取。

基于爬虫和Kettle的书籍信息采集与预处理,python,爬虫,python

2)、选择转换中的字段选择进行列删除,将dictroy这个列进行删除。

基于爬虫和Kettle的书籍信息采集与预处理,python,爬虫,python

2、选择转换中的增加常量,增加remainder这一列,查询书籍卖出剩余的情况。

    基于爬虫和Kettle的书籍信息采集与预处理,python,爬虫,python

  1. 、最后选择文本文件输出,将处理好的数据输出,输出的格式是csv文件,分割符用逗号隔开,编码用UTF-8J进行转码,防止输出文件中有乱码。文本文件命名为姓名_处理完成_csv。

4、预处理完全处理全流程

基于爬虫和Kettle的书籍信息采集与预处理,python,爬虫,python

三、爬虫源代码

import re
import requests
from lxml import etree
import pymysql
import datetime
"""
爬取一个网站
1.获得数据不小于一千条
2.每条数据属性不小于10
"""

END = '.html'
start_Page = 1
end_Page = 10
base_url = 'https://www.dushu.com'
# 以字典形式保存每一类对应的网页数字
book_type = {"文学": 1077, "小说": 1078, "传记": 1081, "青春文学": 1079,
     "艺术": 1082, "散文随笔": 1163, "鉴赏": 1222, "人文社科": 1003,
     "经济管理": 1004, "励志": 1094
}

header = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
}

def get_one_bookInfo_link(base_url, _type, page):
    # url 控制爬取的书籍类型、网页页数
    url = base_url+'/book/'+str(_type)+'_'+str(page)+END
    # print(url)
    response = requests.get(url=url, headers=header)
    if response.status_code == 200:
        htmlTEXT = response.content.decode(response.apparent_encoding)
        html = etree.HTML(htmlTEXT)
        bookLinke_List = html.xpath('//div[@class="container margin-top"]//div[@class="bookslist"]/ul/li/div[@class="book-info"]/h3/a/@href')
        return bookLinke_List
    else:
        print("请求失败")


def get_oneBook_info(bookLinke):
    url = base_url + bookLinke
    content = requests.get(url=url, headers=header)
    if content.status_code == 200:
        info = etree.HTML(content.content.decode(content.apparent_encoding))
        # 获取书籍详细信息,十个
        try:
            img = info.xpath('//div[@class="bookdetails-left"]/div[@class="book-pic"]//img/@src')[0]  # 封面
            title = info.xpath('//div[@class="bookdetails-left"]/div[@class="book-pic"]//img/@alt')[0]  # 书名
            author = info.xpath('//div[@id="ctl00_c1_bookleft"]/table//tr[1]//td[2]/text()')[0]  # 作者
            publish = info.xpath('//div[@id="ctl00_c1_bookleft"]/table//tr[2]//td[2]/text()')[0]  # 出版社
            temp_price = info.xpath('//div[@id="ctl00_c1_bookleft"]/p/span/text()')[0]  # 价格
            price = temp_price.split('¥')[1]
            time = info.xpath('//div[@class="bookdetails-left"]/div[@class="book-details"]/table//tr[1]/td[@class="rt"][2]/text()')[0]  # 出版时间
            cont = info.xpath('//div[@class="container margin-top"]//div[contains(@class, "book-summary")][1]/div/div/text()')[0]   # 内容简介
            blurb = info.xpath('//div[@class="container margin-top"]//div[contains(@class, "book-summary")][2]/div/div/text()')[0]  # 作者简介
            directory = info.xpath('//div[@class="container margin-top"]//div[contains(@class, "book-summary")][3]/div/div/text()')[0]  # 书籍目录
            isbn = info.xpath('//div[@class="bookdetails-left"]/div[@class="book-details"]/table//tr[1]/td[@class="rt"][1]/text()')[0]   # ISBN
            label = info.xpath('//div[@id="ctl00_c1_bookleft"]/table//tr[4]//td[2]/text()')[0]  # 标签
            # 使用字典保存一本书籍的信息
            book_info = {
                "img": img,
                "title": title,
                "author": author,
                "publish": publish,
                "price": price,
                "time": time,
                "cont": cont,
                "blurb": blurb,
                "directory": directory,
                "isbn": isbn,
                "label": label
            }
            return book_info
        except Exception as e:
            print("爬取时单本书籍获取出现错误:", e, "\n发生错误地址为:"+url)
            err_info = {
                "img": 'https://a.dushu.com/img/n200.png',
                "title": 'titleEro',
                "author": 'authorEro',
                "publish": 'publishEro',
                "price": '00.00',
                "time": '2001-01-01',
                "cont": 'contEro',
                "blurb": 'blurbEro',
                "directory": 'directoryEro',
                "isbn": 'isbnEro',
                "label": 'labelEro'
            }
            return err_info
    else:
        print("请求失败")


def set_BookInfo_ToMySql(book_info, db):
    # print(book_info.values())
    cursor = db.cursor()
    # sql语句
    sql = "INSERT INTO book(img,title,author,publish,price,time,cont,blurb,directory,isbn,label) VALUES " \
          "('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')"\
          %(book_info["img"], book_info["title"], book_info["author"], book_info["publish"],
            book_info["price"], book_info["time"], book_info["cont"], book_info["blurb"],
            book_info["directory"], book_info["isbn"], book_info["label"])
    print(book_info.values())
    try:
        # 执行sql语句
        if cursor.execute(sql):
            print('插入数据成功')
            # 提交到数据库执行
            db.commit()  # 持久化
    except Exception as e:
        # 如果发生错误则回滚
        print("插入失败", e)
        db.rollback()


def main():
    #  用于存储计算数据爬取数量
    count = 0
    # 连接数据库
    db = pymysql.connect(host='localhost', user='root', password='root', port=3306, db='pachong')
    # 开启爬取程序
    for type in book_type:  # 控制爬取书籍的类别
        for i in range(start_Page, end_Page+1):    # 控制每一类爬取的页数
            # 每一个网页的书籍的二级连接
            bookLinke_List = get_one_bookInfo_link(base_url=base_url, _type=book_type[type], page=i)
            if bookLinke_List:
                for link in bookLinke_List:
                    print(link)
                    info = get_oneBook_info(link)
                    info['label'] = type
                    # print(info)
                    set_BookInfo_ToMySql(book_info=info, db=db)
                    count += 1
            else:
                print("爬取内容为空")
    # 数据插入完成后关闭数据库
    if db:
        db.close()
        print("关闭数据库成功,程序结束")
    else:
        print("数据加载成功,数据库未关闭")
    return count


if __name__ == '__main__':
    print("Run...")
    # 获取开始时间
    start_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    # db = pymysql.connect(host='localhost', user='root', password='root', port=3306, db='movie')
    # info = get_oneBook_info('/book/13981332/')
    # set_BookInfo_ToMySql(info, db=db)
    # db.close()
    print("已爬取书籍数量:", main())
    # 获取结束时间
    end_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    print("程序结束{}\n运行开始时间:{}".format(end_time, start_time))

 文章来源地址https://www.toymoban.com/news/detail-811688.html

到了这里,关于基于爬虫和Kettle的书籍信息采集与预处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据采集与预处理】流数据采集工具Flume

    目录 一、Flume简介 (一)Flume定义 (二)Flume作用 二、Flume组成架构 三、Flume安装配置 (一)下载Flume (二)解压安装包 (三)配置环境变量 (四)查看Flume版本信息 四、Flume的运行 (一)Telnet准备工作 (二)使用Avro数据源测试Flume (三)使用netcat数据源测试Flume 五、F

    2024年01月21日
    浏览(99)
  • 1.0数据采集与预处理概述

    大数据的来源: 1.搜索引擎数据 2.电商交易数据 3.社交网络数据 4.物联网传感器数据 5.网站日志数据 数据采集的概念: 数据采集的ETL 工具负责将分布的、异构数据源中的不同种类,和结构的数据如文本数据、关系数据以及图片、视频等非结构化数据等抽取到临时中间层后进

    2024年02月02日
    浏览(42)
  • 【数据采集与预处理】数据接入工具Kafka

    目录 一、Kafka简介 (一)消息队列 (二)什么是Kafka 二、Kafka架构 三、Kafka工作流程分析 (一)Kafka核心组成 (二)写入流程 (三)Zookeeper 存储结构 (四)Kafka 消费过程 四、Kafka准备工作 (一)Kafka安装配置 (二)启动Kafka (三)测试Kafka是否正常工作 五、编写Spark Str

    2024年01月19日
    浏览(67)
  • 【数据采集与预处理】数据传输工具Sqoop

    目录 一、Sqoop简介 二、Sqoop原理 三、Sqoop安装配置 (一)下载Sqoop安装包并解压 (二)修改配置文件 (三)拷贝JDBC驱动 (四)验证Sqoop (五)测试Sqoop是否能够成功连接数据库 四、导入数据 (一)RDBMS到HDFS (二)RDBMS到HBase (三)RDBMS到Hive 五、导出数据 HDFS/Hive到RDBMS 六、

    2024年01月21日
    浏览(53)
  • 7.4 电子信息系统预处理中所用放大电路

    在电子信息系统中,通过传感器或其它途径所采集的信号往往很小,不能直接进行运算、滤波等处理,必须进行放大。 集成仪表放大器,也称为精密放大器,用于弱信号放大。 1、仪表放大器的特点 在测量系统中,通常被测物理量均通过传感器转换为电信号,然后进行放大。

    2024年02月03日
    浏览(29)
  • YOLOv5训练自己的数据集(含数据采集、数据标注、数据预处理、借助colab训练)

    YOLOv5 github:GitHub - ultralytics/yolov5: YOLOv5 🚀 in PyTorch ONNX CoreML TFLite 先从github下载源码到本地,用pycharm打开工程   本次采集数据采用的方式是录取视频,然后用python截取视频帧当做图片,这是处理代码:   可以使用labelimg工具、make sense(Make Sense)在线标注,注意数据集需要与

    2024年02月05日
    浏览(88)
  • yolov2检测网数据集获取与预处理_采集健康和非健康猫狗数据

    阿里云天池数据集-cat-dog 因为开源数据库中没有非健康猫狗相关的,所以需要自己下载非健康猫狗数据,并制作数据集。 下面是用于爬取非健康猫狗数据的爬虫代码: 使用图片去重/相似图片清理利器 软件清除重复的图片数据。 使用ffmpeg将救助视频文件按照一秒截取一张

    2024年02月14日
    浏览(76)
  • 利用Matlab实现Abaqus有限元分析预处理器——从inp文件导入模型信息到自编Matlab有限元程序前处理

    大家好,我非常荣幸有这个机会和大家分享我在有限元分析方面的一些经验。我希望我的这篇文章能够帮助你在有限元分析领域获得更多的知识,提升你的技能。这篇文章主要介绍了如何使用Matlab实现一个有限元分析的预处理器,这个预处理器能够从Abaqus的 *.inp 文件中导入模

    2024年02月10日
    浏览(48)
  • 如何基于香橙派AIpro对视频/图像数据进行预处理

    本文分享自华为云社区《如何基于香橙派AIpro对视频/图像数据进行预处理》,作者: 昇腾CANN。 受网络结构和训练方式等因素的影响,绝大多数神经网络模型对输入数据都有格式上的限制。在计算机视觉领域,这个限制大多体现在图像的尺寸、色域、归一化参数等。如果源图

    2024年04月22日
    浏览(49)
  • 深度学习中基于python的预处理和图像扩增方法

    容易出现的报错: 错误原因通常为保存的路径不正确: 应改为: 即第一个参数应该写到文件的名称,而不能只写到文件夹就停止。 灰度图片和黑白图片有些相似,但并不完全相同。 灰度图片是指每个像素点的颜色由灰度值来表示,通常使用8位无符号整数(0-255)表示。灰

    2024年02月08日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包