如何让调用WGET的下载函数执行完毕后再启动解析函数?
解决方案
问题出在你用START /B启动wget时,会让wget在后台独立进程运行,Python的os.system会立即返回,导致download_html()函数看似执行完成,实际所有wget还在后台下载,这时调用parse()自然只能解析到已下载的少量文件。
有两种可靠的解决方式,无需手动设置等待时间:
方式一:串行同步下载(简单直接)
去掉START /B参数,让每个wget命令在当前进程中同步执行,只有当一个wget完成所有下载后,才会执行下一个。这样整个download_html()函数会在所有下载完成后才结束,之后再调用parse()就没问题了。
修改后的download_html函数:
def download_html(): for i in range(20): # 移除START /B,让wget同步执行 os.system(f'wget --compression=gzip -P C:/Users/T/data/data_html -i C:/Users/T/data/data_txt/urls{i}.txt')
方式二:并行下载+等待所有进程完成(效率更高)
如果想保持多进程并行下载提升速度,可以用subprocess模块管理所有wget进程,等待所有进程执行完毕后再继续后续代码。
修改后的代码(需要先导入subprocess):
import subprocess def download_html(): # 存储所有wget进程对象 running_procs = [] for i in range(20): cmd = f'wget --compression=gzip -P C:/Users/T/data/data_html -i C:/Users/T/data/data_txt/urls{i}.txt' # 启动后台进程并记录 proc = subprocess.Popen(cmd, shell=True) running_procs.append(proc) # 等待所有wget进程完成 for proc in running_procs: proc.wait()
额外优化建议
原代码中创建文件夹的逻辑如果遇到文件夹已存在会报错,建议改用os.makedirs并添加exist_ok=True参数,避免重复创建时抛出异常:
def cr_fol_data_txt(): os.makedirs('C:/Users/T/data/data_txt', exist_ok=True) def cr_fold_data_html(): os.makedirs('C:/Users/T/data/data_html', exist_ok=True)
内容的提问来源于stack exchange,提问作者Platothecynic
相关产品推荐
相关产品推荐

