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

Python爬虫多页爬取时URL占位符替换与循环逻辑问题

原代码逻辑错误点
  • 执行顺序错误:未生成分页URL时就调用requests.get(Statement)发起请求,此时Statement是空列表,无法正常发起网络请求
  • 解析逻辑只执行一次:页面解析、标签查找的逻辑写在了循环外,仅会执行一次,无法覆盖所有分页
  • 数据提取和分页请求未绑定:提取<tr>内容的逻辑没有和单页请求流程对应,无法拿到不同分页的实际数据
正确实现代码

核心逻辑是遍历分页参数列表→逐个替换URL占位符生成单页地址→对每个地址单独发起请求、解析DOM、提取数据,参考代码如下:

import requests
from bs4 import BeautifulSoup
import time

URL = "https://www.samplebooks.com/&s={}&1000"
BList = ["28", "9", "10", "14", "6", "13", "30", "29", "1", "24", "27"]
# 补充请求头模拟浏览器访问,降低被反爬拦截的概率
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
}

for param in BList:
    # 替换占位符生成当前分页的完整URL
    current_page_url = URL.format(param)
    # 发起当前页请求
    response = requests.get(current_page_url, headers=headers)
    # 校验请求状态,遇到请求错误直接抛出异常避免后续解析报错
    response.raise_for_status()
    # 解析当前页内容
    soup = BeautifulSoup(response.text, "lxml")
    # 提取当前页所有tr标签
    book_rows = soup.find_all("tr")
    # 遍历输出内容
    for row in book_rows:
        print(row.text.strip())
    # 每页爬取后间隔1秒,避免请求过频被站点封禁
    time.sleep(1)
补充说明
  • URL.format(xxx)的作用就是把传入的参数替换字符串中对应的{}占位符,直接传入列表遍历出的单个参数,就能生成对应分页的合法地址
  • 如果需要留存所有生成的分页URL,也可以先遍历BList批量生成所有URL存入列表,再遍历URL列表逐个发起请求,逻辑和上面的代码一致
  • 正式爬取时建议补充try/except异常捕获逻辑,避免某一页请求失败导致整个爬取任务直接中断

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 00:01:20