『python爬虫』20. 用协程爬取一本小说(保姆级图文)

news2025/1/20 1:51:57

目录

    • 1. 分析目标网站
      • 1.1 寻找所有章节信息
      • 1.2 寻找章节内容
    • 2. 爬虫思路
      • 获取得到的信息
      • 首先要同步协程获取所有章节标题和cid写入异步任务
      • 然后根据章节标题和cid获取章节内容
    • 3. 完整实现代码
    • 总结


欢迎关注 『python爬虫』 专栏,持续更新中
欢迎关注 『python爬虫』 专栏,持续更新中

1. 分析目标网站

百度小说西游记
http://dushu.baidu.com/pc/detail?gid=4306063500

在这里插入图片描述

1.1 寻找所有章节信息

  • 查看页面源码 明显源码里什么内容没有,肯定是通过ajax请求得到的数据,需要网络抓包了
    在这里插入图片描述

  • 注意此时我们这里找到的只是呈现在网页的前面几章,我们要的是全部章节
    在这里插入图片描述

  • 点击查看全部章节的按钮,此时我们抓包得到了一个新的请求
    在这里插入图片描述

  • 这样我们就得到了所有章节
    在这里插入图片描述

  • 得到了请求url http://dushu.baidu.com/api/pc/getCatalog?data={%22book_id%22:%224306063500%22}
    在这里插入图片描述

  • 访问上面的请求章节地址,得到了所有的章节
    在这里插入图片描述

  • 找到了传入的参数 data: {"book_id":"4306063500"}
    在这里插入图片描述

  • 请求中的url:http://dushu.baidu.com/api/pc/getCatalog?data={%22book_id%22:%224306063500%22}

  • 转化后的url:http://dushu.baidu.com/api/pc/getCatalog?data={book_id:4306063500}

  • 注意 %22是编码所用,把所有的%22删掉,这样我们的请求章节的url就很清晰了

1.2 寻找章节内容

  • 访问第一章节找到了第一章的内容
    在这里插入图片描述
  • 得到了请求url http://dushu.baidu.com/api/pc/getChapterContent?data={%22book_id%22:%224306063500%22,%22cid%22:%224306063500|1569782244%22,%22need_bookinfo%22:1}
    在这里插入图片描述
  • 得到了请求参数 data: {"book_id":"4306063500","cid":"4306063500|1569782244","need_bookinfo":1}
    在这里插入图片描述

2. 爬虫思路

获取得到的信息

请求章节url http://dushu.baidu.com/api/pc/getCatalog?data={data}
请求章节参数 book_id:4306063500 (书籍编号)

请求章节内容url http://dushu.baidu.com/api/pc/getChapterContent?data={data}
请求章节内容参数 data: {"book_id":"4306063500","cid":"4306063500|1569782244","need_bookinfo":1}
data格式化为下面的形式,其实不同章节的区别在于cid

    data = {
        "book_id":b_id,
        "cid":f"{b_id}|{cid}",
        "need_bookinfo":1
    }

首先要同步协程获取所有章节标题和cid写入异步任务

获取章节标题和cid的操作

async def getCatalog(url):
    resp = requests.get(url)
    dic = resp.json()
    tasks = []
    for item in dic['data']['novel']['items']:  # item就是对应每一个章节的名称和cid
        title = item['title']
        cid = item['cid']
        # 准备好后面要用到的异步任务,但是这之前的部分都是同步的操作
        tasks.append(aiodownload(cid, b_id, title))

然后根据章节标题和cid获取章节内容

#2. 异步操作: 访问getChapterContent 下载所有的文章内容
async def aiodownload(cid, b_id, title):
    data = {
        "book_id":b_id,
        "cid":f"{b_id}|{cid}",
        "need_bookinfo":1
    }
    data = json.dumps(data)

    # http://dushu.baidu.com/api/pc/getChapterContent?data={%22book_id%22:%224306063500%22,%22cid%22:%224306063500|1569782244%2
    # http://dushu.baidu.com/api/pc/getChapterContent?data={book_id:4306063500,cid:4306063500|1569782244
    url = f"http://dushu.baidu.com/api/pc/getChapterContent?data={data}"

    async with aiohttp.ClientSession() as session:
        async with session.get(url) as resp:
            dic = await resp.json()

            async with aiofiles.open("novel/"+title, mode="w", encoding="utf-8") as f:#这里我在py文件夹同目录下新建了一个novel文件夹存放小说
                await f.write(dic['data']['novel']['content'])  # 把小说内容写入文件
                print(title+"爬取完成")



3. 完整实现代码

在这里插入图片描述
在这里插入图片描述

# http://dushu.baidu.com/api/pc/getCatalog?data={"book_id":"4306063500"}  => 所有章节的内容(名称, cid)
# 章节内部的内容
# http://dushu.baidu.com/api/pc/getChapterContent?data={"book_id":"4306063500","cid":"4306063500|11348571","need_bookinfo":1}

import requests
import asyncio
import aiohttp
import aiofiles
import json

