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

