首页 > 其他分享 >14、爬虫-异步协程爬取西游记小说-aiohttp-aiofiles

14、爬虫-异步协程爬取西游记小说-aiohttp-aiofiles

时间:2024-07-01 22:30:36浏览次数:16  
标签:协程 14 22 cid json book aiohttp data id

 

注意:有关所有的IO操作都要加上:await 挂起 

"""
https://dushu.baidu.com/pc/detail?gid=4306063500   #小说网站
https://dushu.baidu.com/api/pc/getCatalog?data={%22book_id%22:%224306063500%22}   #可以拿到每个章节的bookid、cid(每个章节的id)、这里%22相当于 " 号

https://dushu.baidu.com/api/pc/getChapterContent?data={%22book_id%22:%224306063500%22,%22cid%22:%224306063500|1569782244%22,%22need_bookinfo%22:1}   #此链接可以获取章节内容 可替换链接中的"cid":"%22"4306063500|1569782244" 来获取每个章节的内容

"""

import requests
import asyncio
import aiohttp
import aiofiles
import json



#获取小说的标题和各个章节的cid
async def get_Catalog(url):
    response = requests.get(url)
    #将获取的文本转为json格式
    dict_text = response.json()
    #print(text_json)

    tasks = []  #用于保存每个连接
    #循环取小说的标题和cid
    items = dict_text['data']['novel']['items']
    for item in items:
        title = item['title']
        cid = item['cid']

        tasks.append(aiodownload(cid, book_id, title))
        #print(title, cid)
    #创建异步协程任务
    await asyncio.wait(tasks)

async def aiodownload(cid, book_id, title):
    #https://dushu.baidu.com/api/pc/getChapterContent?data={%22book_id%22:%224306063500%22,%22cid%22:%224306063500|1569782244%22,%22need_bookinfo%22:1}  #章节连接
    #{"book_id%22:%224306063500","cid":"4306063500|1569782244","need_bookinfo":1}
    data = {
        "book_id": book_id,
        "cid": f"{book_id}|{cid}",
        "need_bookinfo": 1
    }
    #将json转为字符串格式
    data = json.dumps(data)
    #得到每个章节的连接
    url = f"https://dushu.baidu.com/api/pc/getChapterContent?data={data}"

    #请求获取章节的内容
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            dict_text = await response.json()   #将获取的文本转为json、注意这里在请求连接的时候要用到async 的await挂起功能
            #使用aiofiles模块处理async请求到的文本内容并写入文本中
            async with aiofiles.open(f"E:\\learn\\python\\爬虫学习库\\协程\\西游记\\{title}", "w", encoding="utf-8") as file:
                await file.write(dict_text['data']['novel']['content']) #从json中获取章节内容



if __name__ == '__main__':
    book_id = "4306063500"
    url = 'https://dushu.baidu.com/api/pc/getCatalog?data={"book_id":"4306063500"}'
    #或者 : url = 'https://dushu.baidu.com/api/pc/getCatalog?data={"book_id":"'+{book_id}+'"}'  #将book_id作为变量拼接 +号是拼接
    #get_Catalog(url)

    loop = asyncio.get_event_loop()
    loop.run_until_complete(get_Catalog(url))
    #asyncio.run(get_Catalog(url))

标签:协程,14,22,cid,json,book,aiohttp,data,id
From: https://www.cnblogs.com/littlecc/p/17978465

相关文章

  • HTML5+CSS3集训(14)
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>p180</title></head><body><divclass="container"><divclass="top"......
  • C++ //练习 14.17 你在7.5.1节的练习7.40(第261页)中曾经选择并编写了一个类,你认为它应
    C++Primer(第5版)练习14.17练习14.17你在7.5.1节的练习7.40(第261页)中曾经选择并编写了一个类,你认为它应该含有相等运算符吗?如果是,请实现它;如果不是,解释原因。环境:LinuxUbuntu(云服务器)工具:vim 代码块classDate{ public: Date(); Date(size_ty,size_tm,siz......
  • 141个图表,完美展示数据分类别关系!
    本文介绍使用Python工具seaborn详细实现分类关系图表,包含8类图141个代码模版。分类关系图表用于展示数字变量和一个或多个分类变量之间的关系,可以进一步分为:箱形图(boxplot)、增强箱形图(enhancedboxplot)、小提琴图(violinplot)、抖动散点图(jitterplot)、蜂群图(beeswarmplot)、......
  • CF1148F Foo Fighters
    牛逼贪心题假设都是将总和正的变成负的,所以如果总和是负的,val取相反数对于二进制操作,我们一位一位考虑,想让其二进制下1的个数最好变成奇数,只能选一个数保留哪些1,所以我们保留一个1就能乘上-1,改变了奇偶性。贪心满足无后效性,最优子结构,局部最优解为全局最优解,我们尝试将一个数二......
  • 代码随想录算法训练营第50天 | 1143.最长公共子序列 、1035.不相交的线 、53. 最大子
    这几题都挺类似,都是求最长公共子序列,有些题目稍微变了下1143.最长公共子序列体会一下本题和718.最长重复子数组的区别视频讲解:https://www.bilibili.com/video/BV1ye4y1L7CQhttps://programmercarl.com/1143.最长公共子序列.html/***@param{string}text1*@param{......
  • C++Primer Plus 第十四章代码重用:模板类和友元14.4.9 ----002
    C++PrimerPlus第十四章代码重用:模板类和友元14.4.9提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:模板类和友元14.4.9提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录C++PrimerPlus第十四章代码重用:模板类和友元14.4......
  • loj#2880. JOISC 2014 稻草人
    搞了很久,题解区有线段树爆改pushup高妙做法说下cdq分治先将点都按横坐标从小到大排序,cdq分治,那我们现在只需要考虑分治过程中\([l,mid]\)和\([mid+1,r]\)互相形成的合法点对,显然左边的横坐标都小于右边的横坐标。能够发现,如果右边有一个点插在一对本来合法的点之间,那么那对合法......
  • JAVA高级进阶14设计模板
    第十四天、设计模板什么是设计模板(Designpattern)?一个问题通常有n种解法,其中肯定有一种解法是最优的,这个最优的解法被人总结出来了,称之为设计模式设计模式有20多种,对应20多种软件开发中会遇到的问题单例设计模式单例设计模式作用:确保一个类只有一个对象场景:计算......
  • [题解]CF1714F Build a Tree and That Is It
    思路由于题目中说这是一棵无根树,不太方便思考,于是,我们可以假装把这棵树看做有根树。首先我们令\(d_1,d_2,d_3\)分别表示从根节点到节点\(1,2,3\)的长度(不算相交部分)。那么我们可以得到下式:\[\left\{\begin{matrix}d_{12}=d_1+d_2\\d_{13}=d_1+d_3\\......
  • [题解]CF1473D Program
    思路因为此题目中对于数的更新只能为\(1\),所以,如果我们找到了\([1,l-1]\)与\([r+1,n]\)中能获得的两个极值即可。我们为\(S\)赋予权值,用一个数组\(a\)储存:如果\(S_i\)为+,则其权值为\(1\)。否则其权值为\(-1\)。那么,在第\(i\)次操作后,能产生的数是\(\s......