|
发表于 2022-4-1 21:00:29
|
显示全部楼层
本楼为最佳答案
本帖最后由 isdkz 于 2022-4-2 10:07 编辑
异步全屏是 traceback 很正常,因为其中一个协程出错不会导致主程序终止,
你的程序哪个地方写错了,每一个协程都出错就全屏 traceback 了
我给你改了一下,你看看:
- import requests
- import asyncio
- import aiohttp
- from lxml import etree
- import aiofiles
- """
- 1.同步操作:首先获取番茄小说指定小说的页面url,此处用的是西游记
- 2.利用xpath将url中章节的名称以及超链接取出
- 3.异步操作:将超链接拼接成新的url,进而获取对应章节的内容
- 4.将内容进行保存
- """
- async def aiodownload(href,name):
- url = 'https://fanqienovel.com'+f'{href}' # 这里把 f'href' 改为 f'{href}',格式化字符串你完全可以直接用 f'https://fanqienovel.com{href}'
- async with aiohttp.ClientSession() as session:
- async with session.get(url) as resp:
- html = etree.HTML(await resp.text()) # 这里改为 await resp.text()
- async with aiohttp.ClientSession() as session:
- async with session.get(url) as resp:
- content = html.xpath('//*[@class="muye-reader-content noselect"]/div/p/text()')
- if not content: # 加上这个逻辑判断,因为有一些需要在 app 才能看的章节的路径不一样(会匹配不上),而且内容不全,你可以直接跳过,或者用正确的路径得到一部分内容
- content = html.xpath('//*[@class="muye-reader-content noselect"]/p/text()')
- async with aiofiles.open(f'{name}.txt','w',encoding='utf-8') as f: # 这里 f'{name}' 改为 f'{name}.txt'
- await f.write('\n\n'.join(content)) # 这里 content 改为 '\n\n'.join(content),因为匹配到的 content 是列表,你得用换行把它拼成字符串
- async def get_name(url):
- headers = {'User-Agent':'Mozilla/5.0'} # UA 可以不用写那么长,写个关键的 Mozilla/5.0 就行了
- resp = requests.get(url,headers=headers)
- html = etree.HTML(resp.text)
- chapter = html.xpath('//*[@class="page-directory-content"]/div/div[2]')[0]
- divs = chapter.xpath('./div')
- tasks = []
- for div in divs:
- name = div.xpath('./a/text()')[0]
- href = div.xpath('./a/@href')[0]
- #准备异步任务
- tasks.append(aiodownload(href,name))
- await asyncio.wait(tasks)
- if __name__ == '__main__':
- url = 'https://fanqienovel.com/page/7042250335695408159'
- loop = asyncio.get_event_loop() # 创建一个 loop 来运行协程,否则主线程会提前结束,协程执行完成后没有主线程会报 RuntimeError: Event loop is closed 的错误
- loop.run_until_complete(get_name(url)) # 使用 loop 的 run_until_complete
复制代码 |
|