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
相关产品推荐
相关产品推荐

