当当图书网数据采集分析:10万条数据的深入洞察

news2024/11/25 19:23:37

基于搜索结果,我将为您提供一个关于当当图书网数据采集的文章框架,假设我们已经有了10万条数据的采集结果。请注意,由于没有具体的数据文件,以下内容将是一个示例性的框架,您可以根据实际采集到的数据进行填充和调整。


当当图书网数据采集分析:10万条数据的深入洞察

引言

在数字化时代,数据成为了理解和预测市场趋势的关键。本文将展示如何通过数据采集技术从当当图书网获取10万条图书数据,并对其进行分析,以揭示图书市场的一些有趣现象和趋势。

数据采集

采集工具与方法

  • 使用Python语言结合requests和lxml库进行网络爬虫开发。
  • 通过XPath表达式精确提取图书信息,包括书名、作者、单价、出版日期、出版社和书籍简介。

数据采集过程

  1. 确定采集目标和关键字。
  2. 发送HTTP请求获取网页内容。
  3. 解析网页,提取所需数据。
  4. 遍历多页以获取更多信息。
  5. 异常处理和数据存储。

数据处理

数据清洗

  • 使用pandas库进行数据清洗,移除不完整或错误的记录。
  • 转换数据类型,确保数据的一致性和准确性。

数据存储

  • 将清洗后的数据存储至Excel文件和数据库中,以便进一步分析。

数据分析

书籍价格分布

  • 分析不同价格区间的图书数量,揭示市场的价格偏好。

出版社影响力

  • 统计各出版社的图书数量,评估市场影响力。

作者贡献度

  • 计算每位作者的图书数量,识别市场上的热门作者。

评论分析

  • 分析图书评论的分布情况,了解读者的反馈和偏好。

数据可视化

价格分布图

  • 柱状图展示不同价格区间的图书数量。

出版社排名图

  • 折线图展示出版社的图书数量排名。

作者出书数量图

  • 条形图展示作者的出书数量。

评论热力图

  • 热力图展示图书评论的分布情况。

结论

通过对10万条当当图书网数据的采集和分析,我们能够深入理解当前图书市场的动态,为出版社、作者和读者提供有价值的市场洞察。


在这里插入图片描述

完整代码

def get_page_tree(url):
    from requests.adapters import HTTPAdapter
    page = requests.session()
    page.mount('http://',HTTPAdapter(max_retries=80))
    page.mount('https://',HTTPAdapter(max_retries=80))
    page = page.request("GET",url=url,timeout=120)
    print('page ' , page ,page.text)

    tree = etree.HTML(page.text)
    return tree


# xpath语法 获取li对象 因为li标签不只一个 所以用lis
def get_lis(tree):
    lis = tree.xpath('//*[@id="search_nature_rg"]/ul/li')
    return lis


def deal_save(url , pressN,page_index):
    global sum
    global row
    tree = get_page_tree(url)
    # 获取到lis对象
    lis = get_lis(tree)
    # time.sleep(random.randint(1,3))
    print("正在爬取...", url)
    # 遍历lis 返回index下标和item
    try:
        for c, i in enumerate(lis):
            # 根据xpath规则提取图书标题
            name = i.xpath('a/@title')
            name = str(name[0])
            name = name.strip()
            # 根据xpath规则提取图书描述
            desc = i.xpath('p[2]/text()')
            # 根据xpath规则提取图书价格和该书电子书的价格
            price_normal = i.xpath('p[3]/span[1]/text()')  # 纸质书的价格

            price_normal = price_normal[0]
            price_net = i.xpath('p[3]/a/i/text()')  # 电子书的价格
            # 根据xpath规则提取图书的作者
            author = i.xpath('p[@class="search_book_author"]/span[1]/a/text()')  # 作者
            if len(author) == 0:
                author = '没有作者'
            else:
                author = author[0]
            # 根据xpath规则提取图书出版时间
            press_time = i.xpath('p[@class="search_book_author"]/span[2]/text()')
            if len(press_time) == 0:
                press_time = '出版时间为空'
            else:
                press_time = press_time[0][2:]
            # 根据xpath规则提取图书出版社
            press = i.xpath('p[@class="search_book_author"]/span[3]/a/text()')
            if len(press) == 0:
                press = '出版社为空'
            else:
                press = press[0]
            if len(desc) != 0:
                desc = desc[0]
            else:
                desc = "null"
            if len(price_net) != 0:
                price_net = price_net[0]
            else:
                price_net = "暂无电子书"
            sum += 1
            # 输出信息
            print('第{}页--第{}条数据--累计爬取{}条:'.format(page_index, c, sum))
            print('书名:《{}》'.format(name))
            print('图书价格:{}'.format(price_normal))
            print('电子书价格:{}'.format(price_net))
            print('作者:{}'.format(author))
            print('出版社:{}'.format(press))
            print('出版时间:{}'.format(press_time))
            print('*' * 25)
            time.sleep(0.1)
            # 保存信息
            sheet.write(row, 0, name)
            sheet.write(row, 1, desc)
            sheet.write(row, 2 , price_normal)
            sheet.write(row, 3 , price_net)
            sheet.write(row, 4 , author)
            sheet.write(row, 5 , press_time)
            sheet.write(row, 6 , press)
            row = row + 1

    except Exception as e:
        print(e)



