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

如何实现分页爬取quotes.toscrape.com多页作者信息并优化代码?

解决方案

核心问题修复与优化

1. 合并作者信息请求函数

原代码中重复请求同一作者页面造成资源浪费,合并为单个函数一次性获取所有所需信息:

def get_author_info(author_url):
    response = requests.get(author_url)
    soup = BeautifulSoup(response.content, 'html.parser')
    dob = soup.find("span", class_="author-born-date").text.strip()
    birth_place = soup.find("span", class_="author-born-location").text.strip()
    return dob, birth_place

2. 实现分页爬取与结果收集

  • 分页逻辑:目标网站分页URL格式为 https://quotes.toscrape.com/page/{page_num}/,直接循环遍历1到10页即可
  • 去重处理:用集合存储已爬取的作者名,避免同一作者重复爬取
  • 结果返回:遍历完成后返回完整的作者信息列表,可直接赋值给变量

完整代码:

import requests
from bs4 import BeautifulSoup

def get_author_info(author_url):
    response = requests.get(author_url)
    soup = BeautifulSoup(response.content, 'html.parser')
    dob = soup.find("span", class_="author-born-date").text.strip()
    birth_place = soup.find("span", class_="author-born-location").text.strip()
    return dob, birth_place

def scrape_all_authors():
    base_url = "https://quotes.toscrape.com"
    authors_data = []
    seen_authors = set()  # 用于去重,存储已爬取的作者名字

    # 遍历10页内容
    for page_num in range(1, 11):
        page_url = f"{base_url}/page/{page_num}/"
        response = requests.get(page_url)
        soup = BeautifulSoup(response.content, 'html.parser')
        
        # 提取当前页所有名言块
        quote_blocks = soup.find_all("div", class_="quote")
        
        for block in quote_blocks:
            author_name = block.find("small", class_="author").text.strip()
            # 去重:如果作者已爬取过,跳过
            if author_name in seen_authors:
                continue
            seen_authors.add(author_name)
            
            # 拼接作者详情页URL
            author_href = block.find("a")["href"]
            author_full_url = f"{base_url}{author_href}"
            
            # 获取作者出生日期和出生地
            dob, birth_place = get_author_info(author_full_url)
            
            # 构造作者信息字典,加入结果列表
            authors_data.append({
                "full_name": author_name,
                "date_of_birth": dob,
                "birth_place": birth_place
            })
    
    return authors_data

# 调用函数并获取结果
all_authors = scrape_all_authors()
# 打印结果示例
for author in all_authors:
    print(author)

关键知识点说明

  • 去重逻辑:使用set存储已爬取的作者名,集合的成员查询效率为O(1),既能避免重复请求,又能提升爬取速度
  • 分页实现:利用网站固定的分页URL规律,通过循环生成目标页面地址;如果不确定总页数,也可以通过解析页面底部的next按钮链接动态判断是否还有下一页
  • 结果返回:scrape_all_authors函数遍历完所有页面后,返回完整的作者信息列表,你可以直接将结果赋值给变量进行后续处理
  • 代码优化:合并重复的HTTP请求,减少网络开销,同时让代码结构更清晰易维护

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 11:25:17