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

Python如何实现多页循环遍历爬取网页表格数据

无数字页码站点多页表格爬取方案

你已经确认站点翻页逻辑为URL末尾拼接&pageno=页码参数,不需要模拟点击下一页按钮,直接通过循环构造分页URL、判断页面有效内容作为终止条件即可完成全量数据爬取,修正后的可运行代码如下:

import requests
import csv
import time
from bs4 import BeautifulSoup

headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'}
base_url = 'https://www.revcomps.com/past-entry-lists/?draw_chosen=2693823'
# 初始化存储所有数据的列表,第一行存表头
all_data = []
page = 1

while True:
    print(f"正在爬取第{page}页...")
    # 构造当前分页URL
    current_url = f"{base_url}&pageno={page}"
    r = requests.get(current_url, headers=headers)
    soup = BeautifulSoup(r.text, 'html.parser')
    # 查找当前页的目标表格
    table = soup.find('table', {'class':'ticket_results'})
    
    # 找不到表格说明已经爬到最后一页之后,终止循环
    if not table:
        print(f"第{page}页无有效表格数据,爬取结束,共爬取{page-1}页数据")
        break
    
    # 第一页的时候提取表头
    if page == 1:
        headers_row = [th.text.strip() for th in table.find_all('th')]
        all_data.append(headers_row)
    
    # 提取当前页所有表格行数据
    for tr in table.find_all('tr')[1:]:  # 跳过表头行
        row_data = [td.text.strip() for td in tr.find_all('td')]
        # 过滤空行
        if row_data:
            all_data.append(row_data)
    
    # 页码+1,加延时避免请求过快被封
    page += 1
    time.sleep(1.5)

# 所有数据存入csv
with open('revcomps_data.csv', 'w', newline='', encoding='utf-8') as f:
    writer = csv.writer(f)
    writer.writerows(all_data)
print(f"数据已全部存入revcomps_data.csv,共{len(all_data)-1}条有效记录")

核心逻辑说明

  • 分页构造:统一按照站点规则在基础URL后拼接&pageno=页码参数,第一页对应pageno=1,和站点原生翻页逻辑完全一致,不需要额外模拟按钮点击
  • 终止判断:不需要提前获取总页数,每次请求后判断当前页是否存在目标class的表格,无有效表格时直接终止循环,完美适配无数字页码的站点场景
  • 反爬规避:每次请求间隔1.5秒,使用常规浏览器UA,避免短时间高频请求触发站点拦截
  • 数据结构化:按表格行提取数据,自动提取表头、过滤空行,最终直接输出可直接使用的结构化CSV文件,解决原代码中所有单元格数据混在同一列表的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 00:03:20