如何用Pandas并行检测网站存活状态?
并行检测DataFrame中网站存活状态的优化方案
方案一:使用Pandarallel实现并行Apply(优先推荐)
Pandarallel是专为Pandas设计的并行化工具,直接替换原生apply即可实现多核并行,完全符合你偏好的apply类实现方式,上手简单。
步骤:
- 安装依赖库
pip install pandarallel
- 修改后的完整代码
import pandas as pd import requests import urllib3 from pandarallel import pandarallel # 禁用SSL证书验证警告,避免控制台输出冗余信息 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) # 初始化并行模块,指定使用全部8核CPU,开启进度条便于观察 pandarallel.initialize(nb_workers=8, progress_bar=True) # 加载网站数据到DataFrame siteList = [['1','https://www.facebook.com'],[2,'https://www.instagram.com'], [3,'https://www.mail.com'],[4,'https://www.thegrumpyscarecrow.com/']] df = pd.DataFrame(siteList, columns=['id','site']) # 网站存活状态检测函数 def getStatusCode(url): try: # 使用HEAD请求仅获取响应头,比GET请求更高效,减少数据传输量 r = requests.head(url, verify=False, timeout=5) return r.status_code except Exception: # 捕获所有异常(超时、连接失败等),返回-1标记网站不可达 return -1 # 并行执行检测,替换原生apply为parallel_apply df['status'] = df['site'].parallel_apply(getStatusCode) print(df)
方案二:使用Multiprocessing标准库实现并行
如果不想安装第三方库,可直接用Python内置的multiprocessing模块手动实现并行处理:
import pandas as pd import requests import urllib3 from multiprocessing import Pool, cpu_count # 禁用SSL证书验证警告 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) # 加载网站数据到DataFrame siteList = [['1','https://www.facebook.com'],[2,'https://www.instagram.com'], [3,'https://www.mail.com'],[4,'https://www.thegrumpyscarecrow.com/']] df = pd.DataFrame(siteList, columns=['id','site']) # 网站存活状态检测函数 def getStatusCode(url): try: r = requests.head(url, verify=False, timeout=5) return r.status_code except Exception: return -1 if __name__ == '__main__': # 创建进程池,自动匹配CPU核心数(你的机器为8核) with Pool(cpu_count()) as pool: # 批量处理所有网站URL,返回结果列表后赋值给DataFrame status_results = pool.map(getStatusCode, df['site'].tolist()) df['status'] = status_results print(df)
关键优化点说明
- 坚持使用
requests.head():仅获取响应头,避免下载页面内容,大幅提升检测速度 - 固定5秒超时:防止单个无响应网站拖慢整体进度
- 多核并行:8核CPU同时处理任务,100个网站的理论耗时可控制在15秒以内,完全满足30秒以内的要求
内容的提问来源于stack exchange,提问作者Dimbo1979
相关产品推荐
相关产品推荐

