Python实现isbn查询书籍详细信息

2023-05-16

如有错误,请疯狂打脸没关系,希望能够指出来。

0. 开始的开始

一直想做一个图书漂流软件,最近入手(入坑)了微信小程序,添加图书时需要用到isbn查询书籍信息的API(不用也可以,但用户会非常麻烦,强迫症晚期的我又跳入了isbn查询API的坑),但发现别人的API都很贵,豆瓣也收回了API的使用权,估计是要收费了。
所以,与其在坑里苦苦挣扎,不如。。。。再挖一个更大的坑,自己做一个。。。

1. 开始

首先打算用python写个爬虫(能力与知识有限,现在只能想到这个办法,如前辈们有更好的办法,请砸过来)。
搜索了几个可以用isbn查书籍信息的网站,最后还是选择了豆瓣。
豆瓣isbn查书籍信息的流程为:

  1. 打开豆瓣读书的首页
    在这里插入图片描述
  2. 在搜索框输入isbn码
    在这里插入图片描述
  3. 回车或点击小放大镜,书籍的信息出来了
    在这里插入图片描述

本来想的很好,就这样一路闪电带火花把核心代码写了,然而,总有不尽人意的地方。就在第3步,本来打算在这里把信息给爬了,却发现爬回来是空的,也不知道什么原因(查html代码,发现有一级标签id为root,可能豆瓣设置了权限,猜的,具体原因不知道)。

2. 爬取内容

虽然人生不尽人意,但还是要走下去。在第3步的页面,点击书名或图片会出来更详细的信息。
在这里插入图片描述
果然,这里的信息可以爬取,要什么有什么。

2.1 获取书籍信息页面的链接地址

思路:
打开豆瓣读书首页,模拟浏览器填写isbn码,进行搜索,跳转到搜索结果页面,读取a标签href链接,即书籍信息页面的链接地址。
代码如下:

def isbn_search(isbn):
    """
        输入:isbn
        输出:豆瓣搜索结果的书籍链接
    """
    # 创建浏览器对象
    browser = webdriver.PhantomJS()
    # 请求网址
    browser.get("https://book.douban.com/subject_search?search_text=" + isbn + "&cat=1001")
    # 解析网页信息
    soup = BeautifulSoup(browser.page_source, "lxml")
    # 读取标签内容
    tags = soup.select("#root > div > div > div > div > div > div > a")
    # 正则查找href链接
    link_list = re.findall(r"(?<=href=\").+?(?=\")|(?<=href=\').+?(?=\')", str(tags[0]))
    # 关闭浏览器
    browser.close()
    return link_list[0]

2.2 爬取书籍详细信息

思路:
打开2.1获取的页面,找到书籍信息块代码,爬回并清洗,得到需要的信息。
代码如下:

def book_info(douban_link):
    """
        输入:豆瓣书籍链接
        输出:书籍信息
    """
    # 请求网址
    g=requests.get(douban_link)
    # 解析网页信息
    soup=BeautifulSoup(g.content,"lxml")
    # 由于书名和其他信息不在一起,单独处理书名
    title = "书名: 《" + re.sub('[\f\n\r\t\v]','',re.sub('<([^>]+?)>','',str((soup.select("#wrapper > h1 > span"))[0]))) + "》"
    # 存储书籍信息
    infos = [title]
    # 返回特定区域的html代码块
    span_list = soup.findChild('div',{'id':'info'})

    for item in str(span_list).split('<br/>'): # 将信息按项目分割,每个item是一个信息项
        # 用两次正则,一次去掉多余html代码,一次去掉制表换行等字符
        # .split(":")以:分割每个信息项目
        info_item = re.sub('[\f\n\r\t\v]','',re.sub('<([^>]+?)>','',item)).split(":")
        info_temp = [] # 存放以“/”分隔的item
        for info_item_item in info_item:
            sprit = info_item_item.partition("/") # 以“/”分隔info_item_item
            for sprit_item in sprit:
                info_temp += sprit_item.partition("]") # 以“/”分隔sprit_item, 并将处理后的列表合并

        # info_temp 存储单项信息的列表
        # 以单项信息为操作单位去除空格
        # temp_list 存储去空格处理后的单项信息
        temp_list = []
        for temp in info_temp:
            ddd=temp.strip() # 去掉字符左右的空格
            # 过滤掉因去掉空格而产生的空字符串
            if ddd != '':
                temp_list.append(ddd)
            else:
                continue
            # 在书籍属性后加“:”
            info = temp_list[0] + ': '
            for i in range(1, len(temp_list)):
                info += temp_list[i] # 拼接每个信息项目

        # 判断temp_list是否为空,为空则info为错误值,不存入infos
        if temp_list:
            pass
        else:
            continue 

        infos.append(info)

    return infos

