如何通过多线程处理URL列表 加速waybackpy获取Wayback Machine归档链接
优化后的waybackpy多线程获取归档地址方案
以下是可直接运行的修正代码:
import waybackpy import concurrent.futures # 自定义User-Agent,Wayback Machine要求必须提供合法UA,可按实际使用场景修改 USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" url_list = ["https://www.google.com", "https://www.facebook.com", "https://www.wikipedia.com", "https://www.walmart.com/", "https://www.ebay.com/", "https://www.amazon.com"] # 单条URL的处理逻辑,作为最小任务单元分配给线程 def get_single_archive_url(url): try: target_url = waybackpy.Url(url, USER_AGENT) newest_archive = target_url.newest() # 返回元组区分正常结果和错误,方便后续分类处理 return (url, str(newest_archive), "success") except Exception as e: return (url, None, f"error: {str(e)}") if __name__ == "__main__": archive_url_list = [] # max_workers设置并发线程数,IO密集型任务可设为2-10,根据自身网络情况调整 with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor: # map方法自动将url_list中的每个url分配给空闲线程,不需要手动拆分列表 results = executor.map(get_single_archive_url, url_list) # 统一处理所有返回结果 for res in results: archive_url_list.append(res) if res[2] == "success": print(f"{res[0]} 归档地址:{res[1]}") else: print(f"{res[0]} 获取失败:{res[2]}") print("所有任务处理完成")
核心调整说明
- 修正任务分配逻辑:原代码将整个URL列表遍历逻辑作为单个任务提交给线程,本质还是单线程运行。现在将单条URL的归档查询逻辑封装为独立函数,
ThreadPoolExecutor的map方法会自动遍历URL列表,把每个URL分配给空闲线程执行,不需要手动拆分列表,自动实现并发。 - 修复缺失依赖与变量:补全
concurrent.futures导入,定义合法的User-Agent(Wayback Machine会拦截无合法UA的请求),规避全局变量的线程安全问题。 - 优化异常处理:单条URL请求失败时仅返回错误标记,不会中断其他URL的处理,也不会导致线程提前退出。
内容的提问来源于stack exchange,提问作者Lee Roy
相关产品推荐
相关产品推荐

