我的知识记录

Python requests爬取分页数据:循环翻页与停止条件

讲解用requests循环抓取多页列表数据,自动识别下一页按钮或页码参数,遇到空数据自动停止,适合文章列表、商品列表、搜索结果分页抓取。

场景痛点

搜索结果、文章列表、商品页都是一页10条,要拿全量数据就得翻几十上百页。手动翻页复制太累,写脚本要解决两个问题:怎么自动翻到下一页,怎么知道什么时候到头了。本文用页码参数循环加空数据判断,是最通用的分页抓取模式。

用到的库

pip install requests beautifulsoup4 lxml

完整代码

# 导入库
import csv
import time
import requests
from bs4 import BeautifulSoup

HEADERS = {
"User-Agent": ("Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 Chrome/124.0.0.0 Safari/537.36"),
}

def scrape_page(page_num):
"""抓单页数据,返回本页条目列表"""
# 假设目标网站URL格式是 https://example.com/articles?page=N
# 这里用httpbin模拟,实际项目换成真实网址
url = "https://httpbin.org/json"
params = {"page": page_num}

resp = requests.get(url, headers=HEADERS, params=params, timeout=10)
resp.encoding = resp.apparent_encoding

soup = BeautifulSoup(resp.text, "lxml")

# 假设每条数据在 div.item 里
items = soup.select("div.item")

results = []
for item in items:
title_tag = item.select_one("h2")
link_tag = item.select_one("a")
title = title_tag.get_text(strip=True) if title_tag else ""
link = link_tag["href"] if link_tag else ""
results.append({"page": page_num, "title": title, "link": link})

return results

def scrape_all(max_pages=10):
"""循环翻页抓取,直到没有数据或达到最大页数"""
all_items = []
for page in range(1, max_pages + 1):
print(f"正在抓第 {page} 页...")
items = scrape_page(page)
print(f"  本页 {len(items)} 条")

# 停止条件1:本页没数据了,说明到底了
if not items:
print("没有更多数据,停止")
break

all_items.extend(items)

# 礼貌抓取:每页间隔1秒
time.sleep(1)

return all_items

def save_csv(items, filename="paged_data.csv"):
with open(filename, "w", newline="", encoding="utf-8-sig") as f:
writer = csv.DictWriter(f, fieldnames=["page", "title", "link"])
writer.writeheader()
writer.writerows(items)
print(f"共 {len(items)} 条,已保存到 {filename}")

if __name__ == "__main__":
data = scrape_all(max_pages=5)
save_csv(data)

代码讲解

  • scrape_page(page_num) 封装单页抓取,把页码作为参数拼到URL里,每页返回本页解析出的条目列表。
  • scrape_allfor 循环从第1页开始翻,每页抓到的条目追加到总列表里。
  • 停止条件有两个:本页返回0条数据说明翻到底了,或者达到 max_pages 上限防止意外死循环。
  • time.sleep(1) 每页之间停1秒,是基本的抓取礼貌,既不容易被封,也不会把对方服务器压垮。
  • 实际项目中如果分页是"下一页"按钮而不是页码,就解析当前页的"下一页"链接,拿到新URL继续请求,直到找不到下一页。

运行结果

运行后控制台打印每一页的进度和条目数,当前目录生成 paged_data.csv。示例用httpbin不会真返回列表数据,所以会立刻因为"本页0条"停止;换成真实目标网站后就能看到逐页抓取的过程。

注意事项

  • 翻页前先在浏览器里翻几页,确认URL规律:是 ?page=2/page/2/ 还是别的形式。
  • 有些网站分页是POST请求或者带签名,光靠改page参数没用,要先抓包看请求。
  • 停止条件要设计好,否则遇到"空页也返回上一页数据"的网站会死循环。
  • 抓取过程中要存断点,跑了50页突然断了能从第51页继续,不用从头来。

Python requests爬取分页数据:循环翻页与停止条件

标签:

更新时间:2026-09-14 20:48:23

上一篇:Python requests POST提交表单教程:登录与数据提交示例

下一篇:Python requests处理JSON接口返回:字典取值与解析示例