BS4 Web Scraping:多页动态网站爬取加标识列合并数据的代码优化咨询
现有BS4爬虫的批量爬取改造方案
核心改造方向
保留原有已验证可正常运行的单页爬取逻辑,抽离循环内的重复冗余配置,新增ID与名称的关联映射,实现逐页数据自动打名称标签、多页爬取结果自动合并,省去后续手动匹配、拼接零散数据的步骤。
具体改造步骤
1. 抽离全局公共配置
把原来嵌套在循环内部的重复初始化逻辑提前到全局定义区,减少循环内的重复运算:
- 提前定义ID与对应名称的映射字典,替代零散的硬编码对应关系
- 固化公共请求参数,包括基础爬取URL、固定携带的请求cookies、目标匹配的表格类名
import pandas as pd import requests # 全局公共配置 BASE_SCRAPE_URL = "https://racing.hkjc.com/racing/information/English/Trackwork/TrackworkResult.aspx?HorseId=" TARGET_TABLE_CLASS = "table_bd f_tal f_fs13" # 替换为你已有的有效请求cookies,和单页爬取时使用的cookies保持一致 REQUEST_COOKIES = {} # ID与名称的固定映射关系 ID_NAME_MAPPING = { "HK_2019_D105": "Name1", "HK_2018_C509": "Name2" }
2. 优化循环爬取逻辑
去掉原有循环内部重复定义main函数的冗余写法,逐页完成请求、表格解析后,直接给当前页的全量数据打上对应名称标签,存入临时结果池:
- 初始化空列表,用来暂存每一页处理完成的DataFrame
- 遍历映射关系中的每一组ID与名称,逐页发起请求、解析目标表格
# 暂存所有页面的爬取结果 scrape_result_pool = [] for target_id, target_name in ID_NAME_MAPPING.items(): # 拼接当前ID对应的完整请求地址 full_request_url = f"{BASE_SCRAPE_URL}{target_id}" # 携带固定cookies发起POST请求 response = requests.post(full_request_url, cookies=REQUEST_COOKIES) # 按照指定类名匹配解析页面内的目标表格,和原有单页解析逻辑保持一致 page_tables = pd.read_html( response.text, attrs={"class": TARGET_TABLE_CLASS} ) # 合并当前页解析到的所有表格块,保留原有Date、Type、Racecourse/Track、Workouts、Gear列 page_df = pd.concat(page_tables, ignore_index=True) # 给当前页所有行新增Name标识列,写入映射对应的名称值 page_df["Name"] = target_name # 将处理完成的当前页数据加入结果池 scrape_result_pool.append(page_df) # 若需要保留原有单页存储为单独csv的逻辑,可在此处添加逐页保存代码,不影响最终总表生成
3. 整合生成统一总DataFrame
所有页面循环爬取完成后,将结果池内的所有分块数据合并为单个统一的DataFrame:
# 合并全量爬取数据为单个总表,重置索引避免重复 final_merged_df = pd.concat(scrape_result_pool, ignore_index=True) # 可按需将总表导出为单个csv文件 # final_merged_df.to_csv("all_scraped_trackwork_data.csv", index=False, encoding="utf-8-sig")
改造后效果
- 所有爬取行都会自动附带对应条目的Name标识,无需后续手动匹配关联不同ID的来源
- 多页爬取结果自动整合为单个DataFrame,省去手动拼接多份单页数据的操作
- 移除了循环内重复定义函数、重复初始化请求参数的冗余逻辑,整体运行效率更高
注意:如果爬取时遇到请求拦截,可在请求参数中补充和单页爬取时一致的浏览器请求头即可,不需要调整现有表格解析逻辑。
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