"""
1. 同步操作: 访问getCatalog 拿到所有章节的cid和名称
2. 异步操作: 访问getChapterContent 下载所有的文章内容
"""
#1. 同步操作: 访问getCatalog 拿到所有章节的cid和名称
async def getCatalog(url):
    resp = requests.get(url)
    dic = resp.json()
    tasks = []
    for item in dic['data']['novel']['items']:  # item就是对应每一个章节的名称和cid
        title = item['title']
        cid = item['cid']
        # 准备好后面要用到的异步任务,但是这之前的部分都是同步的操作
        tasks.append(aiodownload(cid, b_id, title))
    await asyncio.wait(tasks)

#2. 异步操作: 访问getChapterContent 下载所有的文章内容
async def aiodownload(cid, b_id, title):
    data = {
        "book_id":b_id,
        "cid":f"{b_id}|{cid}",
        "need_bookinfo":1
    }
    data = json.dumps(data)

    # http://dushu.baidu.com/api/pc/getChapterContent?data={%22book_id%22:%224306063500%22,%22cid%22:%224306063500|1569782244%2
    # http://dushu.baidu.com/api/pc/getChapterContent?data={book_id:4306063500,cid:4306063500|1569782244
    url = f"http://dushu.baidu.com/api/pc/getChapterContent?data={data}"

    async with aiohttp.ClientSession() as session:
        async with session.get(url) as resp:
            dic = await resp.json()#得到json格式数据

            async with aiofiles.open("novel/"+title, mode="w", encoding="utf-8") as f:#这里我在py文件夹同目录下新建了一个novel文件夹存放小说
                await f.write(dic['data']['novel']['content'])  # 把小说内容写入文件
                print(title+"爬取完成")



if __name__ == '__main__':
    b_id = "4306063500"#图书id
    # - 请求中的url:http://dushu.baidu.com/api/pc/getCatalog?data={%22book_id%22:%224306063500%22}
    # - 转化后的url:http://dushu.baidu.com/api/pc/getCatalog?data={book_id:4306063500}
    # - 注意 %22是编码所用,把所有的%22删掉,这样我们的请求章节的url就很清晰了
    url = 'http://dushu.baidu.com/api/pc/getCatalog?data={"book_id":"' + b_id + '"}'
    asyncio.run(getCatalog(url))

总结

大家喜欢的话,给个👍,点个关注!给大家分享更多计算机专业学生的求学之路!

版权声明:

发现你走远了@mzh原创作品,转载必须标注原文链接

Copyright 2023 mzh

Crated:2023-3-1

欢迎关注 『python爬虫』 专栏,持续更新中
欢迎关注 『python爬虫』 专栏,持续更新中
『未完待续』


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

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

相关文章

linux命令文本命令之~~~ sort ~~ tr ~~cut ~~ uniq ~~split~~~paste~~eval

目录 一. sort命令二. uniq 命令三. tr命令四. cut命令五 . split六. paste 合并文件内容的列七. eval命令 一. sort命令 以行为单位对文件内容进行排序,也将他根据不同的数据类型来排序 比较原则是从首字符向后,依次按ASCII码进行比较,最后…

龟兔赛跑,环形链表解题思路:用兔子的速度,龟的智慧,和链表的结构,解决力扣难题

本篇博客会讲解力扣“141. 环形链表”的解题思路,这是题目链接。 审题 先来审题: 以下是输出示例: 以下是提示: 以下是进阶: 思路 本题有一种非常巧妙的解法:快慢指针法,又称龟兔赛跑法…

SpringBoot——默认页面在哪里?

简单介绍: 在之前我们创建了一个SpringBoot的应用程序,并且我们也启动了,但是我们都是在postman或者是在控制台看到了我们的界面,那么在浏览器中看到的界面其实只有一个: 这个界面其实就是SpringBoot的报错默认界面&a…

buuctf8

目录 crypto 摩丝 password 变异凯撒 Quoted-printable Rabbit web [护网杯 2018]easy_tornado [HCTF 2018]admin misc 被劫持的神秘礼物​编辑 crypto 摩丝 下载文件,得到一串摩斯密码 在线解码 password 下载文件 张三英文zs,加上生日&a…

opencv_contrib模块编译与安装

前言 由于opencv_contrib模块的安装依赖于opencv基础模块,所以看该教程前请先看一遍OpenCV基础模块安装教程 下载 下载 opencv_contrib模块(需要与opencv基础模块版本号4.6.0相同,国内可以在gitcode下载) 配置、编译、安装 打…

网工视角看基础网络,原来这么与众不同

大家好,我是老杨。 前两天去华为生态大会刚回来,颇为感慨。 感慨万物互联的世界越来越大,网络渗透度也越来越极致化。 网络很大,非常大,但在网工眼里,网络复杂又美妙,有着外行人难以理解的魅…

大数据Doris(十九):Doris索引介绍与前缀索引

