使用Selenium爬取YouTube:封装函数后无法存储爬取结果
排查Selenium爬虫封装函数后数据无法保存的常见原因
函数未返回爬取结果
单独运行时数据能正常保存,大概率是你在函数内部完成了爬取,但没把结果return出来。比如单独运行时直接将数据写入文件或存在变量里,封装函数后如果不返回数据,外部代码根本拿不到爬取结果,自然无法保存。
示例修正:def crawl_youtube_channel(): # 此处编写Selenium爬取逻辑 data = {"channel_id": "xxx", "sub_count": "100w", "videos": [{"title": "xxx", "views": "10w"}]} return data # 必须返回爬取到的数据 # 调用函数并保存结果 result = crawl_youtube_channel() with open("channel_data.json", "w", encoding="utf-8") as f: json.dump(result, f, ensure_ascii=False)局部变量与全局变量混淆
如果你原本用全局变量存储数据,但在函数里没有声明global关键字,函数会创建同名的局部变量,外部的全局变量根本不会被修改。比如:channel_data = {} def crawl(): # 未声明global,此处是局部变量,外部的channel_data不会被赋值 channel_data["channel_id"] = "xxx"修正:要么在函数开头添加
global channel_data,要么改成返回数据的形式(更推荐,避免全局变量带来的副作用)。异常被静默忽略
封装函数后可能触发了异常,但你没有添加异常捕获逻辑,导致程序直接崩溃却没给出提示,看起来像是“数据没保存”。比如页面加载超时、元素定位失败,单独运行时可能刚好没遇到这类问题,封装后执行环境或顺序变化触发了异常。
解决:在函数内添加异常捕获并打印错误信息:def crawl_youtube_channel(): try: # Selenium爬取逻辑 ... return data except Exception as e: print(f"爬取过程出错: {str(e)}") return None文件路径问题
单独运行时文件会保存在当前脚本所在目录,但封装函数后如果被其他模块调用,当前工作目录可能发生变化,导致文件被写到了你找不到的路径下。
解决:使用绝对路径保存文件:import os # 获取当前脚本所在目录的绝对路径 save_dir = os.path.dirname(os.path.abspath(__file__)) save_path = os.path.join(save_dir, "channel_data.json") with open(save_path, "w", encoding="utf-8") as f: json.dump(data, f, ensure_ascii=False)Selenium会话未正确清理
封装函数后如果没有关闭浏览器会话,可能导致内存泄漏或后续操作阻塞,数据还没完成写入就被卡住。要确保函数结束时关闭会话,并且放在finally块中,避免异常时未执行清理:def crawl_youtube_channel(): driver = None try: driver = webdriver.Chrome() # Selenium爬取逻辑 ... return data finally: if driver: driver.quit() # 确保浏览器会话被关闭
内容的提问来源于stack exchange,提问作者sickboy83
相关产品推荐
相关产品推荐

