【异步爬虫】圆我四大名著《西游记》之梦

2023-11-06 21:10

本文主要是介绍【异步爬虫】圆我四大名著《西游记》之梦,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

名著《西游记》爬虫实战

  • 前言
  • 1. 获取所有章节cid
  • 2. 获取单个章节内容
  • 3. 完整代码

前言

一直都想找个机会好好读读四大名著,今天我下载了 《西游记》 全部章节,一起开始阅读吧!

1. 获取所有章节cid

名著所在网址:https://dushu.baidu.com/pc/detail?gid=4306063500

在这里插入图片描述

  • 当我们检查网页源代码时,未发现章节信息,所以该数据可能是服务器二次发送的。

在这里插入图片描述

  • F12,打开开发者工具,Network刷新进行Fetch/XHR数据抓包。

在这里插入图片描述

  • 找到章节信息后,copy URL,可以看到请求小说的章节数据与book_id有关

在这里插入图片描述

# 获取所有章节的cid
async def getCatalog(url):resp = requests.get(url)dict = resp.json()# 创建任务列表tasks = []for item in dict['data']['novel']['items']:  # item就是对应每一个章节的名称和cidtitle = item['title']cid = item['cid']print(title, cid)tasks.append(aiodownload(book_id, cid, title))await asyncio.wait(tasks)

在这里用到异步协程,提高效率,方法前用async修饰,await,线程阻塞,释放CPU资源。

2. 获取单个章节内容

  • 进入某一章节,进行分析,同样 F12Network,数据抓包,进行缜密分析,终于找到文本内容。

在这里插入图片描述

  • 进入Headers,copyURL,获取requests.get().json()的数据。

在这里插入图片描述

# 准备异步任务
async def aiodownload(book_id, cid, title):data = {"book_id": book_id,"cid": f"{book_id}|{cid}","need_bookinfo": 1}# data需要为json()data = json.dumps(data)url = f"https://dushu.baidu.com/api/pc/getChapterContent?data={data}"# 获取协程请求对象async with aiohttp.ClientSession() as session:  # requestsasync with session.get(url) as resp:dic = await resp.json()  # 阻塞# 获取异步io文件流async with aiofiles.open('./novels/'+title+'.txt', mode='w', encoding='utf-8') as f:await f.write(dic['data']['novel']['content'])  # 把小说内容写出print(title, '下载完成!')

3. 完整代码

# 小说url
# url = 'https://dushu.baidu.com/api"/pc/getCatalog?data:{"book_id":"4306063500"}' =>所有章节名称链接
# 章节内部内容url
# url = https://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 下载所有的文章内容
"""# 准备异步任务
async def aiodownload(book_id, cid, title):data = {"book_id": book_id,"cid": f"{book_id}|{cid}","need_bookinfo": 1}# data需要为json()data = json.dumps(data)url = f"https://dushu.baidu.com/api/pc/getChapterContent?data={data}"# 获取协程请求对象async with aiohttp.ClientSession() as session:  # requestsasync with session.get(url) as resp:dic = await resp.json()  # 阻塞# 获取异步io文件流async with aiofiles.open('./novels/'+title+'.txt', mode='w', encoding='utf-8') as f:await f.write(dic['data']['novel']['content'])  # 把小说内容写出print(title, '下载完成!')# 获取所有章节的cid
async def getCatalog(url):resp = requests.get(url)dict = resp.json()# 创建任务列表tasks = []for item in dict['data']['novel']['items']:  # item就是对应每一个章节的名称和cidtitle = item['title']cid = item['cid']print(title, cid)tasks.append(aiodownload(book_id, cid, title))await asyncio.wait(tasks)if __name__ == '__main__':# book_idbook_id = "4306063500"  # 西游记url = 'https://dushu.baidu.com/api/pc/getCatalog?data={"book_id":"' + book_id + '"}'# 启动协程asyncio.run(getCatalog(url))

在这里插入图片描述

在这里插入图片描述
加油!

感谢!

努力!

这篇关于【异步爬虫】圆我四大名著《西游记》之梦的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/359078

相关文章

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Java 中实现异步的多种方式

《Java中实现异步的多种方式》文章介绍了Java中实现异步处理的几种常见方式,每种方式都有其特点和适用场景,通过选择合适的异步处理方式,可以提高程序的性能和可维护性,感兴趣的朋友一起看看吧... 目录1. 线程池(ExecutorService)2. CompletableFuture3. ForkJoi

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

Spring Boot 中正确地在异步线程中使用 HttpServletRequest的方法

《SpringBoot中正确地在异步线程中使用HttpServletRequest的方法》文章讨论了在SpringBoot中如何在异步线程中正确使用HttpServletRequest的问题,... 目录前言一、问题的来源:为什么异步线程中无法访问 HttpServletRequest?1. 请求上下文与线

在 Spring Boot 中使用异步线程时的 HttpServletRequest 复用问题记录

《在SpringBoot中使用异步线程时的HttpServletRequest复用问题记录》文章讨论了在SpringBoot中使用异步线程时,由于HttpServletRequest复用导致... 目录一、问题描述:异步线程操作导致请求复用时 Cookie 解析失败1. 场景背景2. 问题根源二、问题详细分

Java中将异步调用转为同步的五种实现方法

《Java中将异步调用转为同步的五种实现方法》本文介绍了将异步调用转为同步阻塞模式的五种方法:wait/notify、ReentrantLock+Condition、Future、CountDownL... 目录异步与同步的核心区别方法一:使用wait/notify + synchronized代码示例关键

Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)

《Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)》本文介绍了如何使用Python和Selenium结合ddddocr库实现图片验证码的识别和点击功能,感兴趣的朋友一起看... 目录1.获取图片2.目标识别3.背景坐标识别3.1 ddddocr3.2 打码平台4.坐标点击5.图

springboot的调度服务与异步服务使用详解

《springboot的调度服务与异步服务使用详解》本文主要介绍了Java的ScheduledExecutorService接口和SpringBoot中如何使用调度线程池,包括核心参数、创建方式、自定... 目录1.调度服务1.1.JDK之ScheduledExecutorService1.2.spring

异步线程traceId如何实现传递

《异步线程traceId如何实现传递》文章介绍了如何在异步请求中传递traceId,通过重写ThreadPoolTaskExecutor的方法和实现TaskDecorator接口来增强线程池,确保异步... 目录前言重写ThreadPoolTaskExecutor中方法线程池增强总结前言在日常问题排查中,

微服务架构之使用RabbitMQ进行异步处理方式

《微服务架构之使用RabbitMQ进行异步处理方式》本文介绍了RabbitMQ的基本概念、异步调用处理逻辑、RabbitMQ的基本使用方法以及在SpringBoot项目中使用RabbitMQ解决高并发... 目录一.什么是RabbitMQ?二.异步调用处理逻辑:三.RabbitMQ的基本使用1.安装2.架构