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
相关产品推荐
相关产品推荐

