Python生成站点地图时遇RuntimeError:事件循环已运行
解决RuntimeError: This event loop is already running问题
问题根源
- 代码逻辑漏洞:你通过
df.iterrows()循环读取Excel中的URL,但每次循环都会覆盖Url变量,最终仅保留最后一行的URL,无法批量处理所有链接。 - 事件循环冲突:从报错路径的
ipykernel可判断你在Jupyter环境运行代码,Jupyter本身已启动一个asyncio事件循环,而pysitemap.crawler内部会尝试启动新的事件循环,两者冲突导致报错。
修复步骤
1. 安装依赖(按需)
若用nest_asyncio解决循环冲突,先执行安装命令:
pip install nest_asyncio
2. 修正后的完整代码
import sys import logging from pysitemap import crawler import pandas import nest_asyncio # 允许嵌套事件循环,适配Jupyter环境的循环冲突问题 nest_asyncio.apply() # 读取Excel数据(替换为你的实际文件路径) df = pandas.read_excel(r'absoltepath') if __name__ == '__main__': if '--iocp' in sys.argv: from asyncio import events, windows_events sys.argv.remove('--iocp') logging.info('using iocp') el = windows_events.ProactorEventLoop() events.set_event_loop(el) # 循环处理Excel中的每个URL,生成对应站点地图 for index, row in df.iterrows(): target_url = row['data'] crawler(target_url, out_file=f'{index}_sitemap.xml')
3. 关键改动说明
- 修复批量处理逻辑:将
iterrows()循环移入if __name__ == '__main__'代码块,确保每个URL都被单独处理,生成对应索引的站点地图文件。 - 解决循环冲突:通过
nest_asyncio.apply()允许在已有事件循环的环境中启动新循环,完美适配Jupyter运行场景。 - 规范变量命名:将大写的
Url改为小写target_url,符合Python命名习惯,提升代码可读性。
替代方案:命令行运行普通脚本
若无需在Jupyter中执行,直接将代码保存为.py文件,通过命令行运行即可,此时不需要nest_asyncio依赖(普通脚本无预运行的事件循环):
python your_script_name.py
内容的提问来源于stack exchange,提问作者Muhammad Tayyab Shah
相关产品推荐
相关产品推荐

