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

如何用BeautifulSoup迭代爬取古登堡网站全页作者与书名数据

实现古腾堡全书作者与作品标题的全页爬取

要搞定爬取这个网站所有分页的书籍数据,核心是自动识别分页规则并循环请求直到最后一页,我来给你拆解怎么改原代码:

先搞懂分页逻辑

你看这个网站的分页是靠start_index参数控制的:

  • 第一页默认是start_index=0(或者URL不带这个参数)
  • 第二页是start_index=26,第三页start_index=52……每页固定展示26条结果
  • 当请求的页面里找不到书籍数据时,就说明已经到最后一页了

原代码的小问题

原代码每次循环都会重新初始化article_title和article_author列表,最后只能保留最后一页的数据,得把这两个列表的初始化放到循环外面,每次循环往里面追加数据才行。

改进后的完整代码

import requests
from bs4 import BeautifulSoup
import pandas as pd

# 初始化存储所有数据的列表,放在循环外面!
all_titles = []
all_authors = []
start_index = 0
base_url = "http://www.gutenberg.org/ebooks/search/?sort_order=title&start_index={}"

while True:
    # 拼接当前页的URL
    current_url = base_url.format(start_index)
    page = requests.get(current_url)
    soup = BeautifulSoup(page.content, 'html.parser')
    
    # 提取当前页的标题和作者
    soup_titles = soup.find_all("span", class_="title")
    soup_authors = soup.find_all("span", class_="subtitle")
    
    # 如果当前页没有数据,说明到最后一页了,终止循环
    if not soup_titles:
        break
    
    # 把当前页的数据追加到总列表里
    for title, author in zip(soup_titles, soup_authors):
        all_titles.append(title.text.strip())
        all_authors.append(author.text.strip())
    
    # 更新起始索引,准备请求下一页
    start_index += 26
    print(f"已爬取第{(start_index//26)}页,累计{len(all_titles)}条数据")

# 把所有数据转换成DataFrame
df = pd.DataFrame({
    'Article_Title': all_titles,
    'Article_Author': all_authors
})

# 查看结果
print(df.head())
print(f"爬取完成,共获取{len(df)}条书籍数据")

关键改动说明

  • 用while True循环来持续请求页面,直到没有数据为止
  • 用base_url模板拼接带start_index的URL,不用手动写多个URL
  • 把数据列表放在循环外,每次循环追加数据,保证所有页的数据都被保存
  • 每次循环后检查是否有标题数据,没有就跳出循环,避免无效请求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:20:23