如何实现分页爬取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
相关产品推荐
相关产品推荐

