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

Python BeautifulSoup爬虫分页获取不完整下一页URL问题

分页逻辑修复方案

你的现有代码存在两个核心问题导致分页失效:

  • 页面请求逻辑写在了while循环外部,循环过程中始终读取分类第一页的内容,不会发起新的分页请求
  • 硬编码字符串替换的方式处理路径,无法适配不同分类下分页链接的相对路径层级,容易生成错误的URL

使用Python标准库urllib.parse中的urljoin方法可以完美解决路径拼接问题,不需要手动处理不同分类的基础URL差异,它会自动根据当前页面地址补全相对路径。


修正后完整代码
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin  # 导入标准库路径拼接工具

site_root = 'http://books.toscrape.com'
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
}
r = requests.get(site_root, headers=headers)
soup = BeautifulSoup(r.text, "html.parser")

# 获取全部分类链接
category_links = []
nav_list = soup.find("ul", class_="nav nav-list")
for a_tag in nav_list.find_all('a', href=True):
    # 直接用urljoin拼分类的绝对路径,不用手动替换字符串
    full_category_url = urljoin(site_root, a_tag['href'])
    category_links.append(full_category_url)
# 去掉第一个"全部书籍"的根分类链接
category_links = category_links[1:]

all_book_links = []

for category_url in category_links:
    print(f"开始爬取分类: {category_url}")
    current_page_url = category_url
    while True:
        # 每次循环都请求当前分页地址
        resp = requests.get(current_page_url, headers=headers)
        resp.encoding = "utf-8"
        page_soup = BeautifulSoup(resp.text, "html.parser")
        
        # 提取当前页所有书籍链接
        book_items = page_soup.find_all(class_="product_pod")
        for product in book_items:
            book_href = product.find('a')['href']
            # 同样用urljoin拼书籍详情页绝对地址,不用手动替换../../
            full_book_url = urljoin(current_page_url, book_href)
            all_book_links.append(full_book_url)
            print(f"获取书籍链接: {full_book_url}")
        
        # 判断是否存在下一页
        next_btn = page_soup.find('li', class_='next')
        if not next_btn:
            print(f"当前分类爬取完成,累计获取{len(all_book_links)}本书籍链接")
            break
        # 拼接下一页的完整URL
        next_page_href = next_btn.find('a')['href']
        current_page_url = urljoin(current_page_url, next_page_href)
        print(f"进入下一页: {current_page_url}")

关键逻辑说明
  • urljoin(base_url, relative_url) 会自动识别base_url的路径层级,不管相对路径是page-2.html还是../../page-2.html,都能正确拼接成可访问的绝对地址,完全不需要手动处理不同分类的基础URL差异
  • 把页面请求、soup初始化的逻辑放在while循环内部,每一轮循环都会请求新的分页地址,不会重复爬取同一页内容
  • 每一页的书籍链接、下一页链接都基于当前分页的URL做拼接,不会出现路径层级错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 17:51:23