# 主要爬虫程序  遍历给定出版社 所有的图书
def start (url , pressN):
    # 获取page的etree
    new_url = url.format(press_name, 1)
    tree = get_page_tree(new_url)
    # 获取该出版社展示图书总页数
    total = tree.xpath('//*[@id="12810"]/div[5]/div[2]/div/ul/li[9]/a/text()')[0]
    print('{}一共{}页'.format(pressN,total))
    # 全局变量的sum 总数
    global sum
    # time.sleep(2)
    # 线程保存的数组
    threads = [ ]
    # 遍历所有页面 从1到total
    for page_index in range(1, int(total) + 1):
        time.sleep(0.2)
        temp_url = url.format(pressN,page_index)
        temp_t = Thread(target=deal_save , args = ( temp_url,press_name,page_index, ))
        threads.append(temp_t)
        temp_t.start()
    for index, t in enumerate(threads):
        t.join()


if __name__ == '__main__':
    # 通过file读取所有出版社 保存为list数组
    s = time.time()
    press = []


    with open('Press.txt' , 'r' , encoding='utf-8') as f :
        a = f.read()
        f.close()
    # 拆封数据
    press = a.split('\n')
    url = 'http://search.dangdang.com/?key={}&page_index={}'
    # 遍历所有出版社
    for press_name in press:
        start(url , press_name)
        print('正在采集{}'.format(press_name))

    end = time.time()
    book.save('当当网图书汇总.xlsx')
    print(  '共花费:' ,str((end-s) ) , 's ,共计爬取:{}条'.format(sum))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1600305.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode: 209 长度最小的子数组

209. 长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。 示例 1…

C#创建磁性窗体的方法:创建特殊窗体

目录 一、磁性窗体 二、磁性窗体的实现方法 (1)无标题窗体的移动 (2)Left属性 (3)Top属性 二、设计一个磁性窗体的实例 (1)资源管理器Resources.Designer.cs设计 (2)公共类Frm_Play.cs (3)主窗体 …

【微信小程序之分包】

微信小程序之分包 什么是分包分包的好处分包前的结构图分包后的结构图分包的加载规则分包的体积限制使用分包打包原则引用原则独立分包独立分包的配置方法独立分包的引用原则分包预下载配置分包的预下载分包预下载限制 什么是分包 分包指的是把一个完整小程序项目,…

2016NOIP普及组真题 1. 金币

线上OJ&#xff1a; 一本通&#xff1a;http://ybt.ssoier.cn:8088/problem_show.php?pid1969 核心思想&#xff1a; 解法1、由于数据量只有 10000 天&#xff0c;估可以采用 模拟每一天 的方式。 #include <bits/stdc.h> using namespace std;int k 0;int main() {i…

掀起区块链开发狂潮!Scaffold-eth带你一键打造震撼DApp

文章目录 前言一、Scaffold-eth是什么&#xff1f;二、安装和配置1.准备工作2.安装3.配置开发环境 三、进阶使用1.放入自己的合约2.部署运行 总结 前言 前面的文章传送&#x1f6aa;&#xff1a;hardhat入门 与 hardhat进阶 在之前的文章中&#xff0c;我们已经探讨了使用Har…

《自动机理论、语言和计算导论》阅读笔记:p225-p260

《自动机理论、语言和计算导论》学习第 9 天&#xff0c;p225-p260总结&#xff0c;总计 26 页。 一、技术总结 1.pushdown automation(PDA&#xff0c;下推自动机) 2.DPDA Deterministic PDA(确定性下推自动机)。 二、英语总结 1.instantaneous (1)instant: adj. happi…

普发Pfeiffer TPG252 TPG256A SingleGaugeTPG261-262使用说明手侧

普发Pfeiffer TPG252 TPG256A SingleGaugeTPG261-262使用说明手侧

【产品经理修炼之道】- 厂商银业务之保兑仓

保兑仓 保兑仓是指供应商、购货商、银行签订三方协议&#xff0c;以银行信用为载体&#xff0c;以银行承兑汇票为结算工具&#xff0c;由银行控制货权&#xff0c;供应商受托保管货物并对银行承兑汇票保证金以外部分以货物回购为担保措施&#xff0c;购货商随缴保证金随提货而设…

