python爬取小说(二)书籍基本信息爬取

2023-11-01

爬完数据目录和内容后,我们来爬取书籍的基本信息。
在上篇博客的基础上,爬取书籍信息并存入字典
这里写图片描述

# -*- coding: utf-8 -*-
import urllib.request
import bs4
import re
import sqlite3

def getHtml(url):
    user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"
    headers = {"User-Agent":user_agent}
    request = urllib.request.Request(url,headers=headers)
    response = urllib.request.urlopen(request)
    html = response.read()
    return html


# 爬取整个网页
def parse(url):
    html_doc = getHtml(url)
    sp = bs4.BeautifulSoup(html_doc, 'html.parser', from_encoding="utf-8")
    return sp

# 爬取书籍基本信息
def get_book_baseinfo(url):
    # class = "info"信息获取
    info = parse(url).find('div',class_ = 'info')
    book_info = {}
    if info:
        book_info['title'] = ''
        book_info['img'] = ''
        # 标题
        book_info['title'] = info.find('h2').string
        
        # 图片链接
        img = info.find('div',class_ = 'cover')
        for im in img.children:
            # 图片地址想要访问,显然需要拼接
            book_info['img'] = 'http://www.biqukan.com' + im.attrs['src']

        # 基本信息存储
        ifo = info.find('div',class_ = 'small')
        bkinfo = []
        for b in ifo:
            for v in b.children:
                t = v.string
                if t:
                    bkinfo.append(''.join(t))

        # 将:后面的信息连起来
        spv = []
        cv = ''
        for v in bkinfo:
            if v.find(':') >= 0:
                if cv:
                    spv.append(cv)
                cv = v
            else:
                cv += v
        spv.append(cv)

        # 基本信息转成字典
        for element in spv:
            its = [v.strip() for v in element.split(':')]
            if len(its) != 2:
                continue
            nm = its[0].lower()  # 统一成小写
            if type(nm).__name__ == 'unicode':
                nm = nm.encode('utf-8')
            vu = its[1]
            book_info[nm] = vu
            
        # 发现这里获取到的字典键与后面将要获取的键重复了,所以这里改一下
        book_info['auther'] = book_info.pop('作者')

        #简介获取(与基本信息的获取方式一致)
        intro = info.find('div',class_ = 'intro')
        bkurl = []
        for b in intro:
            t = b.string
            if t:
                bkurl.append(''.join(t))

        bkjj = []
        cvx = ''
        for w in bkurl:
            if w.find(':') >= 0:
                if cvx:
                    bkjj.append(cvx)
                cvx = w
            else:
                cvx += w
        bkjj.append(cvx)

        for ele in bkjj:
            itis = [n.strip() for n in ele.split(':')]
            if len(itis) != 2:
                continue
            summ = itis[0].lower()  # 统一成小写
            if type(summ).__name__ == 'unicode':
                summ = summ.encode('utf-8')
            vux = itis[1]
            book_info[summ] = vux

    # 使用笨办法将字典的key转成英文状态,这样方便数据库存储
    book_info['type'] = book_info.pop('分类')
    book_info['status'] = book_info.pop('状态')
    book_info['num'] = book_info.pop('字数')
    book_info['updatatime'] = book_info.pop('更新时间')
    book_info['newchapter'] = book_info.pop('最新章节')
    book_info['authsummery'] = book_info.pop('作者')
    book_info['summery'] = book_info.pop('简介')
    book_info['notipurl'] = book_info.pop('无弹窗推荐地址')

    return book_info



# 获取书籍目录
def get_book_dir(url):
    books_dir = []
    name = parse(url).find('div', class_='listmain')
    if name:
        dd_items = name.find('dl')
        dt_num = 0
        for n in dd_items.children:
            ename = str(n.name).strip()
            if ename == 'dt':
                dt_num += 1
            if ename != 'dd':
                continue
            Catalog_info = {}
            if dt_num == 2:
                durls = n.find_all('a')[0]
                Catalog_info['name'] = (durls.get_text())
                Catalog_info['url'] = 'http://www.biqukan.com' + durls.get('href')
                books_dir.append(Catalog_info)
    return books_dir


