You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何加速Python中pandas.read_html的网页表格爬取效率?

高效爬取多页表格的优化方案

1. 改用并行请求处理

串行请求是最大的效率瓶颈,你可以用concurrent.futures.ThreadPoolExecutor实现并行爬取,同时控制并发数(比如10-20个线程,根据服务器承受能力调整),同时处理多个页面能大幅缩短总耗时。

示例代码:

import pandas as pd
import time
import numpy as np
from concurrent.futures import ThreadPoolExecutor

def fetch_table(url):
    time.sleep(np.random.randint(5,10))  # 保留延迟避免触发反爬
    tables = pd.read_html(url)
    return tables[0]

urls = [list of urls]
table_list = []

# 控制并发数,建议先从小数值测试
with ThreadPoolExecutor(max_workers=10) as executor:
    for table in executor.map(fetch_table, urls):
        table_list.append(table)

# 最后一次性合并所有表格
table_df = pd.concat(table_list, axis=0, ignore_index=True)

2. 优化DataFrame合并逻辑

当前每次循环都用pd.concat合并,会反复创建新的DataFrame,内存和时间开销极大。改成先把所有子DataFrame存入列表,最后一次性合并,能显著提升效率。

3. 复用HTTP会话减少连接开销

pandas.read_html默认的HTTP客户端每次请求都会新建连接,你可以先用requests.Session()建立会话,复用连接减少TCP握手的时间消耗:

import requests

session = requests.Session()

def fetch_table(url):
    time.sleep(np.random.randint(5,10))
    response = session.get(url)
    tables = pd.read_html(response.text)
    return tables[0]

4. 合理调整延迟策略

如果服务器反爬限制不严格,可以适当缩小延迟范围(比如np.random.randint(2,5)),但一旦出现429、5xx等错误,立刻调大延迟,避免被封禁。

5. 添加错误重试机制

爬取大量页面难免遇到请求失败,添加重试逻辑能避免程序中途中断:

from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

session = requests.Session()
# 设置重试策略:重试3次,针对常见的连接/服务器错误
retry_strategy = Retry(
    total=3,
    backoff_factor=1,
    status_forcelist=[429, 500, 502, 503, 504]
)
adapter = HTTPAdapter(max_retries=retry_strategy)
session.mount("https://", adapter)
session.mount("http://", adapter)

内容的提问来源于stack exchange,提问作者RajendraW

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 06:36:35