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