实验一: 分析ARP解析过程

1.实验环境 主机A和主机B连接到交换机&#xff0c;并与一台路由器互连 2.需求描述 主机A和主机B连接到交换机&#xff0c;并与一台路由器互连主机A和主机B设置为同一网段&#xff0c;网关设置为路由接口地址查看ARP相关信息&#xff0c;熟悉在PC和Cisco设备上的常用命令 3.推…

9K star!利用 AI 大模型,一键生成高清短视频。效果还可以

原文链接: 9K star!利用 AI 大模型,一键生成高清短视频。效果还可以 现在失业三件套就是滴滴,外卖和自媒体,而且视频赛道也越来越卷了。 每一个搞自媒体的同学肯定都希望能有一个自动生成视频,或者剪辑的工具。 今天给大家介绍一个开源项目,就是可以根据一个主题或者…

Nginx内存池相关源码剖析(四)大块内存分配和释放逻辑

与小块内存不同&#xff0c;大块内存通常指的是那些大小较大、分配和释放频率相对较低的内存块。 ngx_palloc_large函数 当Nginx需要分配一块大块内存时&#xff0c;它通常会直接调用操作系统的内存分配函数&#xff08;如malloc、calloc或posix_memalign等&#xff09;。这些…

linux学习:进程(新建+运行某文件+退出处理函数+等待)

目录 api 创建新进程 注意 运行某文件 例子 注意 例子&#xff0c;等待进程 进程是由进程控制块、程序段、数据段三部分组成 进程有都有一个父进程&#xff0c;除了init&#xff0c;父进程可以创建子进程 每个进程都有一个PID&#xff0c;可以用ps来查看&#xff0c;等…

CC工具箱使用指南:【连接道路线(肖四成)】

一、简介 群友定制功能。 应用场景如下&#xff1a;有一组道路线&#xff0c;在交点处是打断的状态。线段有两个关键字段&#xff0c;分别为首尾编号&#xff1a; 这里要实现的是&#xff0c;将首尾编号交错相等的线段两两合并。比如这一组&#xff1a; 目的简单明了。因为是…

Console口和Telnet功能配置实验

一、基础配置 <Huawei>system-view //进入系统视图 Enter system view, return user view with CtrlZ. [Huawei]undo info-center enable //关闭接口提示 Info: Information center is disabled. [Huawei]sysname AR1 //配置设备名为 R1 [AR1]interface GigabitEthern…

高通 Android 12 源码编译aidl接口

最近在封装系统sdk接口 于是每次需要更新aidl接口 &#xff0c;传统方式一般使用make update-api或者修改Android.mk文件&#xff0c;今天我尝试使用Android.bp修改 &#xff0c;Android 10之前在Android.mk文件修改&#xff0c;这里不做赘述。下面开始尝试修改&#xff0c;其实…

SpringBoot编写一个SpringTask定时任务的方法

1&#xff0c;在启动类上添加注解 EnableScheduling//开启定时任务调度 2&#xff0c; 任务&#xff08;方法&#xff09;上也要添加注解&#xff1a; Scheduled(cron " 0 * * * * ? ") //每分钟执行一次 域&#xff1a; 秒 分 时 日 月 周 &#xff08;年&#…

5种方法,教你如何清理接口测试后的测试数据

在接口测试之后&#xff0c;清理测试数据是一个很重要的步骤&#xff0c;以确保下一次测试的准确性和一致性。以下是一些常见的测试数据清理方法&#xff1a; 1. 手动清理&#xff1a; 这是最基本的方法&#xff0c;即手动删除或重置测试数据。您可以通过访问数据库、控制台或…

Hyperledger Fabric

一.Hyperledger Fabric介绍 Hyperledger区块链全家桶 Hyperledger Fabric技术特性 资产 — 资产定义使得几乎任何具有货币价值的东西都可以在网络上交 换&#xff0c;包括从食品到古董汽车再到货币期货。链码 — 链码执行与交易排序的分离&#xff0c;限制了跨节点类型所需的…

HDLbits 刷题 --Mux2to1v

Create a 100-bit wide, 2-to-1 multiplexer. When sel0, choose a. When sel1, choose b. 译&#xff1a; 创建一个100位宽的2对1多路复用器。当sel0时&#xff0c;选择a。当sel1时&#xff0c;选择b。 module top_module( input [99:0] a, b,input sel,output [99:0] out …

DataGrip2024安装包(亲测可用)

目录 一、软件简介 二、软件下载 一、软件简介 DataGrip是由JetBrains公司开发的一款强大的关系数据库集成开发环境&#xff08;IDE&#xff09;&#xff0c;专为数据库开发人员和数据库管理员设计。它提供了一个统一的界面&#xff0c;用于管理和开发各种关系型数据库&#x…