如何实现从URL列表循环抓取HTML并提取归档数据?
批量遍历URL列表执行水文数据提取的解决方案
核心思路
把你已有的单日期提取逻辑封装成可复用的函数,然后循环遍历URL列表逐个调用函数处理,同时做好异常捕获和CSV数据的追加写入,避免单个任务失败导致整个流程中断。
具体实现步骤
1. 封装单页面提取逻辑为函数
假设你原有的代码是Python实现,将单URL处理逻辑封装成函数,示例如下:
import requests from bs4 import BeautifulSoup import csv def extract_and_save(url, csv_path): # 替换成你实际的页面请求与解析代码 resp = requests.get(url) soup = BeautifulSoup(resp.text, "html.parser") # 提取水温、流量、日期等字段(替换为你实际的选择器逻辑) date = soup.select_one(".archive-date").text.strip() water_temp = soup.select_one(".water-temp-value").text.strip() discharge = soup.select_one(".flow-value").text.strip() # 追加写入CSV with open(csv_path, "a", newline="", encoding="utf-8") as f: writer = csv.writer(f) writer.writerow([date, water_temp, discharge])
2. 循环遍历URL列表执行批量处理
假设你的目标URL列表已存储在target_urls变量中,直接通过for循环遍历执行:
# 已生成的2017-11-01至2023-10-26的归档URL列表 target_urls = [ "https://your-domain.com/archive/20171101", "https://your-domain.com/archive/20171102", # ... 剩余URL ] # 目标CSV文件路径 output_csv = "hydrology_total_data.csv" # 先写入CSV表头(仅执行一次) with open(output_csv, "w", newline="", encoding="utf-8") as f: csv.writer(f).writerow(["日期", "水温", "流量"]) # 批量处理每个URL for index, url in enumerate(target_urls, 1): print(f"正在处理第{index}条数据:{url}") try: extract_and_save(url, output_csv) except Exception as e: # 捕获异常并记录,避免循环中断 print(f"处理失败:{url} - {str(e)}") with open("error_log.txt", "a", encoding="utf-8") as log: log.write(f"{url}: {str(e)}\n")
3. 关键注意事项
- CSV写入模式:用
"a"追加模式写入数据,表头单独用"w"模式初始化,避免每次覆盖已有数据。 - 异常处理:网络请求、页面结构变动都可能导致报错,通过
try-except捕获异常,同时记录错误URL和原因,方便后续补爬。 - 反爬规避:如果目标网站有频率限制,可在每次请求后添加
time.sleep(1)之类的延迟,避免被封禁IP。 - 数据去重:如果URL列表存在重复项,可先通过
list(set(target_urls))去重,或者在写入时判断当前日期数据是否已存在。
其他语言适配思路
如果你的代码不是Python,核心逻辑一致:
- 将单页面提取逻辑封装为可调用的方法/函数。
- 遍历URL数组,逐个调用方法。
- 处理好输出文件的追加写入和异常捕获。
内容的提问来源于stack exchange,提问作者slippysnorlax
相关产品推荐
相关产品推荐

