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

Python多线程改造意大利族谱网站百万级页面爬虫提速方案求助

族谱站点爬虫多线程改造方案

针对IO密集型的网页爬取场景,用多线程改造后效率会有明显提升,改造后的代码如下,核心做了线程安全、异常兼容、冗余请求优化的处理:

import requests
import tabula
import pandas as pd
from concurrent.futures import ThreadPoolExecutor
import traceback

# 配置项
FIRST_PAGE = 16999
LAST_PAGE = 17500
# 线程数建议先设10-20,根据站点响应情况调整,不要开太高避免被封或者打崩站点
MAX_WORKERS = 10
# 统一请求头,模拟正常访问降低被封概率
HEADERS = {
    "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"
}

def process_page(page_id):
    """单页处理逻辑,每个线程独立处理一个页面ID,返回处理好的DataFrame或None"""
    pdf_url = f'https://www.natitrentino.mondotrentino.net/natiintrentino/viewprint/{page_id}'
    try:
        # 直接请求PDF,跳过多余的HEAD请求,节省一次网络交互
        resp = requests.get(pdf_url, headers=HEADERS, timeout=10)
        if resp.status_code != 200:
            print(f"页面{page_id}不可访问,跳过")
            return None
        
        # 保留原有的PDF解析逻辑
        y1 = 89.45
        x1 = 25.8
        y2 = y1 + 193.199
        x2 = x1 + 447
        dfs = tabula.read_pdf(pdf_url, stream=True, pages=1, area=(y1,x1,y2,x2), guess=False)
        intermediate = dfs[0].set_index("Cognome").T
        intermediate['URL'] = pdf_url
        print(f"页面{page_id}处理完成")
        return intermediate
    except Exception as e:
        print(f"页面{page_id}处理失败,错误信息:{str(e)}")
        traceback.print_exc()
        return None

if __name__ == "__main__":
    # 生成所有需要爬取的页面ID列表
    page_ids = list(range(FIRST_PAGE, LAST_PAGE))
    result_list = []

    # 启动多线程处理
    with ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor:
        # 所有页面提交到线程池调度
        results = executor.map(process_page, page_ids)
    
    # 收集所有非空的处理结果,合并成总表
    for res in results:
        if res is not None:
            result_list.append(res)
    
    general = pd.concat(result_list, ignore_index=True)
    print(general)
    # 建议爬取完成后直接存文件,避免数据丢失
    general.to_csv("族谱数据.csv", index=False, encoding='utf-8-sig')

关键改动说明

  • 把单页处理逻辑抽成独立函数,每个线程处理一个页面,互相不干扰,避免了全局DataFrame操作的线程安全问题
  • 去掉了冗余的HEAD请求,直接请求PDF资源判断可用性,单次爬取节省一次网络请求,整体效率提升明显
  • 新增了超时设置和异常捕获,单个页面爬取失败不会中断整个爬取任务
  • 所有页面处理完成后统一合并结果,比原有的逐行append效率更高,尤其适合130万级的大数据量场景

额外注意事项

  • 线程数不要盲目调大,先从10开始测试,观察站点的响应速度和反爬策略,再逐步调整到合适的值
  • 如果要爬全量130万条数据,建议增加断点续爬逻辑,每爬完1000页就存一次中间结果,避免程序崩溃丢失已爬数据
  • 爬取过程中尽量避开站点的访问高峰,遵守站点的爬取规则,不要影响站点的正常服务

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 18:54:05