鱼C论坛

 找回密码
 立即注册
查看: 6848|回复: 17

[已解决]python爬虫,求助

[复制链接]
发表于 2022-4-1 19:19:51 | 显示全部楼层

回帖奖励 +2 鱼币

把代码粘贴上来别人才好帮你调试,光看报错信息是很难找出问题的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-1 21:00:29 | 显示全部楼层    本楼为最佳答案   
本帖最后由 isdkz 于 2022-4-2 10:07 编辑
莫凡辰 发表于 2022-4-1 20:35
好的,这就粘上来


异步全屏是 traceback 很正常,因为其中一个协程出错不会导致主程序终止,

你的程序哪个地方写错了,每一个协程都出错就全屏 traceback 了

我给你改了一下,你看看:

  1. import requests
  2. import asyncio
  3. import aiohttp
  4. from lxml import etree
  5. import aiofiles
  6. """
  7. 1.同步操作:首先获取番茄小说指定小说的页面url,此处用的是西游记
  8. 2.利用xpath将url中章节的名称以及超链接取出
  9. 3.异步操作:将超链接拼接成新的url,进而获取对应章节的内容
  10. 4.将内容进行保存
  11. """
  12. async def aiodownload(href,name):
  13.     url = 'https://fanqienovel.com'+f'{href}'                  # 这里把 f'href' 改为 f'{href}',格式化字符串你完全可以直接用  f'https://fanqienovel.com{href}'
  14.     async with aiohttp.ClientSession() as session:
  15.         async with session.get(url) as resp:
  16.             html = etree.HTML(await resp.text())            # 这里改为 await resp.text()
  17.             async with aiohttp.ClientSession() as session:
  18.                 async with session.get(url) as resp:
  19.                     content = html.xpath('//*[@class="muye-reader-content noselect"]/div/p/text()')
  20.                     if not content:       # 加上这个逻辑判断,因为有一些需要在 app 才能看的章节的路径不一样(会匹配不上),而且内容不全,你可以直接跳过,或者用正确的路径得到一部分内容
  21.                         content = html.xpath('//*[@class="muye-reader-content noselect"]/p/text()')
  22.                     async with aiofiles.open(f'{name}.txt','w',encoding='utf-8') as f:             # 这里 f'{name}' 改为 f'{name}.txt'
  23.                         await f.write('\n\n'.join(content))          # 这里 content 改为 '\n\n'.join(content),因为匹配到的 content 是列表,你得用换行把它拼成字符串



  24. async def get_name(url):
  25.     headers = {'User-Agent':'Mozilla/5.0'}                   # UA 可以不用写那么长,写个关键的 Mozilla/5.0 就行了
  26.     resp = requests.get(url,headers=headers)
  27.     html = etree.HTML(resp.text)
  28.     chapter = html.xpath('//*[@class="page-directory-content"]/div/div[2]')[0]
  29.     divs = chapter.xpath('./div')
  30.     tasks = []
  31.     for div in divs:
  32.         name = div.xpath('./a/text()')[0]
  33.         href = div.xpath('./a/@href')[0]
  34.         #准备异步任务
  35.         tasks.append(aiodownload(href,name))
  36.     await asyncio.wait(tasks)

  37. if __name__ == '__main__':
  38.     url = 'https://fanqienovel.com/page/7042250335695408159'
  39.     loop = asyncio.get_event_loop()              # 创建一个 loop 来运行协程,否则主线程会提前结束,协程执行完成后没有主线程会报 RuntimeError: Event loop is closed 的错误
  40.     loop.run_until_complete(get_name(url))    # 使用 loop 的 run_until_complete
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-9-22 16:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表