文章目录 Doris索引介绍与前缀索引 一、Doris索引介绍 二、前缀索引 Doris索引介绍与前缀索引 一、Doris索引介绍 索引用于帮助快速过滤或查找数据。目前 Doris 主要支持两类索引: 内建的智能索引,包括前缀索引和 ZoneMap

【Prompting】ChatGPT Prompt Engineering开发指南(2)

ChatGPT Prompt Engineering开发指南2 从产品概况表生成营销产品描述问题1:文本太长问题2: 文本聚焦于错误的细节问题3:描述需要一个尺寸表 加载Python库查看HTML内容来源 在本教程中,学习迭代分析并完善给出的提示,以从结果概况表…

20230514 Google宣布引入生成式人工智能搜索引擎

🚀 Google宣布引入生成式人工智能搜索引擎,可能是最大变化之一。 Google宣布引入生成式人工智能搜索引擎,可能是最大变化之一。 新搜索将使用人工智能模型整合互联网信息,更好地响应用户需求。然而,网络出版商担心这…

python+vue流浪动物公益科普宠物在线领养网站

使用动物在线领养网站的用户分管理员和用户两个角色的权限子模块。 开发语言:Python 框架:django/flask Python版本:python3.7.7 数据库:mysql 数据库工具:Navicat 开发软件:PyCharm 系统所要实现的功…

接口自动化测试之request模块讲解,以及初步接口自动化测试框架封装(统一请求)

一、有接口测试工具的情况下,为什么要做接口自动化? 1.敏捷开发,接口一般数量很大,团队实现接测试,版本控制。 2.功能太死板,有些接口完全无法实现(复杂的加密接口,签名接口等) 3.接…

【STL十九】算法——修改序列的操作(copy、move、remove、transform、replace)

算法——不修改序列的操作(copy、move、transform、remove、replace) 一、分类二、修改序列的操作三、copy四、move五、remove、remove_if六、fill、transform、replace、replace_if、reverse 一、分类 根据网站https://www.apiref.com/cpp-zh/cpp/head…

Spring的执行流程以及Bean的作用域和生命周期

深入Bean对象 1. Bean对象的作用域1.1 引出作用域问题1.2 六种作用域 2. Spring的执行流程3. Bean对象的生命周期 在之前的学习中,我们了解到Spring能够用来帮助我们管理Java中的Bean对象,我们能够向Spring的IOC容器中添加以及获取对象。那我们从Spring对…

【腾讯云 Finops Crane 集训营】学习云原生成本优化

目录 开篇介绍搭建环境第一步第二步第三步 添加集群成本洞察成本分析资源推荐与副本数智能预测与自动扩缩容EHPA安装Metrics Server创建测试应用创建 EffectiveHPA增加负载整体流程 调度优化负载感知调度拓扑感知调度 混部清理环境 开篇 某次闲逛CSDN,发现了这样一…

(文章复现)基于电力系统碳排放流理论的碳排放分摊模型研究(含matlab代码)

参考文献:基于电力系统碳排放流理论的碳排放分摊模型研究 之前写过一篇博客复现论文《电力系统碳排放流的计算方法初探》,那篇文章模型比较简单,没有考虑网损。(文章复现)电力系统碳排放流的计算方法初探(含matlab代码) 今天要复现的这篇文献…

1行命令本地部署 AgentGPT

本地部署 AgentGPT 部署 AgentGPT访问 AgentGPT 部署 AgentGPT 运行下面命令部署 AgentGPT,输入你的 OpenAI Key, git clone https://github.com/reworkd/AgentGPT.git; cd AgentGPT; ./setup.sh --docker访问 AgentGPT 使用浏览器打开 http://localh…

万得后端一面

目录 1.说说重载和重写2.内连接和外连接3.如果有一个任务来了,线程池怎么运行5.hashset怎么判断重复6.list和set说说7.说说有哪些list8.单例模式的饿汉式和懒汉式,怎么样可以防止反射。9.volatile关键字说说 1.说说重载和重写 1、重载发生在本类&#x…

MySQL创建索引时提示“Specified key was too long; max key length is 767 bytes”

MySQL创建索引时提示“Specified key was too long; max key length is 767 bytes” 问题描述 数据库RDS MySQL版在创建表索引时,出现如下错误信息。 Error 1071: Specified key was too long; max key length is 767 bytes.ERROR 1709 (HY000): Index column siz…

基于ESP32/ESP8266的单通道LoRaWAN网关设计-网页界面介绍

资料下载链接》》 网页界面介绍 对于单通道网关的第六版用户界面,我们专注于 Web 界面。本文档仅涉及 Web 界面。有几个部分要讨论: 用户界面说明web界面可以设置哪些参数单通道接口配置涉及的文件。 Web 界面的各个部分 启动 Web 界面时&#xff0…

【评测】腾讯云服务器的性能怎么样?

转载请注明出处:小锋学长生活大爆炸[ http://xfxuezhang.cn] 最近腾讯云推出了5年款服务器,性价比非常的高。但这么便宜的服务器,性能怎么样呢?学长特地领取了新人试用版测试了一下性能,这里与大家分享一下。 服务器领…