讲师中心 微信公众号
AI工具推荐 视频效率加速

如何高效抓取无显式API的万级分页动态表格:异步优化与工程化实践

老丽君_6200

老丽君_6200

发布时间:2026-10-28 09:30:31

|

857人浏览过

|

来源于php中文网

原创

如何高效抓取无显式API的万级分页动态表格:异步优化与工程化实践

本文针对无法通过xhr/js定位json接口的万级分页网站(如哈萨克斯坦动物登记系统),提供基于异步并发、请求批处理与错误韧性设计的高性能爬取方案,显著缩短20,000页×15条数据的采集耗时。

本文针对无法通过xhr/js定位json接口的万级分页网站(如哈萨克斯坦动物登记系统),提供基于异步并发、请求批处理与错误韧性设计的高性能爬取方案,显著缩短20,000页×15条数据的采集耗时。

在实际Web数据采集中,常遇到一类“伪静态”网站:页面HTML由服务端渲染,但关键数据(如表格)不通过独立API返回,也不在初始HTML中明文存在;开发者工具的Network → XHR/Fetch标签下查无有效JSON请求,JS源码中亦无明显的fetch()或axios调用。你正在抓取的 https://www.php.cn/link/283ea714ba84bbb51b605755fe0af8ee 正属此类——它依赖服务端分页生成完整HTML,而非前端动态加载JSON。此时,强行逆向API不可行,必须转向高吞吐HTML解析策略。

✅ 核心优化方向:从串行阻塞到异步并发

你当前的async def scrape_page(...)已迈出关键一步,但若仅用asyncio.gather()逐页提交20,000个协程,仍会因连接池耗尽、DNS阻塞或服务端限流导致性能瓶颈。真正高效的方案需三层协同:

1. 控制并发粒度:使用 aiohttp + 连接池限流

requests 不支持原生异步,应替换为 aiohttp 并配置合理连接池:

import asyncio
import aiohttp
from bs4 import BeautifulSoup
import csv
import logging

BASE_URL = "https://tanba.kezekte.kz/ru/reestr-tanba-public/animal/list?p="

# 全局连接池复用,避免重复创建连接开销
connector = aiohttp.TCPConnector(
    limit=50,           # 同时最多50个连接
    limit_per_host=10,  # 单域名最多10连接(防被封)
    ttl_dns_cache=300,
    keepalive_timeout=30
)

async def fetch_page(session, page):
    url = BASE_URL + str(page)
    try:
        async with session.get(url, timeout=aiohttp.ClientTimeout(total=15)) as resp:
            if resp.status == 200:
                return await resp.text()
            else:
                logging.warning(f"HTTP {resp.status} on page {page}")
                return None
    except Exception as e:
        logging.error(f"Request failed for page {page}: {e}")
        return None

async def scrape_page(session, page):
    html = await fetch_page(session, page)
    if not html:
        return [], None

    soup = BeautifulSoup(html, "html.parser")
    table = soup.find("table", {"id": lambda x: x and x.startswith("guid-")})
    if not table:
        return [], None

    titles = [th.get_text(strip=True) for th in table.find_all("th")]
    rows = table.find_all("tr")[1:]
    data = [
        [td.get_text(strip=True) for td in row.find_all("td")]
        for row in rows
    ]
    return data, titles

2. 批量调度:分块并发 + 进度反馈

避免一次性提交全部20,000任务。按每100页为一个批次,完成一批再启下一批,并写入CSV流式保存:

async def scrape_batch(session, start_page, end_page, writer, lock):
    tasks = [scrape_page(session, p) for p in range(start_page, end_page + 1)]
    results = await asyncio.gather(*tasks, return_exceptions=True)

    for i, (data, titles) in enumerate(results):
        page_num = start_page + i
        if isinstance(data, list) and data and titles:
            async with lock:
                # 写入标题(仅首行)
                if page_num == 1:
                    writer.writerow(titles)
                # 写入数据行
                for row in data:
                    writer.writerow(row)
    logging.info(f"✅ Batch {start_page}-{end_page} completed.")

async def main():
    total_pages = 20_000
    batch_size = 100
    lock = asyncio.Lock()

    async with aiohttp.ClientSession(connector=connector) as session:
        with open("tanba_animals.csv", "w", newline="", encoding="utf-8") as f:
            writer = csv.writer(f)

            # 分批执行
            for start in range(1, total_pages + 1, batch_size):
                end = min(start + batch_size - 1, total_pages)
                await scrape_batch(session, start, end, writer, lock)
                await asyncio.sleep(0.5)  # 批次间轻量休眠,降低服务端压力

    logging.info("? All pages scraped successfully.")

# 启动
if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO)
    asyncio.run(main())

3. 关键增强项(生产必备)

  • User-Agent轮换:添加随机UA头,避免被识别为爬虫;
  • 重试机制:对失败请求自动重试2次(aiohttp.RetryClient);
  • 代理池集成:当遭遇IP封锁时,可无缝接入付费/自建HTTP代理;
  • 结果校验:每批次校验记录数是否恒为15(异常缺失时告警);
  • 断点续爬:记录最后成功页码至文件,崩溃后从中断处恢复。

⚠️ 法律与伦理提醒:该站点为哈萨克斯坦政府公开数据平台(.kz域),请务必检查其 /robots.txt(当前返回404,但需人工确认)及页面页脚版权说明;建议添加 headers={"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36"} 并将请求间隔控制在 ≥1秒/页(本方案通过连接池+批次休眠已满足)。

综上,放弃寻找不存在的“隐藏API”,转而以工程化思维构建健壮、可监控、可伸缩的异步爬取流水线,才是应对万级静态分页网站的最优解。Scrapy虽更成熟,但对单目标、强定制化场景,纯aiohttp+BeautifulSoup组合更轻量、调试更直观,且性能差距在合理配置下可忽略。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
免费爬虫工具有哪些
免费爬虫工具有哪些

免费爬虫工具有Scrapy、Beautiful Soup、ParseHub、Octoparse、Webocton Scriptly、RoboBrowser和Goutte。更多关于免费爬虫工具的问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

5273

2023.11.10

Python爬虫获取数据的方法
Python爬虫获取数据的方法

Python爬虫可以通过请求库发送HTTP请求、解析库解析HTML、正则表达式提取数据,或使用数据抓取框架来获取数据。更多关于Python爬虫相关知识。详情阅读本专题下面的文章。php中文网欢迎大家前来学习。

693

2023.11.13

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

20

2026.10.28

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

0

2026.10.28

Vite 项目目录怎么看
Vite 项目目录怎么看

Vite项目目录专题汇集入口文件、src源码、public静态资源、路径别名、项目根目录和构建输出目录相关的已审核文章,帮助读者理解各文件夹的用途与引用方式。

0

2026.10.28

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

120

2026.10.22

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

60

2026.10.22

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

60

2026.10.22

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

40

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn