如何加速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
相关产品推荐
相关产品推荐

