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_all用for循环从第1页开始翻,每页抓到的条目追加到总列表里。- 停止条件有两个:本页返回0条数据说明翻到底了,或者达到
max_pages上限防止意外死循环。 time.sleep(1)每页之间停1秒,是基本的抓取礼貌,既不容易被封,也不会把对方服务器压垮。- 实际项目中如果分页是"下一页"按钮而不是页码,就解析当前页的"下一页"链接,拿到新URL继续请求,直到找不到下一页。
运行结果
运行后控制台打印每一页的进度和条目数,当前目录生成 paged_data.csv。示例用httpbin不会真返回列表数据,所以会立刻因为"本页0条"停止;换成真实目标网站后就能看到逐页抓取的过程。
注意事项
- 翻页前先在浏览器里翻几页,确认URL规律:是
?page=2、/page/2/还是别的形式。 - 有些网站分页是POST请求或者带签名,光靠改page参数没用,要先抓包看请求。
- 停止条件要设计好,否则遇到"空页也返回上一页数据"的网站会死循环。
- 抓取过程中要存断点,跑了50页突然断了能从第51页继续,不用从头来。

更新时间:2026-09-14 20:48:23
上一篇:Python requests POST提交表单教程:登录与数据提交示例