首页 > 其他分享 >etree和协程爬明朝那些事、

etree和协程爬明朝那些事、

时间:2023-11-18 14:46:11浏览次数:26  
标签:xpath etree name url juan chaptor 明朝 path 协程

1、etree和协程爬明朝那些事

import requests
from lxml import etree
import asyncio
import aiohttp
import aiofiles
import os
# 1. 拿到主页面的源代码 (不需要异步)
# 2. 拿到页面源代码之后. 需要解析出 <卷名>, <章节, href>
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36"
}
def get_chaptor_info(url):
resp = requests.get(url, headers=headers)
resp.encoding = "UTF-8"
page_source = resp.text
# 开始解析
tree = etree.HTML(page_source)
# 作业, 请解释出每个循环在这里的作用?
result = []
divs = tree.xpath("//div[@class='mulu']") # 每一个div就是一卷
for div in divs:
trs = div.xpath(".//table/tr") # 一堆tr
juan_name = trs[0].xpath(".//a/text()")
juan_name = "".join(juan_name).strip().replace(":", "_")
for tr in trs[1:]: # 93
tds = tr.xpath("./td")
for td in tds:
txt = td.xpath(".//text()")
href = td.xpath(".//@href")
txt = "".join(txt).replace(" ", "").strip()
href = "".join(href)
dic = {
"chapter_name": txt,
"chapter_url": href,
"juan_name": juan_name
}
result.append(dic)
return result
async def download_one(url, file_path):
print("我要下載文章了")
async with aiohttp.ClientSession() as session:
async with session.get(url, headers=headers) as resp:
page_source = await resp.text(encoding="utf-8")
# 拿到文章
tree = etree.HTML(page_source)
content = tree.xpath("//div[@class='content']//p//text()")
content = "".join(content).replace("\n", "").replace("\r", "").replace(" ", "").strip()
# 寫入文件
async with aiofiles.open(file_path, mode="w", encoding="utf-8") as f:
await f.write(content)
print("恭喜你。 下載了一篇文章!", file_path)
async def download_chapter(chaptor_list):
tasks = []
for chaptor in chaptor_list: # {juan: xxx, name:xxx, href: xxx}
juan = chaptor['juan_name'] # 文件夹名
name = chaptor['chapter_name'] # 文件名 前言.txt
url = chaptor['chapter_url'] # 用来下载 -> 异步任务
if not os.path.exists(juan): # 判斷文件夾是否存在
os.makedirs(juan) # 如果不存在就創建
# 給出文件的真正的保存路徑
file_path = f"{juan}/{name}.txt" # 74
f = download_one(url, file_path)
t = asyncio.create_task(f)
tasks.append(t)
break # 测试的时候
await asyncio.wait(tasks)
def main():
url = "https://www.mingchaonaxieshier.com/"
chaptor_list = get_chaptor_info(url)
# print(chaptor_list)
# 开始上协程. 进行异步下载
asyncio.run(download_chapter(chaptor_list))
if __name__ == '__main__':
main()
2、

标签:xpath,etree,name,url,juan,chaptor,明朝,path,协程
From: https://www.cnblogs.com/zhang-da/p/17840463.html

相关文章

  • kotlin协程:一文搞懂各种概念
    前言使用kotlin协程已经几年了,可以说它极大地简化了多线程问题的复杂度,非常值得学习和掌握。此文介绍并梳理协程的相关概念:suspend、non-blocking、Scope、Job、CoroutineContext、Dispatchers和结构化并发。进入协程世界简而言之,协程是可以在其内部进行挂起操作的实例,是否支持......
  • Python3 协程 await async 相关的用法和笔记
    想要提供可以进行协程切换的awaitable,可以使用下面的方法:1任务taskasyncdeffunc():print("yesWait")task=asyncio.create_task(func())awaittask2协程对象,可以使asyncdef定义的协程函数(是否能触发切换不一定,要看函数内容)函数内可以利用asyncio.sl......
  • 明朝那些事儿
    从初中接触春秋战国历史就喜欢上了历史。到现在为止,最喜欢的就是明朝那些事儿,因为作者的讲述方式不同于其他作者,视角独特,见解犀利,描述也很风趣,第一次刷还是很多年前。有一次去面试的时候,面试官也是明朝那些事儿的书迷,还问了我对几个人物的看法。过了几年,对于这本书,脑子里就剩......
  • Unity-协程
    Unity-协程协程的简单实现​ 一般的程序执行都是线性的,也就是必须一行一行的执行代码。​ 使用Unity提供的协程,就可以类似于开辟另一条线程,调整根据你所写的代码,调整下一行代码执行的时间。项目示例​ 下面的例子是一个U3DDemo中的代码,实现最简单的Enemy追击Player的......
  • 明朝皇帝年号
    太祖朱元璋年号洪武,太子朱标早逝,太孙朱允炆继位。被四叔朱棣上位。朱棣年号永乐,其儿子和孙子都继位。太孙儿子朱祁镇和朱祁钰。朱祁镇儿子孙子都继位,孙子朱祐樘年号弘治,躬身节俭有弘治中兴之称。其子朱厚照,年号正德。正德皇帝堂兄弟朱厚熜继位,朱厚熜年号嘉靖。其儿子孙子继位,孙......
  • 基于Golang协程实现流量统计系统项目开发
    基于Golang协程实现流量统计系统项目开发上一节课我们已经架设好了一个网站。,但是因为我们的网站没有流量。也生成不了大量的日志,靠我们自己点击生成那点日志也不够测试的。所以这次我们就用GO语言批量生成我们想要的日志。好了。我们开始写代码我用的IDE工具是GOLAND,没有为......
  • GO实现分布式爬虫—掌握go语言通道与协程项目架构设计
    GO实现分布式爬虫—掌握go语言通道与协程项目架构设计Go高并发微服务分布式 1.命令行的用户管理 用户信息存储        =>内存        =>结构[]map        =>用户IDnameageteladdr            [len][]map......
  • 一文快速实战Kotlin协程与Flow
    前言不知道大家有没有跟我一样的感受:即使自己用心在网上学过协程和Flow了,但过了一段时间就又忘掉了。这大部分的原因其实是因为我们缺少实战。我平时工作里根本就接触不到协程和Flow,自己又不敢硬往上写,万一出问题了咋整?所以一直就处于理论学习阶段,导致我学了就跟没学一样。今天就带......
  • Kotlin协程学习——协程的基本介绍
    我们为什么需要学习Kotlin协程呢?我们已经有了成熟的JVM库,比如RxJava或Reactor。此外,Java本身就支持多线程,很多人也选择使用普通的回调函数。很明显,我们已经有了很多选项来执行异步操作。Kotlin协程提供了更多的功能。它们是一个概念的实现,该概念最早在1963年被描述,但等待了多年才......
  • 精通协程的必会十一个高级技巧
    在Android应用开发中,协程已经成为异步编程的首选工具之一。它使并发任务管理变得更加容易,但它的强大功能远不止于此。在本文中,我们将探讨协程的高级技巧,帮助您更好地处理复杂的并发需求,提高性能和可维护性。介绍协程是Kotlin的一项强大特性,它使并发编程更加直观、简单。它允许我们......