# 获取章节内容
def get_charpter_text(curl):
    # 直接根据curl地址取章节内容就行了获取一篇文章??!!!
    #  这是一个地址,你不要打开网页获取网页内容?这不是已经
    text = parse(curl).find('div', class_='showtxt')
    if text:
        cont = text.get_text()
        cont = [str(cont).strip().replace('\r \xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0', '').replace('\u3000\u3000', '')]
        c = " ".join(cont)
        ctext = re.findall(r'^.*?html', c)
        return ctext
    else:
        return ''


# 获取书籍
def get_book(burl):
    # 目录
    book = get_book_dir(burl)
    if not book:
        return book

    # 内容
    for d in book:
        curl = d['url']
        try:
            print('正在获取章节【{}】【内容】【{}】'.format(d['name'],d['url']))
            ctext = get_charpter_text(curl)
            d['text'] = ctext
            print(d['text'])
            print()
        except Exception as err:
            d['text'] = 'get failed'

    return book


if __name__ == '__main__':
	# 这里调用get_book_baseinfo函数看看效果
    book = get_book_baseinfo('http://www.biqukan.com/1_1094/')
    print(book)

结果展示:

{'title': '一念永恒', 'img': 'http://www.biqukan.com/files/article/image/1/1094/1094s.jpg', 'auther': '耳根', 'type': '玄幻小说', 'status': '连载', 'num': '3689058', 'updatatime': '2018-02-09 18:20:00', 'newchapter': '第1314章 你的选择(终)', 'authsummery': '耳根所写的《一念永恒》无弹窗免费全文阅读为转载作品,章节由网友发布。', 'summery': '一念成沧海,一念化桑田。一念斩千魔,一念诛万仙。唯我念……永恒', 'notipurl': 'http://www.biqukan.com/1_1094/?_t_t_t=0.4355400702253367'}

后面我们将这些信息存储到数据库。
创作不易,喜欢的话给喵喵赏点吧~(可怜眼神)
在这里插入图片描述

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

python爬取小说(二)书籍基本信息爬取 的相关文章