3. 效果

在这里插入图片描述
在这里插入图片描述
这里使用PhantomJS浏览器,但会报UserWarning,Selenium最新版不支持PhantomJS了,我用的Selenium 3.141.0,UserWarning建议使用谷歌或火狐浏览器的无头模式,但我没成功,如有大佬成功了希望交流一下。

4. 完整代码下载

  • isbn查询书籍详细信息 (2019/10/13)
  • 上一个版本由于某种原因,已不能使用,请下载 v2.0 版本。
    isbn查询书籍详细信息2.0(2020/3/30)
  • 时隔3年又更新了:
    isbn查询书籍详细信息2.5(2023/5/3)
      1. 解决了因浏览器驱动路径不对无法运行的问题
      1. 添加了豆瓣评分及评价人数,如下图:
    • 在这里插入图片描述

由于csdn下载积分随下载次数不断增加,如积分不够,可私聊我,如果有积分还是希望赞助一下。

仅供学习,勿作商用,如有违反,我也不管 >-<
不知道豆瓣有一天会不会把这个方法给ban掉。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python实现isbn查询书籍详细信息 的相关文章

随机推荐

  • STM32中关于串口中断的调试(不断进入发送中断的原因)

    说来惭愧 xff0c 前日在调试stm32f10系列的单片机的时候 xff0c 想做一个关于串口发送的状态机 xff0c 每隔100毫秒发送一次命令 没有用DMA xff0c 就是想单纯的使用发送中断来数据 xff0c 结果在调试的时候一直
  • Psoc Creator 入门——空工程的建立

    最近在做psoc 4000芯片的开发 xff0c 现在简单的说说怎么利用psoc creator进行开发 首先 xff0c 安装psoc creator xff0c 我使用的版本是4 0 安装过程省略 xff0c 赛普拉斯官网有下载链接 x
  • mbedtls使用openssl生成的自签名证书进行TLS实验

    目录 1 使用openssl生成自签名证书2 VS2013编译mbedtls3 mbdtls默认对证书的要求4 mbdtls测试例子详解5 运行测试程序 1 使用openssl生成自签名证书 openssl是一个安全套接字层密码库 xff0
  • IIC的通信波形分析

    关于IIC xff0c 不解释它的历史了 xff0c 有兴趣自己去百度看看 xff0c 本文的图片是由周立功的LAB6021逻辑分析仪抓取的 xff0c 通信的波形是抓取的cypress的psoc 4000芯片得到的 最近项目需要用到触摸I
  • linux下的CSV文件操作

    先介绍一下什么是csv文件 xff0c 这是一种简单的文本文件 xff0c 也被称为逗号分隔值文件 主要是用于存储简单的数据 xff0c 下面在weindows下用UE简单生成一下文件 然后用excel打开 这就是一个简单的csv文件 xf
  • GNU makefile入门——刚开坑,没有干货

    一个完整的makefile文件包含5个部分的内容 xff1a 显示规则 xff0c 隐含规则 xff0c 变量和指示符 xff0c 注释 显示规则 xff1a 包括目标 xff1a 依赖规则 命令 隐含规则 xff1a make根据目标文件
  • Renesas CS+ for ca cx入门(一)

    这是一篇关于Renesas的CS 43 for ca xff08 以下简称CA xff09 的入门简介 xff0c 在网上关于这个IDE的使用方法比较少人讲述 xff0c 兴许使用的人比较少吧 另一个类似的IDE是CS 43 for cc
  • 单片机——按键扫描

    按键扫描 xff0c 我想应该是比较简单的单片机应用了 xff0c 但是有时候看起来简单的东西反而不好写 本文拿大部分人觉得简单的按键扫描聊聊我工作至今对于软件结构的理解 嗯 xff0c 对的 xff0c 是结构 xff0c 不是架构 xf
  • keil的错误: Error: Encountered an improper argument 的解决方法

    将附件中的文件下载然后放到keil一下的安装目录中即可C Keil v5 UV4 xff0c 选择替换即可 文件链接 xff1a http download csdn net download ma57457 10118005 官方说的是支
  • 嵌入式软件没有层次感的原因

    因为软件是一个人写的 xff01 xff01 xff01
  • 博客网站转移

    我的博客会慢慢的转移到新的网站上 xff0c 新的地址为oopsrtos com xff0c 新博客会对arm 体系结果做更深入的探讨 xff0c 主要是关于实时操作系统内核开发的研究 最近在研究FPU xff0c 从内核层解释在操作系统中
  • keil工程中找不到头文件的可能原因

    今天用keil写一个串口调试程序 xff0c 编译工程时 xff0c 总是找不到type h头文件 xff0c 而该文件又是必须的 于是 xff0c 重新看设置 xff0c 头文件路径已经包含到工程里了 xff0c 头文件也已经添加到工程里
  • 在NAND FLASH上建立YAFFS2文件系统

    在NAND FLASH上建立YAFFS2文件系统 xff08 一 xff09 By on 2006 07 22 经过了半个多月的努力 xff0c 终于搞定nandflash的mtd驱动和上层的yaffs2文件系统 这半个多月来几乎每天都要和
  • 个人学习笔记-矩阵的四则运算

    目录 1 矩阵的四则运算1 1 矩阵的乘法运算1 2矩阵的加法运算1 3矩阵的减法运算 2 接口测试输出结果 1 矩阵的四则运算 1 1 矩阵的乘法运算 span class token comment 矩阵乘法 C语言实现分解步骤 xff
  • 单片机通信接口:UART、I2C、SPI、TTL、RS232、RS422、RS485、CAN、USB

    参考资料 xff1a 这些单片机接口 xff0c 一定要熟悉 xff1a UART I2C SPI TTL RS232 RS422 RS485 CAN USB SD卡 秒懂所有USB接口类型 xff0c USB接口大全 1 UART UAR
  • PCB中走线与电流的关系

    参考资料 xff1a 超强整理 xff01 PCB设计之电流与线宽有八种关系 1 前言 PCB的载流能力取决与以下因素 xff1a 线宽 线厚 xff08 铜箔厚度 xff09 容许温升 PCB走线越宽 xff0c 载流能力越大 但走线宽度
  • Visual Studio各版本集成的Visual C++版本对应关系

    Visual Studio版本集成的Visual C 43 43 版本对应关系如下 xff1a Visual Studio 6 xff1a vc6 Visual Studio 2003 xff1a vc7 Visual Studio 200
  • 字节序—字节内部的位序

    Big endian machine It thinks the first byte it reads is the biggest Little endian machine It thinks the first byte it re
  • 嵌入式常用模块之——环形队列(1)

    简单聊聊对我实现方式的介绍代码部分完整代码 简单聊聊 在嵌入式开发时候 xff0c 有很对模块是经常会使用到的 从这篇文字开始 xff0c 将我觉得一些常用的模块逐一做一个整理 梳理一下自己的思路 xff0c 也顺便方便大家 xff0c 如
  • Python实现isbn查询书籍详细信息

    如有错误 xff0c 请疯狂打脸没关系 xff0c 希望能够指出来 0 开始的开始 一直想做一个图书漂流软件 xff0c 最近入手 xff08 入坑 xff09 了微信小程序 xff0c 添加图书时需要用到isbn查询书籍信息的API xf