随机推荐

  • 筛选kepler.csv中未下载到的kepid

    In 1 判断输入字符串是否在路径中函数 import os def findfile2 keyword keyword 9d int keyword judgeExist False root os path join C Users 9
  • snapgene设计引物_分子克隆之引物设计(一)

    分子克隆之引物设计 一 目的 将目的基因Homosapiens interleukin 37利用引物扩增表达带上限制酶酶切位点 再与载体pcDNA3 1 3xFlag C酶切连接 师兄给定的酶切位点是 固定 BamH I GGATCC Xh
  • bilibili直播间接收监听和发送弹幕api

    参考文 https blog csdn net fei347795790 article details 111164254 Python实现自动发送B站直播弹幕软件 https blog csdn net fzq13994952987 a
  • 双目相机计算稠密深度点云详解教程

    点击上方 计算机视觉工坊 选择 星标 干货第一时间送达 作者 本文为3D视觉开发者社区特约作者 熊猫飞天授权发布 引言 本教程主要内容为介绍如何使用双目相机计算出稠密的3D点云 主要涉及到elas包的使用 通过KITTI数据集和ZED相机进
  • node生成唯一设备id(node-machine-id)

    npm安装 npm install node machine id yarn安装 yarn add node machine id 有 异步 同步 两种生成方式 import machineId machineIdSync from nod
  • MYSQL

    regexp extract regexp extract str regexp idx str是被解析的字符串或字段名 regexp 是正则表达式 idx是返回结果 取表达式的哪一部分 默认值为1 0表示把整个正则表达式对应的结果全部返回
  • Synchronized锁对象详解

    synchronized 是我们的同步的一种选择 加锁就要有对应的钥匙 这个钥匙分为 当前类对象 当前class对象 第三方对象 synchronized 可以修饰 变量 方法 我们以方法举例可以有如下的几种情况 修饰静态方法 这里默认的锁
  • Netty和Tomcat区别

    Netty与Tomcat区别 它们的区别不少 最大的区别就在于通信协议 这是众所周知的 Tomcat是一个服务器 它一定是基于Http协议的 它的实质是一个基于http协议的web容器 Netty则不同 Netty可以通过编程自定义各种协议
  • docker学习:dockerfile介绍

    这里主要是介绍dockerfile dockerfile就是用来构建docker镜像的脚本 脚本就意味着会有相关的dockerfile命令 也是我们要学习的一部分 构建步骤 1 编写一个Dockerfile文件 2 docker build
  • win10网络诊断为DNS服务器未响应,Windows10网络诊断DNS服务器未响应的解决办法

    Windows10网络诊断DNS服务器未响应怎么办 不少win10系统用户在遇到网络无法连接的时候 诊断网络会提示Windows10网络诊断DNS服务器未响应 那么这个问题要如何解决呢 下面小编为大家带来详细的解决办法 Windows10网
  • 机器学习的概率统计模型(附代码)(一)

    目录 概率论 1 1 离散随机变量分布 1 伯努利分布 2 二项分布 3 泊松分布 1 2 连续随机变量分布 1 均匀分布 2 指数分布 3 正态分布 总结 系列文章目录 概率论 概率论 是研究随机现象数量规律的数学分支 随机现象是相对于决
  • openai Python库

    OpenAI 是一个人工智能研究机构 他们开发了一个 Python 库 用于帮助开发者使用人工智能技术 这个库包含了许多用于自然语言处理 机器学习 深度学习和其他人工智能应用的工具和算法 您可以在 OpenAI 的 GitHub 页面上找到
  • Mysql连接问题

    连接MySQL长时间不连接后报错 com mysql cj core exceptions ConnectionIsClosedException No operations allowed after connection closed
  • eNSP华为模拟器使用——(11)eNSP模拟无线AC和AP

    eNSP模拟无线AC和AP 1 拓扑 2 需求 实现AC和AP二层关联 3 配置 dhcp enable interface Vlanif 1 ip address 192 168 10 1 255 255 255 0 dhcp selec
  • MySql 字符串数据类型

    字符串类型 CHAR CHAR类型是定长的 会根据定义的长度分配空间 当存储CHAR值时 mysql会删除所有的末尾空格 CHAR很适合存储很短的字符串 或者所有的值都接近同一个长度 例如 CHAR非常适合存储密码的MD5的值 因为这是一个
  • Java毕设 SSM中药店商城系统(含源码+论文)

    文章目录 1 项目简介 2 实现效果 2 1 界面展示 3 设计方案 3 1 概述 3 2 系统流程 3 3 系统结构设计 4 项目获取 1 项目简介 Hi 各位同学好呀 这里是M学姐 今天向大家分享一个今年 2022 最新完成的毕业设计项
  • id 重启event_系统已在未先正常关机的情况下重新启动 事件ID:41

    创建日期 2018 07 18 系统已在未先正常关机的情况下重新启动 事件ID 41 日志名称 System 来源 Microsoft Windows Kernel Power 日期 2018 7 17 23 55 06 事件 ID 41
  • do...while(0)的妙用

    在C 中 有三种类型的循环语句 for while 和do while 但是在一般应用中作循环时 我们可能用for和while要多一些 do while相对不受重视 但是 最近在读我们项目的代码时 却发现了do while的一些十分聪明的用
  • Km Kcat Kcat/Km

    max 是指 最大反应速度 当 底物浓度 足够大时 体系中 酶的活性中心达到饱和状态 其反应速度达到最大 由此可见 最大反应速度 max 随 酶浓度的变化而变化 kcat 指反应常数 catalytic constant kcat 可以由
  • python爬取小说(二)书籍基本信息爬取

    爬完数据目录和内容后 我们来爬取书籍的基本信息 在上篇博客的基础上 爬取书籍信息并存入字典 coding utf 8 import urllib request import bs4 import re import sqlite3 def